☕Java: 메소드의 재정의와 클래스 형변환

yoondgu·2022년 3월 17일
0

Java 

목록 보기
4/18

강의 수강 중 작성한 노트에서 내용을 발췌, 이응수 강사님 강의 의 노트와 이미지를 참조하고 있습니다.
스스로 이해를 위해 직접 쓴 문장들의 경우 다소 부정확할 수 있습니다.

메소드 재정의(overriding)


  • 상위 클래스로부터 상속받은 메소드를 그대로 이용하지 않고 하위 클래스(자기 자신)에 맞게 해당 메소드의 구현내용만 재정의하는 것.

    ⇒ 반환타입, 메소드 이름, 매개변수는 부모 클래스의 메소드와 일치해야 한다.

  • 중복정의와 다르다. 중복정의는 매개변수만 다르고 비슷한 구현내용을 다루는 것.

  • 메소드 재정의의 목적

    • 구현 내용의 차이만 있는 기능(ex. 흑백 출력 - 컬러 출력)은 부모클래스와 자식클래스들이 동일한 이름의 메소드로 구현하게 한다.
    • 상속관계에 있는 모든 클래스들에서 재정의된 메소드를 사용함으로써 사용법이 동일해진다.
      • print()와 colorPrint()를 서로 다른 메소드로 이용하지 않고 동일한 print()를 재정의함으로써 사용법을 동일하게 한다. 이는 다형성 개념으로 더 정확하게 설명할 수 있다.

💡 api document에서 확인해 보면,
Methods declared in (특정 상위클래스) 목록에서 ‘재정의된 메소드’는 제외된다.


클래스의 형변환


  • 기본자료형타입의 변수처럼 참조형변수도 형변환이 가능하다.

기본자료형 타입의 형변환. ‘문자열’은 참조자료형이다.

  • 클래스의 형변환은 서로 상속관계에 있는 객체 사이에서만 형변환이 가능하다.
    • case 1 하위클래스타입 객체를 상위클래스 타입의 참조변수에 저장
      (상위클래스 타입의 참조변수는 하위클래스 타입의 객체를 참조할 수 있다.)
      Phone p1 = new FeaturePhone(); ⇒ 자동으로 처리된다.
      참조변수는 자신의 타입에 맞는 부모 객체의 참조값을 저장하고,
      메소드를 실행시킬 때 ‘실제 생성 객체’에서 재정의된 메소드가 있으면 그것을 실행시켜준다.


(실제 데이터의 구조와 이미지에 차이가 있지만, 편한 이해를 위해 참고할 것)

  • 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 = "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 : 참조변수가 참조하는 객체에 지정된 클래스타입의 객체가 포함되어있는지 확인하는 연산자

0개의 댓글