-
Java - 캐스팅(Casting)Language/Java 2022. 2. 19. 12:08
캐스팅(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
728x90'Language > Java' 카테고리의 다른 글
Java - 동일성(identity) & 동등성(equality) (0) 2022.03.03 Java - Call by Value & Call By Reference (0) 2022.02.21 Java - 문자열 클래스 (0) 2022.02.19 Java - Boxing & Unboxing (0) 2022.02.19 Java - Primitive Type & Reference Type (0) 2022.02.19