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();을 생성자 첫 줄에 삽입함
□ 자손 클래스의 멤버가 조상 클래스의 멤버를 사용할 수 있으므로 조상 클래스 멤버가 먼저 초기화 되어 있어야 함
□ 생성자가 정의되어 있는 클래스는 컴파일러가 기본 생성자를 자동으로 추가하지 않음
■ 조상 클래스의 멤버변수는 조상의 생성자에 의해 초기화되도록 하는 것이 좋음
'JAVA > 이론' 카테고리의 다른 글
[java][이론] 010 제어자 (0) | 2020.07.08 |
---|---|
[java][이론] 009 package와 import (0) | 2020.07.06 |
[java][이론] 007 생성자와 변수의 초기화 (0) | 2020.07.04 |
[java][이론] 006 변수와 메서드 (0) | 2020.07.02 |
[java][이론] 005 클래스와 객체 (0) | 2020.07.02 |