강잇
강이의 개발블로그
강잇
전체 방문자
오늘
어제
  • 분류 전체보기 (102)
    • Langauge (32)
      • Java-basic (29)
      • Java (3)
    • SpringBoot (7)
    • Algorithm (5)
      • BAEKJOON (5)
    • WEB (7)
      • HTML & CSS (7)
    • DB (1)
      • MySQL (1)
    • OS (17)
      • Mac (2)
      • Linux (4)
      • Terminal Command (11)
    • Computer Science (7)
      • Hard ware (1)
      • Database (1)
      • Data structure (2)
      • Algorithm (2)
      • Network (1)
    • Git (5)
      • 개념 (1)
      • 활용 (1)
      • Trouble Shooting (2)
    • ETC. (13)
      • Install (6)
      • IntelliJ (1)
      • Eclipse (2)
      • Error (3)
      • Tip (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 메서드
  • til
  • 백준
  • 메소드
  • CSS 박스 크기 설정
  • 자바
  • 알고리즘 공부
  • CSS 속성

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
강잇
Langauge/Java-basic

[Java] 업 캐스팅과 다운 캐스팅

[Java] 업 캐스팅과 다운 캐스팅
Langauge/Java-basic

[Java] 업 캐스팅과 다운 캐스팅

2022. 7. 30. 23:29

타입에 따른 업캐스팅과 다운캐스팅

기본자료형

  • 업캐스팅 : 범위가 좁은 쪽에서 넓은 쪽으로 캐스팅
  • 다운캐스팅 : 범위가 넓은 쪽에서 좁은 쪽으로 캐스팅

객체

  • 업캐스팅 : 하위 클래스에서 상위 클래스로 캐스팅
  • 다운캐스팅 : 상위 클래스에서 하위 클래스로 캐스팅

객체의 업 캐스팅과 다운 캐스팅

객체의 업 캐스팅은 항상 할 수 있으며, 명시적으로 적어주지 않아도 컴파일러가 대신 넣어준다.

객체의 다운 캐스팅은 반드시 명시적으로 적어주어야 하며, 또한 명시적으로 적어도 다운 캐스팅 자체가 안 될 때가 있다.

잘못된 다운 캐스팅을 수행하면 'ClassCastException'이라는 예외가 발생하며 프로그램이 종료된다.

public class Main {
    public static void main(String[] args) {
    
        Animal animal1 = new Animal();
        Cat cat1 = new Cat();

        // 업캐스팅 Cat -> Animal
        Animal animal2 = (Animal)cat1; // 업 캐스팅

        // 다운 캐스팅 Animal -> Cat
        Cat cat2 = (Cat) animal2; // 다운 캐스팅
        Cat cat3 = (Cat) animal1; // 다운 캐스팅 -> 'ClassCastException' 예외 발생, 프로그램 종료
    }
}
class Animal {
}
// 동물의 기능과 속성을 상속한 Cat 클래스
class Cat extends Animal {
}

다운 캐스팅 시 메모리 구조

일상적인 예시 (개인적인 예)

다운 캐스팅 예외 발생

  1. 예를 들어 다음과 같은 방 구조에서 큰 방에서 지내는 A군이 있다. -> 큰 방 A1 = new 큰 방();
  2. A군에게 작은 방으로 가서 컴퓨터를 하라고 한다. -> 작은 방 A2 = (작은 방)A1;
  3. A2.컴퓨터(); -> 컴퓨터가 없어 할 수 없음. (예외 발생)

다운 캐스팅 가능

  1. 다음은 위와 A군의 상황을 보고 B군은 작은 방에 자기의 물건을 옮겨 놓고 큰 방에서 지내기로 함. -> 큰 방 B1 = new 작은 방();
  2. B군에게 작은 방으로 가서 컴퓨터를 하라고 한다. -> 작은 방 B2 = (작은 방) B1;
  3. B2.컴퓨터(); -> 컴퓨터가 있으므로 할 수 있음.

자바의 메모리 예시

상위 클래스 자료형 + 하위 클래스 생성자

  • 하위 클래스 생성자로 인스턴스를 생성하면 상위 클래스의 인스턴스가 먼저 생성되며 하위 클래스 인스턴스가 완성된다.
    -> 하위 클래스 인스턴스 내부에 상위 클래스 인스턴스가 만들어짐
  • 여기서 선언된 자료형은 실제 인스턴스에서 자신이 선언된 자료형의 인스턴스를 가리키는 역할을 하며
    참조 변수는 하위 클래스 인스턴스 내부에 있는 상위 클래스의 인스턴스를 가리키게 된다.
  • 따라서 다운 캐스팅을 진행하게 되면 상위 클래스 인스턴스 외부에 있는 하위 클래스를 가리키게 되며 다운 캐스팅이 진행된다.

 

옳바른 다운 캐스팅 과정

상위 클래스 자료형 + 상위 클래스 생성자

  • 상위 클래스 생성자로 인스턴스를 생성하게 되면 상위 클래스 인스턴스만 생성하게 된다.
  • 여기서 하위 클래스로 다운 캐스팅을 하면 가리킬 것(하위 클래스의 인스턴스)이 존재하지 않아 예외가 발생하며 프로그램이 종료된다.

예외가 발생하는 다운 캐스팅 과정

캐스팅 조건

  • 클래스 사이에 상속 관계가 존재해야 한다.
  • 다운 캐스팅을 하려면 힙 메모리 내부에 다운 캐스팅하려는 인스턴스가 존재해야 한다.
  • 즉, 인스턴스 생성 시 어떤 생성자를 통해 인스턴스를 생성했는지에 따라 가능 여부가 나눠진다.
저작자표시 (새창열림)

'Langauge > Java-basic' 카테고리의 다른 글

[Java] 메서드 오버라이딩(Method Overriding)  (0) 2022.07.31
[Java] instanceof : 캐스팅 가능 여부 확인  (0) 2022.07.30
[Java] 상속 관계와 포함 관계  (0) 2022.07.29
[Java] final 키워드  (0) 2022.07.25
[Java] static 키워드  (0) 2022.07.24
  • 타입에 따른 업캐스팅과 다운캐스팅
  • 객체의 업 캐스팅과 다운 캐스팅
  • 다운 캐스팅 시 메모리 구조
  • 캐스팅 조건
'Langauge/Java-basic' 카테고리의 다른 글
  • [Java] 메서드 오버라이딩(Method Overriding)
  • [Java] instanceof : 캐스팅 가능 여부 확인
  • [Java] 상속 관계와 포함 관계
  • [Java] final 키워드
강잇
강잇
학습한 내용을 정리 및 기록하는 블로그

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.