본문 바로가기

프로그래밍/JAVA

상속과 다형성

상속의 이해

상속을 이요하여 설계할 때는 공통적인 코드를 어떤 클래스에 넣은 다음, 다른 더 더 구체적인 클래스에 공적톡적(더 추상적인) 클래스가 상위클래스라는 것을 알려주면됩니다 한 클래스가 다른 클래스를 상속하는 것을 하위클래스가 상위클래스로부터 상속 받는다고 말합니다.

자바에서 하위 클래스가 상위클래스를 확장(extend)한다고 얘기합니다. 상속이라는 관계는 하위클래스가 상위 클래스의 맴버를 물려받는다는 것을 의미합니다. 인스턴스 변수와 메소드"클래스맴버"라고 부릅니다.


핵심정리

  • 하위클래스는 상위클래스를 확장합니다.
  • 하위클래스는 상위클래스에 있는 모든 public으로 지정한 인스턴스 변수와 메소드는 상속하지 않습니다.
  • 메소드는 오버라이드할 수 있지만 인스턴스 변수는 오버라이드할 수 없다.(하위클래스에서 재정의할 수는 있지만 오버라이드하는 것과는 다르죠. 그리고 사실 오버라이드할 필요성을 거의 느낄 수 없을 것입니다.)
  • 'A는 B다' 테스트를 활용하여 상속 계층이 올바른지 확인해야한다. X가 Y를 확장한 것이라는 'X는 Y다'라고 할 수 있어야 한다.
  • 'A는 B다' 관계는 한 방향으로만 작동한다. 하마는 동물이지만 모든 동물이 하마라고 할 수는 없다.
  • 하위클래스에서 메소드를 오버라이드하면, 그리고 하위클래스의 인스턴스에 대해 그 메소드를 호출하면 오버라이드 된 버전의 메소드가 호출된다. (맨 밑에 있는 것이 호출된다.)
  • B라는 클래스가 A라는 클래스를 확장하고 C는 B를 확장한다면 클래스 B는 클래스A고 클래스 C는 클래스 B고 클래스 C는 또한 클래스 A이다.

상속의 이점

일련의 클래스에서 공통적으로 필요한 행동을 뽑아서 그 코드를 상위 클래스에 집어 넣으면 코드가 중복되는 것을 방지할 수 있고, 행동을 수정할때도 상위클래스의 코드 한군데만 고치면 그 행동을 상속받는 모든 클래스에서 새로운 변동사항이 자동으로 반영된다.


다형성

다형성을 활용하면 레퍼런스와 객체가 다른 유형이어도 된다.

Anilmal mYDog = new Dog();

와 같이 둘은 같은 유형이 아니다. 레퍼런스 변수는 Animal 유형으로 선언했지만 객체를 만들때는 new Dog()를 사용한걸 알 수 있다.


메소드 오버라이드 와 메소드 오버로딩

일반적으로 상위클래스의 메소드를 하위 클래스에서 다시 선언하는 것을 메소드 오버라이드라고 부르는데 이때 리턴타입과 타입과 같은것이 똑같아 한다.

예를들어 상위클래스에 boolean turnOn()이라는 메소드가 있었다고 치자,

이때 하위 클래스에서 boolean turnOn(int level) 라는 메소드를 선언하는것은 오버라이드가 아니다 메소드 오버로딩에 해당한다. 이때 boolean turnOn() 와 같이 상위클래스와 똑같은 형태로 만들어줘야 제대로된 오버라이드이다.

앞에서도 말을 했지만, 메소드 오버로딩은 이름이 같고 인자 목록이 다른 메소드를 만드는것이다.


예) public class Overloads {

String uniqueID;

public int addNums(int a, int b) {

return a+b;

}

public double addNums(double a, double b) {

return a+b;

}

public void SetUniqueID(String theID) {

uniqueID = theID;

}

public void SetUniqueID(int ssNumber) {

String numString = "" + ssNumber;

SetUniqueID(numString);

'프로그래밍 > JAVA' 카테고리의 다른 글

jstl의 마지막 번째 찾기 length, begin, end, step, varStatus  (0) 2012.07.18
SiteMesh Layout적용하기  (0) 2012.06.05
SiteMesh Reference [매뉴얼 번역본]  (0) 2012.06.05
API 링크 정보  (0) 2012.06.01
클래스와 객체  (0) 2012.05.14