Java - 캐스팅(Casting)
캐스팅(Cating)
캐스팅이란?
- 자바에서 캐스팅은 타입을 변환하는 것이다.
- 이때, 상속 관계에 있는 부모와 자식 클래스 간에는 서로 형 변환이 가능하다.
업 캐스팅
class Human {
}
class Student extends Human {
}
public class Main {
public static void main(String[] args) {
Student student = new Student();
Human human = student; // 자식 클래스인 student는 부모 클래스 타입으로 캐스팅됨
}
}
- 자식 클래스가 부모 클래스 타입으로 캐스팅되는 것을 말한다.
다운 캐스팅
class Human {
}
class Student extends Human {
}
public class Main {
public static void main(String[] args) {
Human human = new Human();
Student student = (Student) human // 부모 클래스인 human이 자식 클래스 타입으로 캐스팅됨
}
}
- 부모 클래스가 자식 클래스 타입으로 캐스팅되는 것을 말한다.
- 위 코드는 오류가 나며, 실제로 다운 캐스팅이 수행되기 위해서는 업 캐스팅이 선행되어야 한다.
업 캐스팅
업 캐스팅이란?
- 자바에서 서브 클래스는 슈퍼 클래스의 모든 속성을 상속받는다. 그렇기 때문에, 서브 클래스는 슈퍼 클래스로 취급될 수 있다.
- 여기서 업 캐스팅이란 서브 클래스의 객체가 슈퍼 클래스 타입으로 형 변환되는 것을 말한다.
- 즉, 슈퍼 클래스의 참조 변수가 서브 클래스로 객체화된 인스턴스를 가리킬 수 있게 된다는 의미이다.
class person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String age;
public Student(String name) {
super(name);
}
}
public class Main {
public static void main(String[] args) {
Student student = new Student("홍길동"); // student 참조변수를 이용하면 age, name 속성에 접근이 가능하다.
Person person = student; // 업 캐스팅 (person 참조변수를 이용하면 name 속성에만 접근이 가능하다.)
person.name = "이순신";
person.age = "20"; // 컴파일 오류
- 위 코드에서 person 참조 변수는 Student 객체는 가리킨다.
- 이때, person 참조 변수는 Person 타입이므로, 자신의 클래스에 속한 멤버에만 접근이 가능하다.
- 이와 같이 업 캐스팅을 하게 되면, Student 객체의 멤버 필드뿐만 아니라 메서드에도 접근이 불가능하게 된다.
- 서브 클래스인 Student는 Person 타입을 상속받았기 때문에 명시적인 타입 캐스팅을 선언하지 않아도 된다.
업 캐스팅을 하는 이유 - 다형성
class 음식 {
public void 간맞추기() {
}
}
class 라면 extends 음식 {
@Override
public void 간맞추기() {
System.out.println("라면 간 맞추기");
}
}
class 볶음밥 extends 음식 {
@Override
public void 간맞추기() {
System.out.println("볶음밥 간 맞추기");
}
}
class 피자 extends 음식 {
@Override
public void 간맞추기() {
System.out.println("피자 간 맞추기");
}
}
class 사람 {
public void 음식먹기(음식 어떤음식) {
어떤음식.간맞추기();
}
}
public class CastingTest {
public static void main(String[] args) {
사람 사람01 = new 사람();
음식 음식01 = new 라면(); // 업 캐스팅
사람01.음식먹기(음식01); // "라면 간 맞추기" 출력
}
}
- 위 코드에서, 사람 클래스의 참조 변수인 "사람01"이 "음식먹기" 메서드를 실행시키면 "라면 간 맞추기"가 출력된다.
- 이처럼 업 캐스팅을 통해 "사람01" 변수는 어떠한 음식 객체를 받든 지 간에 오버 라이딩된 메서드를 호출할 수 있다.
- 슈퍼 클래스(음식)가 여러 서브 클래스(라면, 볶음밥, 피자)의 메서드를 호출하는 것과 같이 다형성의 장점을 위해 업 캐스팅이 사용된다.
다운 캐스팅
다운 캐스팅이란?
Person person = new Student(); // 업 캐스팅
Student student = (Student) person; // 다운 캐스팅
- 다운 캐스팅은 자신의 고유한 특성을 잃은 서브 클래스의 객체를 복구시키는 것이다.
- 업 캐스팅과 다른 점은 명시적으로 타입을 지정해주어야 하며, 업 캐스팅이 선행된 후 진행되어야 한다.
class Person {
String name;
public Person(String name) {
this.name = name;
}
}
class Student extends Person {
String age;
public Student(String name) {
super(name)
}
}
public class Main {
public static void main(String[] args) {
Person person = new Student("홍길동"); // 업 캐스팅
Student student = (Student) person; // 다운 캐스팅
student.name = "임꺽정"; // name 속성에 접근
student.age = "27"; // age 속성에 접근
}
}
- 위 코드와 같이 다운 캐스팅을 진행한 후, 서브 클래스의 속성에 접근이 가능하다.
출처
ㆍ https://velog.io/@sezzzini/Java-Casting