728x90
상속(Inheritance)
기존의 클래스에 기능을 추가하거나 재정의하여 새로운 클래스를 정의하는 것을 의미한다. 기존에 정의되어 있던 클래스(부모 클래스)의 모든 필드와 메소드를 물려받아 새로운 클래스(자식 클래스)를 생성할 수 있다.
상속의 장점
- 기존에 작성된 클래스를 재활용 가능하므로 중복되는 코드를 줄여 개발 시간이 단축된다.
- 자식 클래스 설계 시 중복되는 멤버를 미리 부모 클래스에 작성하면, 자식 클래스에 해당 멤버를 작성하지 않아도 된다.
- 부모 클래스를 수정하면 모든 자식 클래스도 수정되기에 최소한만 수정할 수 있다.
- 클래스 간의 계층적 관계를 구성하여 다형성의 문법적 토대를 마련한다.
문법
public class Child extends Parent {
}
자바는 다중 상속을 허용하지 않아, 여러개의 부모 클래스를 상속할 수 없다.
자식 클래스에는 부모 클래스의 필드와 메소드만 상속되며, 생성자와 초기화 블록은 상속되지 않는다.
부모 클래스의 접근 제어가 private 또는 default로 설정된 멤버는 자식 클래스에서 상속받지만 접근할 수 없다.
super
부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수이다. super 참조 변수를 사용하여 부모 클래스의 멤버에 접근할 수 있다. this와 마찬가지로 인스턴스 메소드에만 사용 가능하다.
this는 자식 클래스에서 대입된 값을 출력하고, super는 부모 클래스에서 대입된 값을 출력한다.
예제 코드
더보기
class Parent {
int a = 10;
}
class Child extends Parent {
int a = 20;
void display() {
System.out.println(a); // 20
System.out.println(this.a); // 20
System.out.println(super.a); // 10
}
}
public class Inheritance03 {
public static void main(String[] args) {
Child ch = new Child();
ch.display();
}
}
super()
부모 클래스의 생성자를 호출할 때 사용한다. super()는 부모 클래스에 기본 생성자가 있으면 컴파일 과정에서 자동으로 추가되고, 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면 super() 호출 후 매개변수까지 지정해야 한다. 작성한 코드는 매개값의 타입과 개수가 일치하는 부모 생성자를 호출한다.
// 부모 = 기본 생성자
public Child(...) {
super(); // 컴파일시 자동 추가되나 숨겨져있고 생략 가능
...
}
// 부모 = 기본 생성자 없고 매개변수 생성자 있음
public Child(...) {
super(매개값, ...);
...
}
부모 클래스가 매개 변수를 가지면 super(매개값, ...)을 적으라고 경고가 뜬다.
매개 변수를 갖는 생성자 예제 코드
더보기
package ch07.sec03.exam02;
public class Phone {
public String brand;
public String color;
public Phone(String brand, String color) {
this.brand = brand;
this.color = color;
System.out.println("Phone(String model, String color) 생성자 실행");
}
}
package ch07.sec03.exam02;
public class Iphone extends Phone {
// 자식 생성자 선언
public Iphone(String brand, String color) {
super(brand, color);
System.out.println("Iphone(String brand, String color) 생성자 실행됨");
}
}
package ch07.sec03.exam02;
public class IphoneExample {
public static void main(String[] args) {
Iphone iphone = new Iphone("apple", "black");
System.out.println("iphone.brand = " + iphone.brand);
System.out.println("iphone.color = " + iphone.color);
}
}
참고 링크
728x90
'IT > Java' 카테고리의 다른 글
[Java] 자동 타입 변환 & 강제 타입 변환 (0) | 2024.03.08 |
---|---|
[Java] Method Overriding (0) | 2024.03.07 |
[Java] 접근 제한자 (0) | 2024.03.05 |
[Java] final 필드와 상수 (0) | 2024.03.05 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.03.05 |