프로그램 상속이 현실의 상속과 다른 점
: 자식이 부모를 선택한다!
extends
뒤에 상속받을 부모 클래스를 기술하면 된다.
다른 언어와 다르게 자바는 다중 상속을 허용하지 않는다.
extends 뒤에는 단 하나의 부모 클래스만 와야 한다.
// 부모 클래스
public class Phone { // 클래스 = 설계도 (new를 만들기 전까진 실존하지 않는 것)
// 필드
public String model; // 모델명
public String color; // 컬러
// 생성자
public Phone() {
System.out.println("부모 생성자 실행");
}
// 메소드
public void bell() {
System.out.println("벨이 울립니다.");
}
public void sendVoice(String message) {
System.out.println("자기 목소리: " + message);
}
public void receiveVoice(String message) {
System.out.println("상대방 목소리: " + message);
}
public void hangUp() {
System.out.println("전화를 끊습니다.");
}
}
// 자식 클래스
public class SmartPhone extends Phone {
// 필드
public boolean wifi;
// 생성자
public SmartPhone(String model, String color) {
super(); // 부모 생성자 호출 (매개변수가 없으면 이런 식으로 써주면 된다.)
// super(model, color); 매개변수를 여기서 바로 넣어줘도 된다.
System.out.println("자식 생성자 호출"); // 이러면 부모 생성자가 먼저 실행된 후 자식 생성자가 실행된다.
this.model = model; // 이 부분은 부모 필드에 접근해서 값을 주는 것일 뿐임.
this.color = color;
}
/*
public SmartPhone(String model, String color) { // 부모 클래스의 필드에서 상속받아와서 사용 가능!!!
// 부모 클래스에서 생성자를 따로 지정해주지 않았을 때는 this.를 통해서 접근
// this.model = model; // 부모 필드에 접근 가능
// this.color = color; // 부모 필드에 초기값을 준다.
// 부모 클래스에 명시적으로 지정된 생성자가 있을 때 super 사용!
super(model, color); // 부모 생성자 호출
}
*/
// 메소드
public void setWifi(boolean wifi) {
this.wifi = wifi;
System.out.println("와이파이 상태 변경");
}
public void internet() {
System.out.println("인터넷에 연결합니다.");
}
}
// 자식 클래스 실행
public class SmartPhoneEX {
public static void main(String[] args) {
// SmartPhone 객체 생성
SmartPhone myPhone = new SmartPhone("아이폰XR", "흰색");
//Phone에서 상속받은 필드 읽기: 자식 객체에도 부모 필드에 접근 가능
System.out.println(myPhone.model + ", " + myPhone.color);
//phone에서 상속받은 메소드: 자식 객체에서 부모 메소드에 접근 가능
myPhone.bell();
myPhone.sendVoice("가제트루나씨인가요?");
myPhone.receiveVoice("네 마씁니다");
myPhone.hangUp();
myPhone.setWifi(false);
System.out.println(myPhone.wifi);
}
}
[출력 결과]
부모 생성자 실행
자식 생성자 호출
아이폰XR, 흰색
벨이 울립니다.
자기 목소리: 가제트루나씨인가요?
상대방 목소리: 네 마씁니다
전화를 끊습니다.
와이파이 상태 변경
false