자바에서 상속을 이용하면 부모 클래스의 수정으로 모든 자식 클래스들도 수정되는 효과 때문에 유지보수 측면에서 효율성을 높일 수 있다. 그래서 객체지향 프로그래밍 특징 중에 상속이 포함되는 것이다.
[상속 특징]
1. 현실에서 상속은 부모가 자식을 선택해서 물려주지만, 프로그램에서는 자식이 부모를 선택한다.
2. 현실에서도 부모를 여러명 가질수 없듯이, 프로그램에서도 단 하나의 부모만 가질 수 있다.
3. 부모 클래스가 private나 다른 패키지에 있고 default 접근 제한자를 가지고 있으면 상속을 할 수 없다.
[자식클래스가 부모클래스를 사용할 수 있는 이유]
상속을 받은 자식 클래스의 객체가 생성되면 부모 객체가 먼저 생성되는데 그 이유는 자식 클래스의 기본 생성자에 있는 super() 함수로 부모 객체가 생성되기 때문이다.
※ super() 함수는 부모 클래스의 객체를 생성하기 위해서 실행되는 함수이다.
[CellPhone 부모 클래스]
public class CellPhone {
String model;
String color;
protected void powerOn() {
System.out.println("전원을 켭니다");
}
}
[CellPhone 클래스를 상속 받은 DmbCellPhone 클래스]
public class DmbCellPhone extends CellPhone {
int channel;
DmbCellPhone(String model, String color, int channel) {
this.model = model;
this.color = color;
this.channel = channel;
}
}
[DmbCellPhone 자식 객체를 만들어서 사용]
public class DmbCellPhoneExample {
public static void main(String[] args) {
DmbCellPhone dmbCellPhone = new DmbCellPhone("자바폰", "검정", 10);
System.out.println(dmbCellPhone.model); //자바폰
System.out.println(dmbCellPhone.color); //검정
System.out.println(dmbCellPhone.channel); //10
dmbCellPhone.powerOn(); //전원을 켭니다
}
}
DmbCellPhone 객체를 만든 순간 DmbCellPhone 클래스에 있는 생성자에서 생략된 super() 함수가 자동으로 추가되면서 먼저 실행된다. 힙 영역에 CellPhone 객체가 생성되고 DmbCellPhone 객체가 그다음 생성된 후에 스택 영역에 있는 dmbCellPhone의 값은 DmbCellPhone 객체의 주소를 바라본다.
CellPhone 클래스의 model, color 필드와 powerOn() 메서드를 상속 받았기 때문에 사용할 수 있다.
[자식 클래스의 객체 만들때 주의사항]
생략된 super() 함수가 자동으로 추가되면서 실행되는데 만약에 부모 클래스의 기본 생성자가 없으면 어떻게 될까?
생성자를 하나 만들어서 기본 생성자가 안 만들어지도록 하였다.
public class CellPhone {
String model;
String color;
CellPhone(String model) {
}
protected void powerOn() {
System.out.println("전원을 켭니다");
}
}
main 함수를 실행시켰더니 아래 에러가 난다. 기본생성자가 없으니 나는 에러다.
에러를 해결하기 위해서는 super() 함수를 기입해줘야 하고 생성자를 만들때 기입한 매개변수도 넣어줘야 한다.
public class DmbCellPhone extends CellPhone {
int channel;
DmbCellPhone(String model, String color, int channel) {
super(model);
this.color = color;
this.channel = channel;
}
}
또 주의사항으로는 부모 클래스의 생성자가 접근제한자 private를 사용한다면 부모클래스의 생성자를 자식클래스에서 만들수 없기 때문에 에러가 발생한다.
※ 또한 부모 클래스가 다른 패키지에 있고, 접근제한자가 default 이면 자식클래스에서 사용될수 없다는점도 알고 있어야 한다.
참고 : 혼자 공부하는 자바 / 신용권 https://www.yes24.com/Product/Goods/74269939
'Language > Java' 카테고리의 다른 글
[Java] 객체지향 설계 SOLID원칙과 SRP 단일 책임 원칙 필요이유와 적용 방법 (0) | 2024.01.08 |
---|---|
[Java] 객체지향 특성의 추상화와 상속, 인터페이스 사용이유, 클래스 다중상속 안되는 이유 (1) | 2024.01.07 |
[Java] final 필드, 클래스, 메서드 의미와 상수 개념과 특징, 상수가 static final 인 이유 (0) | 2023.12.05 |
[Java] 싱글톤 디자인 패턴 원리 이해하기, final static 메모리 사용영역으로 이해하기 (0) | 2023.12.05 |
[Java] 인스턴스 멤버와 정적 멤버, 정적 멤버안에 정적 멤버만 사용할 수 있는 이유 (1) | 2023.12.05 |