[JAVA] 변수 3 - 형변환

김민기·2021년 5월 18일
0

Java

목록 보기
4/20
post-thumbnail
post-custom-banner

형변환

자바에서 형변환은 기본형 변수 및 리터럴에 서로 값의 범위가 다른 값을 넣거나, 부모 자식의 상속관계를 갖는 레퍼런스들의 참조관계를 변경할 때를 말하며 명시적 형변환(캐스팅)과 묵시적 형변환(프로모션)으로 구분됩니다.

프로모션

프로모션은 값을 담으려는 기본형 변수의 범위가 더 크거나, 슈퍼클래스(인터페이스) 레퍼런스에 서브클래스의 레퍼런스를 참조하려고 할 때 명시적으로 캐스팅하지 않아도 자동으로 형변환이 되는 것을 말합니다.

기본형

기본형 타입의 산술 연산에서는 더 큰 범위를 갖는 타입으로 자동 형변환되어 실행됩니다.

  • boolean 타입은 다른 타입과 치환될 수 없으므로 형변환이 불가능합니다.
int a = 10;
long b = a;
// b에 자동형변환 된 a 가 저장됩니다.
a = b;

char c = 'a';
a = c;
// a == 61
//char type도 unsigned short와 같은 범위를 갖고 있기 때문에 자동형변환됩니다.

참조형

참조형에서 프로모션은 슈퍼클래스(인터페이스)의 레퍼런스가 서브클래스의 레퍼런스를 참조하는 것을 말하며 이 때도 명시적으로 작성하지 않아도 사용할 수 있습니다.

다만 이 때는 슈퍼클래스에서 서브클래스로 오버라이딩 된 속성만 접근이 가능합니다.

class A {
	int a;
	@Override
	public boolean equals(Object o){
		return (A)o.a == this.a;
	}
	public void happy(){
		System.out.println("happy");
	}
}
//...

//모든 클래스는 Object를 상속하므로 프로모션 가능
Object var1 = new A();

//오버라이딩된 equals 호출 가능
var1.equals(new A());

//슈퍼클래스에 선언되지 않은 속성 접근 불가능(컴파일 에러)
var1.happy();

캐스팅

하지만 반대의 경우는 명시적 형변환을 해야합니다. 또한 기본형 변수의 캐스팅 시 값의 범위를 초과하는 값은 버려질 수 있습니다.

기본형

기본형 변수는 타입 범위로 형변환이 결정되므로 더 큰 범위에서 작은 범위의 값으로 형 변환 시 캐스팅이 필요하며 값이 유실될 수 있습니다.

int a;
long b;
// 이 경우는 명시적형변환을 하지 않으면 컴파일 에러가 발생합니다.
// int 범위를 초과하는 값을 b가 갖고있다면 그 값들은 유실됩니다.
a = (int) b;

참조형

레퍼런스의 캐스팅은 슈퍼클래스의 레퍼런스를 서브클래스가 참조하는 것을 말합니다.

하지만 이 때는 모든 클래스가 캐스팅을 할 수 있는 것이 아닌 슈퍼클래스가 참조하고 있는 실제 인스턴스가 서브클래스의 인스턴스여야만 캐스팅이 가능합니다

class A {
	int a;
	@Override
	public boolean equals(Object o){
		return (A)o.a == this.a;
	}
	public void happy(){
		System.out.println("happy");
	}
}
//...

Object var1 = new A();
//var1 의 실제 인스턴스가 A 이므로 캐스팅 가능
A var2 = (A)var1;

Object var3 = new Object();
//var3의 인스턴스는 Object이므로 ClassCastException
var2 = (A)Object;
  • 이 때 실제 참조 객체가 캐스팅할 레퍼런스의 객체와 같지 않다면 ClassCastException 예외 발생
  • instanceof 를 사용해서 객체 인스턴스 확인
profile
민기1
post-custom-banner

0개의 댓글