자바(Java) 참조변수의 형변환(업캐스팅/다운캐스팅)

2023. 2. 9. 19:55·JAVA-기초/JAVA기본
728x90
반응형
SMALL
 참조변수의 형변환?

기본형 변수와 같이 참조변수도 형변환이 가능하다. 단,서로 상속관계에 있는 클래스 사이에서만 가능하다.
자손타입과 조상타입간에 서로 참조변수로의 형변환만 가능하다.
이는 바로 윗 조상이 아닌 최상위 조상인 Object클래스와도 형변환이 가능하다.
업 캐스팅과 다운캐스팅

업 캐스팅
자손 클래스 -> 조상 클래스 : 형변환 생략가능
예시)

다운캐스팅
조상 클래스 -> 자손 클래스 : 형변환 생략불가능

예시를 보면서 이해해보자.

사진에서처럼 조상 클래스1개와 자손 클래스 2개가 있다. 조상클래스와 자손클래스의 형변환이 어떻게 이뤄지는지, 어떤 상황에서 에러가 발생하는지 알아보자.

참고로 자손클래스간의 관계는 전혀 발생하지 않는다.

Keybaord - Neonkeyboard // Keyboard - Neonkeyboard 이처럼 두 가지의 상하 관계만 존재한다.

 

[업캐스팅 특징]

1. 형변환의 생략이 가능하다.

참조변수  k 에 N2라는 네온키보드 객체의 주소값을 넣으려고 한다.

둘 사이에는 형태가 같아야 하기 떄문에 사실상 (Keyboard)N2이다.

하지만 N2가 더 큰 범위(조상 멤버를 포함한 더 많은 변수)를 갖고 있기 때문에 형변환 생략이 가능하다.

 

간단한 정수를 예를 들어보자.

byte는 8비트로 표현이 가능하며 양의 범위로는 2^7-1(127)까지의 표현이 가능하다.

short는 16비트로 2^15-1(32,767)까지 표현이 가능하다.

 

byte범위의 a를 더 넓은 범위를 가진 short b에 집어넣으면 당연히 에러가 없이 잘 대입된다.

이때 (short)a로 꼭 형변환하지 않아도 당연히 b의 범주에는 a가 포함되기 때문에 형변환을 생략할 수 있다.

이와 같은 원리라고 생각하면 된다.

 

[다운캐스팅]

네온사인의 참조변수 N에 k를 형변환하여 대입할때에는 생략을 할 수 없다.

업캐스팅의 반대 원리라고 생각하면된다.

k가 갖고 있는 멤버보다 Neon키보드가 갖고있는 변수가 더 많기 때문에 k가 사용할 수 있는 멤버변수가 늘어나는 것이며 이때 k는 실제 멤버 개수보다 사용할 수 있는 멤버의 개수가 많아지므로 문제가 발생할 수 있다.

 

2. k는 N2의 메서드를 사용할 수 없다.

k는 N2의 인스턴스를 참조할수 있어 Neonkeyboard인스턴스를 사용할 수 있지만, 실질적으로 k가 갖고있는 멤버변수에는 N2의 멤버변수가 없기 때문에 NeonSwitch();를 사용할 수 없다.

k가 Neonkeyboard에서 사용할 수 있는 메서드는 k가 갖고있는 변수를 사용한 메서드 뿐이다.

 

 

형변환은 차몾변수의 타입을 변환하는 것이며 인스턴스를 변환하는 것이 아니다.
따라서 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않는다.
단지 참조변수의 형본환을 통해 참조하고 있는 인스턴스에서 사용할 수 있는 멤버의 범위를 조절하는 것이다.
이번에는 Keyboard k =null; 이아닌 Keyboard k = new Keyboard();로 객체를 생성한 후에 형변환을 시도해보자.

보는 바와 같이 32번 줄에 오류가 발생한다. 이유가 뭘까?
K의 인스턴스가 Keyboard이기 때문이다.
참조변수N 은 K의 자손 클래스이기때문에 K를 포함한 더 많은 변수와 클래스를 갖고 있다.
그래서 조상타임의 인스턴스를 자손타입의 참조변수로 참조하는 것이 허용되지 않는다.
다시한번 정리하자면!

1. 상속관계에 있는 타입간의 형변환은 자유롭게 가능하다.
2. 참조변수가 가리키는 인스턴스의 자손타입으로 형변환은 허용되지 않는다.
3. 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요하다.

이래도 이해가 안간다면 댓글 남겨주세용

728x90
반응형
SMALL

'JAVA-기초 > JAVA기본' 카테고리의 다른 글

객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙  (64) 2023.08.12
자바(Java) - 쓰레드란? start와 run의차이  (0) 2023.04.03
자바(Java) 다형성(조상클래스,자손클래스)  (0) 2023.02.09
자바(Java) 인스턴스(객체), 객체 배열  (0) 2023.02.08
자바(Java) - 제어자 주의사항  (0) 2023.02.08
'JAVA-기초/JAVA기본' 카테고리의 다른 글
  • 객체지향 프로그래밍 5가지 설계 원칙, SOLID- 단일책임의 원칙
  • 자바(Java) - 쓰레드란? start와 run의차이
  • 자바(Java) 다형성(조상클래스,자손클래스)
  • 자바(Java) 인스턴스(객체), 객체 배열
공부하고 기억하는 공간
공부하고 기억하는 공간
IT 비전공자로 시작하여 훌륭한 개발자가 되기 위해 공부하고 있는 공간입니다. 틀린 내용이나 부족한 부분이 있으면 댓글로 알려주세요 바로 수정하겠습니다.
    250x250
  • 공부하고 기억하는 공간
    IT - railroad
    공부하고 기억하는 공간
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • 면접 준비 (22)
        • OS (6)
        • Spring Security (0)
        • Java (3)
        • DB (11)
        • Network (3)
      • ElasticSearch (2)
      • Kafka (4)
      • Spring (22)
        • Spring Cloud (7)
        • Security6 (5)
        • JPA (12)
        • 프로젝트 리팩토링 회고록 (4)
        • Logging (8)
        • Batch (2)
      • Redis (17)
        • Redis 개념 (8)
        • Redis 채팅 (5)
        • Redis 읽기쓰기 전략 (1)
      • AWS (11)
      • 리눅스 (29)
        • 리눅스 마스터 2급 (5)
        • 네트워크(기초) (7)
        • 리눅스의 이해 (6)
        • 리눅스의 설치 (2)
        • 리눅스 운영 및 관리 (6)
      • JAVA-기초 (16)
        • JAVA기본 (11)
        • Design Pattern (5)
      • JSP (27)
        • JSP 기본 개념 (10)
        • JSP (1)
      • SQL (1)
      • TIL (36)
      • 문제 풀이 (2)
        • Programmers (9)
        • 백준 문제풀이 (28)
      • JavaScript (10)
      • HTML (17)
      • Ngrinder (1)
        • Ngrinder 문서 정리 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      자바 면접
      redis 채팅
      리눅스
      Til
      Springframework
      자바 반복문
      자바
      CSS
      리눅스마스터2급정리
      Spring Data Redis
      jsp request
      자바기초
      springsecurity
      자바 알고리즘
      JavaScript
      스프링프레임워크
      프로그래머스
      백준
      레디스
      JS
      JSP
      리눅스마스터2급
      자바 면접질문
      HTML
      jsp기초
      spring redis
      java
      자바스크립트
      Spring
      redis
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    공부하고 기억하는 공간
    자바(Java) 참조변수의 형변환(업캐스팅/다운캐스팅)
    상단으로

    티스토리툴바