-
[Java] 업, 다운 캐스팅이란카테고리 없음 2022. 10. 24. 01:39
21번째로 포스팅하게 된 내용은 업캐스팅, 다운캐스팅에 대한 내용입니다.
[ 캐스팅 ]
캐스팅이란 타입을 변환하는 것을 말하여 형변환이라고도 한다.
자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로 간의 형변환이 가능하다.[ 업캐스팅 ]
서브 클래스의 객체가 슈퍼 클래스 타입으로 형변환 되는 것
- 자바에서 서브 클래스는 슈퍼 클래스의 모든 특성을 상속받기 때문에 서브 클래스는 수퍼 클래스로 취급될 수 있음
- 슈퍼 클래스 레퍼런스 변수가 서브 클래스로 객체화된 인스턴스를 가리킬 수 있게 됨
- 하위 클래스의 정보를 담을 수 있는 객체에 상위클래스의 자료형을 부여해서, 상위클래스처럼 사용하게 하는 것
업캐스팅된 레퍼런스
- 객체 내에 슈퍼 클래스의 멤버만 접근 가능
[ 사용이유 ]
다형성을 이용해서 코드 재사용성을 높이기 위해서
상속을 받은 서브클래스가 몇 개이든 하나의 인스턴스로 묶어서 관리하기 위해서
인스턴스 1개로 잡아서 서브클래스를 담아놓고 관리하기 위해서
슈퍼클래스가 관리 가능
-> 다형성: 메소드를 각각 다른 형태로 사용
-> 슈퍼클래스를 여러 가지 형태로 만들 수 있음
ex)
class Person{ String name; String id; public Person(String name){ this.name = name; } } class Student extends Person{ String grade; String department; public Student(String name){ super(name); } } public class UpcastingEx { public static void main(String[] args) { Person p; Student s = new Student("이승민"); // 서브 클래스 객체를 우선 생성하고 생성자에 "이승민"을 넣어서 name의 값을 초기화 시켜줌 p=s; // 업캐스팅 // 이 경우 객체는 Student형이지만 Person형 참조변수로 가르키므로 Student의 멤버 변수는 참조 할 수 없다 System.out.println(p.name); // 오류 없음 // Person형의 멤버 변수이므로 사용 할 수 있음 p.grade = "A"; // 컴파일 오류 // grade는 Student형의 멤버이므로 사용이 불가능 하다 (업캐스팅 하였기 때문) p.department = "com"; // 컴파일 오류 // department는 Student형의 멤버이므로 사용이 불가능 하다 (업캐스팅 하였기 때문) } }
[ 다운캐스팅 ]
자신의 고유한 특성을 잃은 서브클래스의 객체를 다시 복구시켜주는 것을 말함
- 업케스팅 된 것을 다시 원상태로 돌리는 것
- 업케스팅이 선행 되어야만 다운캐스팅 할 수 있음
- 명시적으로 타입을 지정해야 함
class Person{ String name; String id; public Person(String name){ this.name = name; } } class Student extends Person{ String grade; String department; public Student(String name){ super(name); } } public class UpcastingEx { public static void main(String[] args) { Person p; Student s = new Student("이승민"); // 서브 클래스 객체를 우선 생성하고 생성자에 "이승민"을 넣어서 name의 값을 초기화 시켜줌 p=s; // 업캐스팅 // 이 경우 객체는 Student형이지만 Person형 참조변수로 가르키므로 Student의 멤버 변수는 참조 할 수 없다 System.out.println(p.name); // 오류 없음 // Person형의 멤버 변수이므로 사용 할 수 있음 Student s1 = (Student)p; // 다운캐스팅 // 업캐스팅 된 p를 다운캐스팅으로 객체 p를 Student형 참조변수를 가르키게 함 s1.grade = "A"; // 오류 없음 // Student형의 멤버 변수이므로 사용 할 수 있음 s1.department = "com"; // 오류 없음 // Student형의 멤버 변수이므로 사용 할 수 있음 } }