☕Java: 메소드의 재정의와 클래스 형변환
강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 다소 부정확할 수 있습니다.
메소드 재정의(overriding)
-
상위 클래스로부터 상속받은 메소드를 그대로 이용하지 않고 하위 클래스(자기 자신)에 맞게 해당 메소드의 구현내용만 재정의하는 것.
⇒ 반환타입, 메소드 이름, 매개변수는 부모 클래스의 메소드와 일치해야 한다.
-
중복정의와 다르다. 중복정의는 매개변수만 다르고 비슷한 구현내용을 다루는 것.
-
메소드 재정의의 목적
- 구현 내용의 차이만 있는 기능(
ex. 흑백 출력 - 컬러 출력
)은 부모클래스와 자식클래스들이 동일한 이름의 메소드로 구현하게 한다. - 상속관계에 있는 모든 클래스들에서 재정의된 메소드를 사용함으로써 사용법이 동일해진다.
- print()와 colorPrint()를 서로 다른 메소드로 이용하지 않고 동일한 print()를 재정의함으로써 사용법을 동일하게 한다. 이는 다형성 개념으로 더 정확하게 설명할 수 있다.
- 구현 내용의 차이만 있는 기능(
💡 api document에서 확인해 보면,
Methods declared in (특정 상위클래스) 목록에서 ‘재정의된 메소드’는 제외된다.
클래스의 형변환
- 기본자료형타입의 변수처럼 참조형변수도 형변환이 가능하다.
기본자료형 타입의 형변환. ‘문자열’은 참조자료형이다.
- 클래스의 형변환은 서로 상속관계에 있는 객체 사이에서만 형변환이 가능하다.
- case 1 하위클래스타입 객체를
상위클래스 타입의 참조변수에 저장
(상위클래스 타입의 참조변수는 하위클래스 타입의 객체를 참조할 수 있다.)
Phone p1 = new FeaturePhone();
⇒ 자동으로 처리된다.
참조변수는 자신의 타입에 맞는 부모 객체의 참조값을 저장하고,
메소드를 실행시킬 때 ‘실제 생성 객체’에서재정의된 메소드
가 있으면 그것을 실행시켜준다.
- case 1 하위클래스타입 객체를
(실제 데이터의 구조와 이미지에 차이가 있지만, 편한 이해를 위해 참고할 것)
- case 2 상위클래스타입 객체를
하위클래스 타입의 참조변수에 저장
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 = "[email protected]";
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 = "[email protected]";
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 = "[email protected]"; // 사용할 수 없음
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
: 참조변수가 참조하는 객체에 지정된 클래스타입의 객체가 포함되어있는지 확인하는 연산자
Author And Source
이 문제에 관하여(☕Java: 메소드의 재정의와 클래스 형변환), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@yoondgu/Java-메소드의-재정의와-클래스-형변환저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)