본문 바로가기
CSE/CP1 이론

CP1_07.객체지향 프로그래밍_Advanced_5. 클래스 타입의 형변환

by 0/0 2024. 6. 19.
1. Basics 클래스, 객체, 변수, 메서드 // 생성자, 초기화
2. Advanced 상속, 오버라이딩 // package, import, modifiers, 클래스 타입의 형변환, 다형성 // 추상클래스, interface, 내부클래스

// '다형성' 내용 안에 '클래스 타입의 형변환' 내용이 있다.
5. 클래스 타입의 형변환 1. 참조 변수와 객체의 타입 관계
2. 참조변수의 형변환
3. instanceof 연산자
4. 참조형 매개변수와 객체의 타입의 관계

와 이 파일만 이름 형식 다르게 해놓아서 공부 안 할 뻔,,, 휴..! 24.6.18 Cp1 Final exam D-1

 

5.1. 참조 변수와 객체의 타입 관계

  • 참조 변수의 타입
    -한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 함
    -상위 클래스 타입의 참조변수로 하위 클래스의 객체를 참조할 수 있음
    -상황: 상위 class Tv, 하위 class CaptionTv
    Tv t1 = new CaptionTv(); // 'CaptionTv 객체를 그냥 Tv로 다루겠다'는 의미
    (CaptionTv t3 = new Tv(); -> X)

Tv t = new CaptionTv();

  • 하위 클래스 객체를 상위 클래스 타입 변수에 지정하면(Tv t1 = new CaptionTv();)
    -타입은 문제 없지만
    -이후 t1.caption() 등 하위 클래스 고유의 행위는 t1을 통해서 불가능

  • 하위타입의 클래스 변수로 상위타입의 인스턴스 참조 불가
    CaptionTv c = new Tv(); //Error
    -컴파일러가 오류를 안 내면,
    c.text = 'Hello!'도 오류가 없음
    c는 CaptionTv 타입 변수고
    text는 CaptionTv에 존재하는 변수이므로
    but
    c가 가리키는 객체는 원래 Tv 객체(text, caption() 없음)
    *컴파일러에서 넘어가면, 나중에 런타임 에러 발생 소지 있음

5.2 참조변수의 형변환

  • 하위 클래스 객체를 상위 클래스 타입 변수에 지정하면 억울함
    Tv t = new CaptionTv();
    -타입은 문제 없지만
    -text, caption()을 보유하는 객체임에도 t.text;, t.caption(); 불가
  • 억울함 해결방법 - 형변환
    Tv t = new CaptionTv();
    Caption Tv c3 = (CaptionTv) t;
    -int 같은 기본 타입처럼 형변환 가능
    -단, 상위 클래스 <-> 하위 클래스 일 때만
    *업캐스팅: 하위 -> 상위타입 : 형변환 생략가능
    *다운캐스팅: 상위 -> 하위타입: 형변환 생략불가
  • 예제코드

 

5.3 instanceof 연산자

  • 형변환의 문제
    -참조변수가 참조하는 인스턴스의 실제 타입을 모르고 형변환을 해도 일단 허락한다

  • instanceof 연산자
    목적-참조변수가 참조하는 인스턴스의 실제 타입을 알아보기 위해 사용
    형태-참조변수 instanceof 클래스명(타입)
    연산결과-T/F
    *연산결과가 T면, 인스턴스가 해당 타입이므로 형변환이 안전

instanceof 연산자

 

5.4 참조형 매개변수와 객체 타입의 관계

  • 참조형 매개변수
    참조형 매개변수는 메서드 호출시, 자신과 같은 타입 또는 하위 타입의 인스턴스를 넘겨줄 수 있다

참조형 매개변수와 객체 타입의 관계