Java - Casting (업캐스팅 & 다운캐스팅)

idkwhattodo·2022년 8월 29일
0

Java 개념

목록 보기
9/19
post-thumbnail

1. 캐스팅이란?

변수가 원하는 정보를 다 가지고 있는 것.

int a = 0.1 // (1) 에러 발생 X
int b = (int) true // (2) 에러 발생 O, boolean은 int로 캐스팅 불가

(1)은 double형이지만, int로 될 정보를 가지고 있음.

(2)의 경우, true는 int형이 될 정보를 가지고 있지 않음.


2. 캐스팅이 필요한 이유

  1. 다형성 : 오버라이딩된 함수를 분리해서 활용할 수 있다.

  2. 상속 : 캐스팅을 통해 범용적인 프로그래밍이 가능하다.


3. 형변환의 종류

1) 묵시적 형변환 : 캐스팅 자동 발생 (업캐스팅)

Parent p = new Child();

/*
Parent를 상속받은 Child는 Parent의 속성을 포함하고 있기 때문에,
(Parent) new Child()를 할 필요가 없다.
*/

2) 명시적 형변환 : 캐스팅할 내용을 적어줘야 함 (다운캐스팅)

Parent p = new Child();
Child c = (Child) p;

/*
다운캐스팅은 업캐스팅이 발생한 이후에 적용한다.
*/

예시

class Parent {
	int age;

	Parent() {}

	Parent(int age) {
		this.age = age;
	}

	void printInfo() {
		System.out.println("Parent Call");
	}
}

class Child extends Parent {
	String name;

	Child() {}

	Child(int age, String name) {
		super(age);
		this.name = name;
	}

	@Override 
	void printInfo() {
		System.out.println("Child Call");
	}
}

public class test {
    public static void main(String[] args) {
        Parent p = new Child();
        
        p.printInfo(); // 문제1 : 출력 결과는?
        Child c = (Child) new Parent(); //문제2 : 에러 종류는?
    }
}

/*
문제 1 정답 => Child Call
자바에서는 오버라이딩 된 함수를 동적 바인딩하기 때문에,
Parent에 담겼어도 Child의 printinfo() 함수를 불러오게 된다.
*/

/*
문제 2 정답 => Runtime Error
컴파일 과정에서는 데이터형의 일치만 따지기 때문에,
따로 (Child)로 형변환을 해주어서 컴파일러는 문법이 맞다고 판단하여 넘어가게 된다.
하지만, 런타임 과정에서 Child 클래스에 Parent 클래스를 넣을 수 없음을 판단, 런타임 에러가 나오게 된다.
*/
profile
공부겅부

0개의 댓글