[JAVA] 상속
상속
상속이란 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이이다. 상속을 통해 클래스를 작성하면 적은 양의 코드로 새로운 클래스를 작성할 수 있고, 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 용이하다.
==> 이러한 특징은 코드의 재사용성을 높이고, 중복을 제거한다. (생산성, 유지보수에 기여)
상속을 구현하는 방법
새로 작성하고자 하는 클래스 이름 extends 상속받고자 하는 기본 클래스 이름
조상 클래스: 상속해주는 클래스
= 부모, 상위, 기반 클래스
자손 클래스: 상속 받는 클래스
= 자식, 하위, 파생된
class Parent {
int age;
}
class Child extends Parent {
void play() {
System.out.println("놀자~!");
} // play
} // end class
자손 클래스는 조상 클래스의 모든 멤버를 상속받기 때문에 Child클래스는 Parent클래스의 멤버들을 포함한다.
Parent 클래스에 age라는 정수형 변수를 멤버 변수로 추가하면 Child 클래스 또한 자동적으로 age라는 멤버변수가 추가된 것과 같은 효과를 얻는다. 반대로 자손인 Child 클래스에 play() 메소드를 추가한다면, Child 클래스의 새 코드가 추가되어도 조상인 Parent 클래스에는 아무런 영향이 없다.
자손 클래스는 조상 클래스의 모든 멤버를 상속 받으므로 항상 조상 클래스와 같거나 그보다 많은 멤버를 갖는다. 상속에 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 늘어나게 된다.
- 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속된다.
- 자손 클래스의 멤버 개수는 조상 클래스보다 항상 같거나 많다.
포함관계
= ~은 ~을 가지고 있다.
한 클래스의 멤버변수로 다른 클래스 타입의 참조 변수를 선언하는 것.
Class Circle {
int x; // 원점의 x좌표
int y; // 원점의 y좌표
int z; // 원점의 z좌표
}
Class Circle {
Point c = new Point(); // 원점
int r;
}
하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음,
단위 클래스들을 포함관계로 재사용하면 보다 간결하고 쉽게 클래스를 작성할 수 있다.
또한 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있다.
상속관계
= ~은 ~ 이다.
Point 클래스를 포함시키는 대신 상속관계를 맺어주었을 때의 예시이다.
Class Circle {
Point c = new Point(); // 원점
int r;
}
Class Circle extends Point {
int r;
}
원(Circle)은 점(Point)이다. = Circle is a Point.
원(Circle)은 점(Point)을 가지고 있다. = Circle has a Point.
두 번째 표현이 맞는 표현이다.
단일 상속
다른 객체지향 언어인 C++은 여러 조상클래스로부터 상속받는 것이 가능한 다중상속을 허용하지만 자바에서는 오직 단일 상속만을 허용한다. 때문에 둘 이상의 클래스로부터 상속을 받을 수 없다.
다중상속을 허용하면 여러 클래스로부터 상속받을 수 있기 때문에 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있지만 클래스간 관계가 매우 복잡해진다.
단일 상속은 하나의 조상 클래스만을 가질 수 있기 때문에 클래스 간의 관계가 명확해지고 코드를 신뢰할 수 있게 만들어준다는 점에서 다중상속보다 유리하다.
Object 클래스
: 모든 클래스의 조상
Object 클래스는 모든 클래스 상속계층도의 최상위에 있는 조상클래스이다.
상속 구조 확인하기
확인하고자 하는 부분을 지정하여 우클릭하여 Open Type Hierarchy를 클릭한다.
우측에 상속 관계가 표기된다.
퍼블릭 메소드만 보인다.
자식 객체를 생성하면 부모 객체도 생성되는가?
부모 없는 자식은 없음
- 자식 객체 생성할 때는 부모 객체로부터 생성 후 자식 객체 생성
- 부모 생성자 호출 완료 후 자식 생성자 호출 완료
위치를 바꾸면 컴파일 오류가 사라진다.
상속 받으려는 부모 클래스에 final이라 되어 있으니 상속이 되지 않아 컴파일 오류가 생긴다.
이처럼 extends를 삭제하면 오류가 사라진다.
protected
디폴트 접근 제한 때문에 다른 패키지에 있을 때 사용 불가
그러나 상속 받았을 경우에는 가능하다.
부모 클래스 찾기
상속하기
(이렇게 찾기 보다는 직접 입력하는 편이 낫다.)
D클래스가 A를 상속받는다. = D가 A를 익스탠즈 받는다.(현업식 표현)
super를 통해서 호출 가능
자식이라서가 아니라 생성자 블록 내에서
* 대전제
1. 부모객체의 필드와 메소드 중에 상속이 안 되는 조건 2가지
가. private 접근제한을 가지는 필드, 메소드는 상속불가
나. 다른 패키지의 자식 클래스가 있을 때 default 접근 제한을 가지는 부모 객체의 필드, 메소드 역시 상속 불가
부모 클래스
다른 패키지의 child
참고문헌: 이것이 자바다, 자바의 정석