강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 다소 부정확할 수 있습니다.
상위 클래스로부터 상속받은 메소드를 그대로 이용하지 않고 하위 클래스(자기 자신)에 맞게 해당 메소드의 구현내용만 재정의하는 것.
⇒ 반환타입, 메소드 이름, 매개변수는 부모 클래스의 메소드와 일치해야 한다.
중복정의와 다르다. 중복정의는 매개변수만 다르고 비슷한 구현내용을 다루는 것.
메소드 재정의의 목적
ex. 흑백 출력 - 컬러 출력
)은 부모클래스와 자식클래스들이 동일한 이름의 메소드로 구현하게 한다.💡 api document에서 확인해 보면,
Methods declared in (특정 상위클래스) 목록에서 ‘재정의된 메소드’는 제외된다.
기본자료형 타입의 형변환. ‘문자열’은 참조자료형이다.
상위클래스 타입의 참조변수에 저장
Phone p1 = new FeaturePhone();
⇒ 자동으로 처리된다.재정의된 메소드
가 있으면 그것을 실행시켜준다.
(실제 데이터의 구조와 이미지에 차이가 있지만, 편한 이해를 위해 참고할 것)
하위클래스 타입의 참조변수에 저장
FeaturePhone p1 = new Phone();
오류 ⇒ 강제 형변환 연산자 필요❗ 예시 코드들은 실제 프로그램 구현을 위한 코드가 아니라, 자바의 속성 및 기능을 이해하기 위한 코드임 ❗
public class Phone {
String tel;
void call() { ... }
}
public class SmartPhone extends Phone {
String ip;
String email;
void web() { ... }
void mail() { ... }
}
public class Iphone extends SmartPhone {
void faceId() { ... }
vaid appleMusic() { ... }
}
public static void main(String[] args) {
// 참조변수의 클래스타입과 생성된 객체의 클래스타입이 동일한 경우
// 참조변수 p1은 Iphone객체를 참조하고 있음
// 참조변수 p1은 Iphone객체, SmartPhone객체, Phone객체, Object객체의 멤버변수와 멤버메소드를 사용할 수 있음
Iphone p1 = new Iphone();
p1.tel = "010-1111-1111";
p1.call();
p1.ip = "100.20.200.10";
p1.email = "hong@gmail.com";
p1.web();
p1.mail();
p1.faceId();
p1.appleMusic();
// 참조변수의 클래스타입이 생성된 객체의 상위 클래스타입인 경우
// 참조변수 p2는 SmartPhone객체를 참조하고 있음
// 참조변수 p2는 SmartPhone객체, Phone객체, Object객체의 멤버변수와 멤버메소드를 사용할 수 있음
SmartPhone p2 = new Iphone();
p2.tel = "010-1111-1111";
p2.call();
p2.ip = "100.20.200.10";
p2.email = "hong@gmail.com";
p2.web();
p2.mail();
p2.faceId(); // 사용할 수 없음
p2.appleMusic(); // 사용할 수 없음
// 참조변수의 클래스타입이 생성된 객체의 상위 클래스타입인 경우
// 참조변수 p3은 Phone객체를 참조하고 있음
// 참조변수 p3은 Phone객체, Object객체의 멤버변수와 멤버메소드를 사용할 수 있음
Phone p3 = new Iphone();
p3.tel = "010-1111-1111";
p3.call();
p3.ip = "100.20.200.10"; // 사용할 수 없음
p3.email = "hong@gmail.com"; // 사용할 수 없음
p3.web(); // 사용할 수 없음
p3.mail(); // 사용할 수 없음
p3.faceId(); // 사용할 수 없음
p3.appleMusic(); // 사용할 수 없음
Phone p1 = new Iphone();
에서 Iphone()
에만 있는 고유기능 touchId()
사용하기 (PhoneApp2.java 참고)
Iphone p2 = (Iphone) p1;
p2.touchId();
또는 ((Iphone) p1).touchId();
클래스형변환 연산자에 의해 p1은 참조하는 객체에서 Iphone객체를 검색하고, 검색된 Iphone객체의 참조값을 반환한다.
instanceof
: 참조변수가 참조하는 객체에 지정된 클래스타입의 객체가 포함되어있는지 확인하는 연산자