상속을 해도 부모 클래스의 모든 필드와 메소드들을 물려받는 것은 아니다. 부모 클래스에서 private 접근 제한을 갖는 필드와 메소드는 상속 대상에서 제외된다.
그리고 부모 클래스와 자식 클래스가 서로 다른 패키지에 있으면 default 접근 제한을 갖는 필드와 메소드도 상속 되지 않는다.
프로그램에서는 자식이 어떤 부모 클래스를 상속 받을지 결정한다.
// CellPhone.java
public class CellPhone {
String model;
String color;
void bell(){
System.out.println("벨이 울린다");
}
public class SmartPhone extends CellPhone {
// 필드
double channel;
// 생성자
SmartPhone(String model, String color, double channel) {
this.model = model; // 상속받은 model 필드 = 매개변수 model
this.color = color; // 상속받은 color 필드 = 매개변수 color
this.channel = channel; // 인스턴스 필드 = 매개변수 channel
}
// 메소드
void turnOnRadio(){
System.out.println("라디오 주파수 - ", channel);
}
}
public class SmartPhoneExam {
public static void main(String[] args){
// 객체 생성
SmartPhone sp = new SmartPhone("갤럭시", "화이트", 70.5);
// 부모 클래스의 필드
System.out.println(sp.model);
System.out.println(sp.color);
// 자식 클래스의 필드
System.out.println(sp.channel);
// 부모 클래스의 메소드
sp.bell();
// 자식 클래스의 메소드
sp.turnOnRadio();
}
}
부모 생성자 호출
자식 객체를 생성하면 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성된다.
부모 생성자는 자식 생성자의 맨 첫 중에서 호출된다. 자식 클래스에 생성자가 선언되지 않았다면 컴파일러는 다음과 같은 기본 생성자를 만들어낸다.
public ChildClass(){
super();
}
super()는 부모의 기본 생성자를 호출한다. 만약 부모 클래스에 직접 생성자를 만들고 자식 클래스에서 부모 클래스의 생성자를 호출하고 싶다면 다음과 같이 만들면 된다.
public ChildClass(){
super(값, ...);
}
super의 매개값과 일치하는 타입의 부모 클래스 생성자를 호출한다. 만약 super(매개값 , ...)이 생략되면 컴파일러에 의해 자동으로 super()가 생성되기 때문에 기본 부모 생성자가 있어야 한다.
부모 클래스에 기본 생성자가 없고, 매개변수가 있는 생성자만 있으면 자식 클래스에서 반드시 super(매개값, ...)가 반드시 자식 생성자의 가장 첫줄에 있어야 한다.
// Subject.java
public class Subject{
public String sub;
public Subject(String sub){
this.sub = sub
}
}
// Student.java
public class Student extends Subject{
String name;
int studentNo;
public Student(String name, int studentNo, String sub) {
super(sub);
this.name = name;
this.studentNo = studentNo;
}
}
// StudentExam.java
public class StudentExam {
public static void main(String[] args) {
Student student = new Student("아구몬", 15, "지구과학");
// 부모에게 받은 필드
System.out.println(student.sub)
}
}
'개발 관련 지식 > JAVA' 카테고리의 다른 글
final 키워드 (0) | 2020.03.31 |
---|---|
메소드 재정의 Overriding (0) | 2020.03.31 |
어노테이션 (0) | 2020.03.31 |
Getter, Setter 메소드 (0) | 2020.03.31 |
import문 (0) | 2020.03.31 |