[JAVA] Casting(캐스팅 : 형변환)
자바의 데이터형
■ 기본형(Primitive Type)
- Boolean Type(boolean)
- Numeric Type(Short, int, long, float, double, char)
■ 참조형(Reference Type)
- Class Type
- Interface Type
- Array Type
- Enum Type 등
캐스팅(Casting)
- 캐스팅(Casting)은 형변환이라고 부르기도 함
- 객체지향(OOP)에서의 다향성(Polymorphism)에 있어 매우 중요함
- 다형성과 관련
- 종류 : UpCasting, DownCasting
■ 기본형(Primitive Type)의 캐스팅
- 보통 "데이터 손실"을 막기위해 동작
int a = 1.2345; // 컴파일 에러
int newA = (int)1.2345; // 캐스팅
■ 참조형(Reference Type)의 캐스팅
- 기본적으로 캐스팅은 서로 관련이 있는 데이터끼리의 변환을 목표로 함
- 즉 레퍼런스 타입에서는 서로 상속(extends)나 구현(implements) 관계 등에 있지 않은 전혀 다른 두 객체라면,
캐스팅이 일어날 수 없음
Class Candy {
String flavor;
int price;
}
Class Cup {
String shape;
boolean isCover;
}
■ 업 캐스팅(UpCasting)
- 자식 클래스가 부모 클래스 타입으로 캐스팅 되는 것
- Java에서 서브 크랠스는 슈퍼 클래스의 모든 특성을 상속 받음
- 즉 서브 클래슨느 슈퍼 클래스로 취급될 수 있음
예시) 슈퍼 클래스 : 생물, 서브 클래스 : 사람
사람은 생물이다. 라고 할 수 있음
class Human{
// 생략
}
class Student extends Human{
// 생략
}
public class CastingTest {
public static void main(String[] args) {
Student student = new Student();
Human human = student;
// 자식 클래스(Student)가 부모 클래스(Human)타입으로 캐스팅
}
}
package study.test.java;
class Person{
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person{
String age;
public Student(String name) {
super(name); // super 키워드에 대해서는 따로 설명하겠다.
}
}
public class CastingTest {
public static void main(String[] args) {
// student 참조변수를 이용하면 age, name에 접근 가능하다.
Student student = new Student("도리도리");
// person 참조변수를 이용하면 Student 객체의 멤버 중에서 Person 클래스의 멤버에만 접근이 가능하다.
Person person = student; // "업 캐스팅"
person.name = "세진세진";
person.age = "24"; // 컴파일 오류 ~!
}
}
위 코드에서, person 참조변수는 Student 객체를 가르킴
하지만 Person 타입이므로 자신의 클래스에 속한 멤버만 접근 가능하기 때문에 person.age를 했을 때 오류 발생
■ 다운 캐스팅(DownCasting)
- 부모 클래스가 자식 클래스 타입으로 캐스팅 되는 것
- 자신의 고유한 특성을 잃은 서브 클래스의 객체를 복구 시키는 것 (= 업캐스팅 된 상태를 원상태로 다시 되돌림)
- 명시적 타입 지정 필요
- 업캐스팅이 선행 된 후 진행되어야 함
class Human{
// 생략
}
class Student extends Human{
// 생략
}
public class CastingTest {
public static void main(String[] args) {
Human human = new Human();
Student student = (Student) human;
// 부모 클래스(Human)이 자식 클래스(Student)타입으로 캐스팅
// 위의 구문은 오류지만, 이런 식으로 된다는 걸 보여주기 위한 것이니 참고만 하자.
// 실제로 다운캐스팅은 업 캐스팅이 선행된 후 되어야 한다.
}
}