08 상속

클래스 간의 관계 상속 / 포함

○ 상속

상속 : 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것

코드의 추가 및 변경 용이

코드 재사용성 높이고 코드 중복 제거

 

새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 ‘extends’와 함께 써줌

조상 클래스 : 부모 클래스, 상위 클래스. 기반 클래스

자손 클래스 : 자식 클래스, 하위 클래스, 파생된 클래스

 

자손 클래스는 조상 클래스의 모든 멤버를 상속받음 -> 조상 클래스의 멤버를 포함함

조상 클래스가 변경되면 자손 클래스도 자동으로 영향 받음(그 반대는 아님)

자손 클래스는 항상 조상 클래스보다 같거나 많은 멤버를 가짐

상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수가 늘어남

 

상속 받는다! -> 조상 클래스를 확장한다 -> extends

생성자와 초기화 블록은 상속되지 않고, 멤버만 상속 됨

자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많음

접근제어자가 private 또는 default인 멤버들은 상속은 받지만 자손 클래스로부터의 접근이 제한됨

 

자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버와 자손 클래스의 멤버가 합쳐진 하나의 인스턴스로 생성 됨

자손 클래스의 인스턴스를 생성하면 조상 클래스의 멤버도 함께 생성됨

따로 조상 클래스 인스턴스를 생성하지 않고 조상 클래스 멤버 사용 가능

 

오버라이딩 : 조상 클래스에 정의된 메서드와 같은 메서드를 자손 클래스에서 정의하는 것(재정의)

단일 상속 : 자바는 단일 상속을 지원! 다중상속을 지원하지 않음

 

○ 포함

한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것

클래스 재사용의 한 방법

 

○ 관계 결정하기

상속 관계를 맺을 것인지, 포함 관계를 맺을 것인지 결정

상속 관계 : ~ ~이다. (is – a) ex) 원은 도형이다. Circle is a Shape.

포함 관계 : ~ ~을 가지고 있다 (has – a) ex) 원은 점을 가지고 있다. Circle has a Point.

 

Object 클래스 - 모든 클래스의 조상

모든 클래스의 상속 계층도의 최상위에 있는 조상 클래스

모든 클래스들은 자동적으로 Object클래스에서 상속 받게 됨

컴파일러가 자동적으로 ‘extends Object;를 추가함

 

오버라이딩

○ 오버라이딩 : 조상 클래스로부터 상속 받은 메서드의 내용을 자손 클래스에서 변경하는 것

상속 받은 메서드를 그대로 사용하기도 하지만, 자손 클래스에 알맞게 변경하기도 함

 

○ 오버라이딩의 조건

자손 클래스에서 오버라이딩 하는 메서드는 조상 클래스의 메서드와

(1)   이름이 같아야 함

(2)   매개변수가 같아야 함

(3)   반환 타입이 같아야 함

즉 선언부가 완전히 일치해야 함

 

접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경 가능

(1)   접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없음

(2)   조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없음

예외의 개수는 선언한 예외의 수뿐 아니라 더 넓은 범위의 예외도 포함

넓은 범위의 예외는 따지고 보면 더 많은 수의 예외를 선언한 것이 되므로

(3)   인스턴스 메서드를 static 메서드로 또는 그 반대로 변경할 수 없음

 

○ 오버로딩 vs. 오버라이딩

둘 다 메서드 이름은 같은데 말이지.

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것

메서드 이름은 같지만 매개변수가 달라서 전혀 다른 메서드임

매개변수로 구분이 가능함

오버라이딩 : 상속 받은 메서드의 내용을 변경하는 것

메서드 이름도 반환형도 매개변수도 싹 다 같음

상속 받은 자손 클래스만 사용 가능한 것

재정의!

 

super – 조상 클래스의 참조변수

자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수

(cf. this : 멤버변수와 지역변수의 이름이 같을 때 자기자신을 가리키는 참조변수)

상속 받은 멤버와 자신의 클래스에 정의된 멤버의 이름이 같을 때 super 붙여 구분

 

조상 클래스의 멤버와 자손 클래스의 멤버가 중복 정의되었을 때만 사용하는 것이 좋음

■ super this

모든 인스턴스 메서드에는 자신이 속한 인스턴스의 주소가 지역변수로 저장됨

그 것이 참조변수로 super this에 들어가는 것!

 

변수와 메서드 모두 super로 호출 가능

조상 클래스의 메서드를 자손 클래스에서 오버라이딩 한 경우 super 사용

■ super static메서드에 사용할 수 없음

static메서드는 인스턴스와 관련이 없음! (this도 마찬가지)

 

super() - 조상 클래스의 생성자

조상 클래스의 생성자를 호출하는 데 사용

자손 클래스의 인스턴스를 생성하면 자손의 멤버와 조상의 멤버가 모두 합쳐진 인스턴스가 생성됨 -> 자손 클래스 생성자에 조상 클래스 생성자가 호출 돼서 그런 것

■ Object 클래스를 제외한 모든 클래스의 생성자 첫 줄에 생성자 this(), super() 호출해야 함

그렇지 않으면 컴파일러가 자동으로 super();을 생성자 첫 줄에 삽입함

자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 있으므로 조상 클래스 멤버가 먼저 초기화 되어 있어야 함

생성자가 정의되어 있는 클래스는 컴파일러가 기본 생성자를 자동으로 추가하지 않음

조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 하는 것이 좋음

 

+ Recent posts