※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] 타입 변환 (type conversion) 이란?
하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환이라 하며, Java에는 자동 타입 변환과 강제 타입 변환이 있다. 기본적으로 크기가 작은 타입에서 큰 타입으로의 타입 변환은 생략할 수 있고(자동 타입 변환), 자동 타입 변환이 되지 않는 경우에는 타입 캐스트 연산자를 활용하여 강제 타입 변환을 해야 한다(기본 데이터 타입의 경우 데이터 손실 발생할 수 있다).
C/C++과 유사한 기본 데이터 타입에서의 타입 변환은 간단히 정리하도록 하고, 본문에서는 Java의 클래스 타입 변환에 초점을 두도록 하겠다.
byte → short / char → int → long → float → double |
기본 데이터 타입에서는 위 순서로 자동 타입 변환이 이루어질 수 있다. 단, char 타입이 int로 타입 변환할 때에는 '유니코드 값'이 저장되며 음수를 저장할 수 있는 byte 타입은 char 타입으로 자동 타입 변환할 수 없다.
[ 2 ] 자동 타입 변환
다형성에서 언급했듯이 Java는 자식 클래스에서 부모 클래스로 자동 타입 변환하는 것을 허용하기에 부모 클래스 타입의 참조변수가 자식 클래스의 인스턴스를 참조하는 것이 가능하다.
즉,
Child c1 = new Child();
Parent p1 = c1;
위 코드의 경우 타입이 Child 클래스인 변수 c1은 부모 클래스인 Parent 로 자동 타입 변환이 이루어진다는 의미이다.
물론 Parent p1 = new Child(); 도 가능하고, 바로 위의 부모가 아닌 상속 계층에서의 상위 클래스로도 자동 타입 변환이 가능하다.
단, 부모 클래스 타입 변수가 자식 클래스 인스턴스를 참조한 후에는 자식 클래스를 참조하고 있음에도 불구하고, 부모 클래스 멤버에만 접근할 수 있도록 한정된다. 즉, 부모 클래스에는 없고 자식 클래스에만 있는 멤버에는 접근할 수 없다.
예외) 자식 클래스에서 Overriding한 메소드라면 Overriding된 메소드가 대신 호출된다.
[ 3 ] 강제 타입 변환
자동 타입 변환 이후에는 부모 클래스 멤버에만 접근할 수 있는데, 강제 타입 변환으로 다시 부모 클래스 타입을 자식 클래스 타입으로 변환하면 자식 클래스 멤버에 접근할 수 있다.
단, 모든 부모 클래스 타입의 변수를 자식 클래스로 강제 타입 변환할 수 있는 것은 아니다. 부모 클래스로 자동 타입 변환이 나타난 변수만 자식 클래스로 강제 타입 변환할 수 있다.
즉,
Parent p1 = new Child();
Child c1 = (Child) p1;
처럼 자동 타입 변환 이후에만 강제 타입 변환이 가능하다.
그렇다면 자동 타입 변환이 나타나지 않은 변수를 강제 타입 변환하면 어떻게 될까?
Parent p1 = new Parent();
Child c1 = (Child) p1;
정상적으로 컴파일은 되나 런타임 에러(ClassCastException)가 발생하는 것을 확인할 수 있다. 컴파일러는 "타입의 일치 여부"만 검사하기 때문에 개발자가 작성한 (Child) 타입 캐스트 연산자를 바탕으로 컴파일 시 문제가 없다고 판단한다. 하지만, 런타임에서 강제 타입 변환이 불가함을 확인하여 에러가 발생한다.
[ 3 - 1 ] 강제 타입 변환 예시
강제 타입 변환의 예시로는 Object 클래스의 equals 메소드를 Overriding 하는 것이 있다.
class Student {
String name;
Student(String name) {
this.name = name;
}
public boolean equals(Object object) {
if(object instanceof Student) {
// object가 Student 타입이라면 강제 타입 변환한다.
Student student = (Student)object;
return this.name.equals(student.name);
}
return false;
}
}
name 필드를 가지는 Student 클래스에서 name이 같으면 동등 객체로 취급하도록 equals 메소드를 Overriding 했다.
(1) equals의 매개변수 타입은 Object이다.
(2) 모든 클래스는 Object 클래스를 상속받으므로 모든 클래스의 객체가 equals의 인자로 전달될 수 있다. (자동타입변환 및 다형성)
(3) 매개변수 object가 Student 타입이라면 name 필드에 접근하기 위해 Student로 강제 타입 변환한다. (2)단계에서 자동 타입 변환이 나타났으므로 강제 타입 변환이 가능하다.
[ 참고자료 ]
http://www.tcpschool.com/java/java_datatype_typeConversion
코딩교육 티씨피스쿨
4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등
tcpschool.com
https://kephilab.tistory.com/27
3. Java 자바 - 자동 타입 변환, 강제 타입 변환
타입 변환 자바에는 두 종류의 타입 변환이 있다. - 자동 타입 변환 (묵시적) - 강제 타입 변환 (명시적) 1. 자동 타입 변환 프로그램 실행 도중에 자동으로 타입 변환이 일어난다. 작은 크기 가지
kephilab.tistory.com
'Programming > Java' 카테고리의 다른 글
[Java] Enum 클래스 (1) | 2022.08.29 |
---|---|
[Java] Object 클래스 (0) | 2022.08.25 |
[Java] 다형성(Polymorphism) (0) | 2022.08.16 |
[Java] 추상 클래스(abstract class)와 인터페이스(interface) (1) | 2022.08.11 |
[Java] 패키지(Package) (0) | 2022.08.05 |