공부했던 자료 정리하는 용도입니다.

재배포, 수정하지 마세요.

 

 

 

 

상속(Inheritance)

class Child extends Parent{	//extends를 사용한다.
	//...
}

 상속은 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 위의 코드는  Child 라는 클래스가  extends 라는 키워드로  Parent 라는 클래스를 상속받은 것이다. 이때 상속해주는 클래스를 부모(parent) 클래스라고 하고 상속받는 클래스를 자식(child) 클래스라고 한다. 아래에 있는 용어들은 서로 같은 의미이다. 참고로 자바에서는 단일상속만을 허용한다.

 

조상 클래스 : 부모(parent)클래스, 상위(super)클래스, 기반(base)클래스
자손 클래스 : 자식(child)클래스, 하위(sub)클래스, 파생된(derived)클래스

 

 

상속관계도

위의 코드를 상속관계도로 표현하면 위의 그림처럼 된다.

 

 

 

다이어그램

다이어그램으로도 표현하면 위의 그림처럼 된다.  Parent  age 라는 멤버 변수를 추가하면 자식 클래스는 부모의 멤버를 모두 상속받기 때문에  Child 에서도  age 라는 멤버 변수가 추가된다.  Child  Parent 에서 상속받은 멤버도 갖고 있지만  Child 만의 고유한 멤버도 가질수 있기 때문에 상속할 때 확장한다는 의미의  extends 키워드를 사용한다. 그리고 다이어그램에서도 알수 있지만 자식 클래스는 항상 부모 클래스보다 같거나 많은 멤버를 갖는다. 

 

 

 

상속의 장점

 적은양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 용이하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 여러 클래스에 공통적으로 추가되어야 하는 멤버 변수나 메서드가 있다면 상속관계를 이용해서 코드의 중복을 최소화해야 한다.

 

 

 

포함관계

 상속 말고도 클래스 간의 포함관계를 맺어서 코드를 재사용할수있다. 포함관계는 한클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언해서 맺어준다. 단위별로 여러개의 클래스를 작성한 다음 단위클래스를 포함관계로 재사용하면 관리가 수월하다.

 

 

 

클래스간의 관계 설정하기

상속관계 : ~은 ~이다.(is - a)
포함관계 : ~은 ~을 가지고 있다(has - a)

클래스의 관계에 따라서 상속관계가 더 자연스러운지 포함관계가 더 자연스러운지 따져보면 된다.

 

 

 

Object클래스

  Object 클래스는 모든 클래스의 최상위에 있는 부모 클래스이다. 다른 클래스로부터 상속받지 않는 모든 클래스들은 자동적으로  Object 클래스로부터 상속받게 된다.

 

 

 

 


오버라이딩(Overriding)

 부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버 라이딩이라고 한다. 부모 클래스로부터 상속받은 메서드를 그대로 사용할 수도 있지만 자식 클래스에 맞게 변경해야 하는 경우에 사용한다.

 

 

오버라이딩의 조건

 자식 클래스에서 오버 라이딩하는 메서드는 부모 클래스의 메서드와 이름, 매개변수, 반환 타입이 같아야 한다. 한마디로 선언부가 일치해야 한다는 것인데 접근제어자(access modifier)나 예외(exception)는 제한된 조건 하에서만 다르게 변경할 수 있다.

 


접근제어자와 예외 변경조건

  1. 접근 제어자는 부모 클래스의 메서드보다 좁은범위로 변경할 수 없다.
    부모클래스에 있는 메서드의 접근제어자가  protected 면 자식클래스에서 오버라이딩할때는  protected 거나  public 이어야 한다.
  2. 부모클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
  3. 인스턴스메서드를  static 메서드로 바꾸거나 그반대로 변경할 수 없다.

 

 

 

오버로딩과 오버라이딩

 오버 로딩은 메서드의 매개변수를 달리해서 중복 정의하는 것이고 오버 라이딩은 부모로부터 상속받은 메서드의 내용을 변경(재정의)하는 것이다. 

 

 

 

super

  super 은 자식 클래스에서 부모 클래스로부터 상속받은 멤버를 참조하는 데 사용하는 참조 변수이다.  this 처럼 부모 클래스의 멤버가 자식 클래스의 멤버가 중복 정의되어 서로 구별해야 할 때도  super 를 사용하는 것이 좋다.(모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장되는데, 이것이 참조 변수인  this  super 의 값이 된다.)  super 역시  static 메서드에서는 사용할 수 없고 인스턴스 메서드에서만 사용할 수 있다.

 

 

 

super( )

  super( ) 은 부모 클래스의 생성자를 호출하는데 사용되는 생성자이다. 자식 클래스의 인스턴스를 생성하면 자식의 멤버와 부모의 멤버가 모두 합쳐진 하나의 인스턴스가 생성되기 때문에 자식 클래스의 인스턴스가 부모 클래스의 멤버들을 사용할 수 있는 것이다. 이때 부모 클래스 멤버의 초기화작업이 수행되어야 하기 때문에 자식 클래스의 생성자에서 부모 클래스의 생성자가 호출되어야 한다. 생성자의 첫줄에서 부모 클래스의 생성자를 호출해야하는 이유는 자식 클래스의 멤버가 부모 클래스의 멤버를 사용할 수도 있으므로 부모의 멤버들이 먼저 초기화되어 있어야 하기 때문이다. 부모클래스의 생성자 호출은 부모로 계속 거슬러 올라가서  Object 클래스의  Object( ) 까지 가서야 끝난다. 그래서  Object 클래스를 제외한 모든 클래스의 생성자는 첫 줄에 반드시 자신의 다른 생성자( this( ) ) 또는 부모의 생성자( super( ) )를 호출해야 한다. 아무것도 없으면 컴파일러가 자동으로 생성자의 첫 줄에  super( ); 를 추가한다.

 


인스턴스를 생성할 때는 클래스를 선택하는 것만큼 생성자를 선택하는 것도 중요하다.

1. 클래스 : 어떤 클래스의 인스턴스를 생성할 것인지?
2. 생성자 : 선택한 클래스의 어떤 생성자를 이용해서 인스턴스를 생성할 것인지?

 

 

 

+ Recent posts