Java의 타입 변환

froajnzd·2024년 7월 7일
0

java

목록 보기
3/11
post-thumbnail

Java에는 타입 변환이 있다. 타입 변환? Type? 무엇일까? 이제 알아보도록 하자

타입 변환

변수나 상수, 혹은 리터럴의 타입을 다른 타입으로 바꾸는 것을 말한다.
종류에는 자동 타입 변환, 강제 타입 변환이 있다.

자동 타입 변환 (Promotion)

다음과 같이 치환문(=)이나 수식 내에서 타입이 일치하지 않을 때, 컴파일러가 오류 대신, 작은 타입을 큰 타입으로 자동 변환한다.

long m = 25; 		   // 리터럴 25는 int 타입. 25가 long 타입으로 자동 변환
double d = 3.14 * 10;  // 실수 연산을 위해 10이 10.0으로 자동 변환

Java에서 자동 타입 변환을 할 수 있는 방향이다. 작은 타입에서 큰 타입으로 가능하다.

강제 타입 변환 (Casting)

개발자가 강제로 타입 변환을 지시하는 경우이다.
n에 300을 저장하고

int n = 300;

n값을 byte 변수 b에 저장하면

byte b= n; // 컴파일 오류. int타입은 byte 타입으로 자동 변환 안됨

변수 n에 저장된 값 300은 byte타입(0~255범위)의 범위보다 크기 때문에, 컴파일러가 자동 변환을 하게 되면, b에 300이 저장되지 않고 256을 뺀 나머지(300%256=44)값 44가 저장된다.

이처럼 큰 타입의 값을 작은 타입의 값으로 변환할 때, 컴파일러는 자동 변환 대신 컴파일 오류를 발생시킨다.

개발자가 이 사실을 알고도 타입 변환을 원한다면, 다음과 같이 () 안에 타입을 명시하여 강제 타입 변환을 지시해야 한다.

byte b = (byte) n; // n을 byte 타입으로 강제 변환. b=44

강제 타입 변환을 한다면 컴파일 오류만 나지 않고, 여전히 300에서 256을 초과한 만큼, 즉 44가 변수 b에 저장되어 데이터 손실이 발생한다!

double d = 1.9;
int n = (int)d; // 강제 타입 변환으로 n은 1이 됨

클래스에서도 타입 변환을 할 수 있다.

클래스 타입 변환은 상속 관계에 있는 클래스에서 발생한다.
종류로는 클래스 자동 타입 변환과 클래스 강제 타입 변환이 있는데
Upcasting 과 Downcasting으로도 자주 불린다.

클래스 자동 타입 변환 (Upcasting)

업캐스팅은 컴파일러에 의해 수행된다.
상속 관계에서 자식이 부모 타입으로 타입 변환하는 것이다.

Parent o = new Child();

클래스 자동 타입 변환에는 두 가지 주의 사항이 있다.

  1. 오버라이딩한 메소드는 클래스 타입 변환을 하더라도 자식 메소드를 호출합니다.
  2. 클래스 타입 변환을 한 클래스는 더이상 자식 클래스만의 멤버들을 호출할 수 없습니다.

클래스 강제 타입 변환

부모 타입을 자식으로 변환하는 것이다.
자식 타입이 부모 타입으로 자동 타입 변환되고 난 후 다시 자식 타입으로 타입 변환을 할 때만
강제 타입 변환이 가능하다.

Parent parent = New Child();
Child child = (Child) Parent;

그럼 클래스 강제 타입 변환의 목적은?

자식 클래스에서 선업한 필드/메소드를 사용하기 위해!

드디어 마무리로

여기까지 타입변환..에 걸쳐 클래스의 업캐스팅, 다운캐스팅까지 살펴보았다.
그럼 여기서 궁금증이 들 텐데 ,,, (나만그럴지도?)

왜 업캐스팅을 사용하나? ? 처음부터 업캐스팅 하지 말고 클래스 그대로 사용하면 될 거늘!!
왜 업캐스팅을 해서 멤버 변수 / 메소드 사용을 제한하느냔 말이야!

그 이유는 공통적으로 할 수 있는 부분을 만들어서 다루기 간단하게 하기 위함이다.

상속 관계에서 상속 받은 서브 클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리할 수 있기 때문이다.

같은 부모를 가지고 있는 여러 자식 클래스를 '하나의 부모 클래스'로 관리해 용이하게 만든다.

예를 들어보자,

Chevrolet[] ches = new Chevrolet[];
ches[0] = new Chevrolet();
ches[1] = new Chevrolet();

Benz[] bzs = new Ben[];
bzs[0] = new Benz();
bzs[1] = new Benz();

Porsche[] pochs = new Porsche[];
pochs[0] = new Porsche();

위와 같은 식으로 차 종류별로 관리하던 차 배열들을 아래와 같이 하나의 자료형으로 관리할 수 있다는 장점을 가지게 된다!

Car[] cars = new Car[];
cars[0] = new Chevrolet();
cars[1] = new Chevrolet();
cars[2] = new Benz();
cars[3] = new Benz();
cars[4] = new Porsche();

이런 업캐스팅으로 사용을 막히게 된 자식 클래스의 메소드들은 이후 다운캐스팅하여 사용할 수 있다.

profile
Hi I'm 열쯔엉

0개의 댓글