자바의 상속
상속
기존 클래스로부터 새로운 내용을 덧붙이거나(확장), 내용의 일부를 바꾸어 사용(재정의, 오버라이딩)하는 것
장단점
- 코드 재사용, 유지 보수성 향상, 확장의 용이함, 개발 시간 및 비용 감축 효과
- 그러나 과도하게 결합될 수 있다는 단점 존재
조건과 특징
논리적으로 “자식 is a 부모” 관계가 성립할 때만 상속 가능
- 자바에서는 중복된 변수명 사용을 막는 등 개발의 편의성과 가독성을 위해 문법적으로 단일상속만을 허용함(이를 극복하기 위해 ‘인터페이스’와 ‘has a’관계 활용 가능)
- 별도로
extends
선언 없는 클래스는 모두extends Object
가 생략됨. 즉, 모든 클래스는 Object 클래스를 상속받고 있음.
상속과 생성자
- 상속된 자식 클래스 객체가 생성될 때 부모 클래스의 생성자도 자동으로 호출되어 자동으로 객체 초기화가 이루어지도록 함.
-
super() 생성자 호출
- 부모 클래스의 생성자를 명시적으로 호출
- 부모 클래스 생성자가 Overloading되어 여러 개 존재하는 경우, 특정 생성자를 호출하기 위해 사용
Javaclass Shape { int x = 0; int y = 0; Shape() { // 부모 클래스 기본 생성자 this(0, 0); } Shape(int x, int y) { // 부모 클래스 생성자 Overloading this.x = x; this.y = y; } } class Circle extends Shape { int radius; Circle(int x, int y, int radius) { super(x, y); // 부모 클래스의 생성자중 Overloading된 생성자를 명시적으로 호출 this.radius = radius; // 단, super()를 쓸 경우 무조건 자식 클래스 생성자의 첫번째 라인에 위치해야 함 } }
상속과 멤버
변수 상속
- 부모 클래스의 private 변수는 자식 클래스에 상속되지 않음
- 부모 클래스가 가진 변수와 같은 타입, 같은 이름의 변수를 선언하면, 부모 클래스 변수는 상속되지 않음. 자식 클래스에서 정의한 변수가 사용됨.
- this 예약어 : 객체 자신에 대한 참조 ->
this.grade
: 자신의 클래스에 존재하는 grade 변수 - super 예약어 : 부모 객체에 접근하기 위한 참조 변수 ->
super.grade
: 부모 클래스에 존재하는 grade 변수
메서드 상속 - 메서드 Overriding
-
메서드 재정의 ; 자식 클래스가 부모 클래스의 메서드를 그대로 사용하지 않고 새롭게 정의(재정의)하여 사용하는 것
- <-> 메서드 Overloading은 하나의 클래스에서 동일한 이름의 메서드 여러 개를 정의하는 것
- 자식 클래스의 재정의된 메서드는 부모 클래스 메서드와 메서드 이름, 매개변수의 유형, 개수, 순서가 동일해야 함
- final 예약어를 사용할 경우 자식 클래스에서 부모 클래스 메서드 Overriding이 불가능함
클래스 상속과 인터페이스 상속
클래스 상속
extends 클래스명
- 구현 상속
- 단일 상속만 지원
- Concrete 클래스(온전한 클래스)를 상속받을 경우 재정의는 선택사항
- Abstract 클래스(추상 클래스)를 상속받을 경우 해당 부모 클래스가 추상 메서드를 포함하고 있다면 재정의는 필수임
인터페이스 상속
implements 인터페이스명
- 껍데기 상속
- 다중 상속 지원
- 재정의는 필수