🔎 상속의 특성
🔎 상속의 기본 조건 (IS-A)
class MobilePhone {
protected String number;
public MobilePhone(String number) {
this.number = number;
}
public void answer() { // 전화 받기 기능
System.out.println(number + "의 전화를 받습니다.");
}
}
/* 상속 관계 (IS-A 관계)
* 자식클래스(SmartPhone) ➡ 부모클래스(MobilePhone)
*/
class SmartPhone extends MobilePhone {
private String androidVer; // 안드로이드 운영체제 버전
public SmartPhone(String number, String ver) {
super(number);
androidVer = ver;
}
public void playApp() { // 앱 실행 기능
System.out.println(androidVer + "버전으로 앱을 실행합니다.");
}
}
class ISAExam {
public static void main(String[] args) {
SmartPhone phone = new SmartPhone("010-1111-2222", "Nougat");
phone.answer(); // 자식 클래스형의 참조변수를 통해 부모 클래스 멤버에 접근 가능
phone.playApp();
}
}
// 결과 출력
010-1111-2222의 전화를 받습니다.
Nougat버전으로 앱을 실행합니다.
class Cake {
public void sweet() {...}
}
class ChesseCake extends Cake {
public void milky() {...}
}
class StrawberryCheeseCake extends ChesseCake {
public void sour() {...}
}
Cake cake1 = new StrawberryCheeseCake(); // Cake형 참조변수가 StrawberryCheeseCake 인스턴스 참조
CheeseCake cake2 = new StrawberryCheeseCake(); // CheeseCake형 참조변수가 StrawberryCheeseCake 인스턴스 참조
StrawberryCheeseCake cake2 = new StrawberryCheeseCake();
cake1.sweet();
// cake1.milky(); // 컴파일 에러발생
// cake1.sour(); // 컴파일 에러발생
cake2.sweet();
cake2.milky();
// cake2.sour(); // 컴파일 에러발생
cake3.sweet();
cake3.milky();
cake3.sour();

🔎 참조변수 간 대입과 형 변환
CheeseCake cake1 = new CheeseCake();
Cake cake2 = cake2; // 가능
Cake cake3 = new CheeseCake();
// CheeseCake cake4 = cake3; // 불가능
CheeseCake cake4 = (CheeseCake) cake3; // 형변환
class Cake {
public void yummy() {
System.out.println("yummy Cake"); // 오버라이딩 당함
}
}
class CheeseCake extends Cake {
public void yummy() {
System.out.println("yummy CheeseCake"); // Cake(부모 클래스)의 yummy 메소드를 오버라이딩 함
}
}
class MethodOverridingExam {
public static void main(String[] args) {
Cake c1 = new CheeseCake();
CheeseCake c2 = new CheeseCake();
c1.yummy(); // Cake형 참조변수를 통해서도 오버라이딩 한 CheeseCake의 yummy 메소드를 호출
c2.yummy(); // CheeseCake의 yummy 메소드를 호출
}
}
// 출력 결과
yummy CheeseCake
yummy CheeseCake
🔎 오버라이딩 된 메소드 호출하는 방법
super.를 이용해 접근이 가능하다.super.는 "내가 상속하고 있는 부모 클래스의"라는 의미를 갖는다! )class Cake {
public void yummy() {
System.out.println("yummy Cake");
}
}
class CheeseCake extends Cake {
public void yummy() {
super.yummy(); // Cake의 오버라이딩 된 yummy 메소드 호출
System.out.println("yummy CheeseCake");
}
public void tasty() {
super.yummy(); // Cake의 오버라이딩 된 yummy 메소드 호출
System.out.println("testy CheeseCake");
}
}
class MethodOverridingSuperExam {
public static void main(String[] args) {
CheeseCake c = new CheeseCake();
c.yummy();
c.tasty();
}
}
// 출력결과
yummy Cake
yummy CheeseCake
yummy Cake
testy CheeseCake
🔎 인스턴스 변수와 클래스 변수는 오버라이딩 대상일까 ?
class Cake {
public int size;
...
}
class ChesseCake extends Cake {
public int size;
...
}
CheeseCake c1 = new CheeseCake();
c1.size = ... // CheeseCake의 size에 접근
Cake c2 = new CheeseCake();
c2.sizw = ... // Cake의 size에 접근
instanseof 연산자연산자 instanseof는 참조변수가 참조하는 인스턴스의 클래스나 참조하는 인스턴스가 상속하는 클래스를 묻는 연산자이다.
기본 구조
if (참조변수 instanceof 클래스이름)
...
if (c instanceof Cake)c가 참조하는 인스턴스가 Cake의 인스턴스면 true 반환c가 참조하는 인스턴스가 Cake를 상속하는 자식 클래스의 인스턴스면 true 반환