티스토리 뷰
#. 객체의 형변환
> 형변환(Casting)
ㄴ 묵시적 형변환(Promotion)
- 형변환 연산자를 사용하지 않아도 자동으로 이루어지는 경우 = 자동 형변환
- ex) 4btye의 int형 데이터를 8byte double 형으로 변환
1 2 | int age = 25; double avgAge = age; // 25.0, (double) | cs |
ㄴ 명시적 형변환(Demotion)
- 더 작은 범위를 나타내는 데이터 타입으로 변환되는 경우 = 축소 형변환
- ex) 8byte의 double형 데이터를 4byte int 형으로 변환
1 2 | double avgAge = 23.86; int age = (int)avgAge; // 24, 문장에서 명시적 형변환 | cs |
> 객체 형변환
- 객체 참조변수의 경우에도 형변환이 이루어짐
- 객체 참조변수들 간의 대입 규칙 [ 부모클래스(leftObjRef) = 자식클래스(rightObjRef) ]
ㄴ 왼쪽 항과 오른쪽 항의 객체 유형이 서로 다른 경우 두 유형이 서로 상속 관계에 있음
ㄴ 왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우에만 묵시적 형변환 발생
ㄴ 자식 클래스에서 부모 클래스 유형으로 할당하는 것은 가능하지만, 반대의 경우 명시적 형변환을 사용해야 함
단, 할당되는 인스턴스 유형에 따라 실행 오류 발생
-> 내부 특정 클래스 형이 다른 클래스 형으로 변환될 수 있는지 여부를 수시로 판단해야 함
-> instanceof 연산자를 활용 (생성된 객체가 class와 관계있는 type으로 만들어졌는지 확인)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Employee { // ... } class Manager extends Employee { // ... } public class InstanceOfTest { public static void main(String arg[]) { Manager mg = new Manager(); Employee ep = new Employee(); System.out.println(mg instanceof Manager); // true System.out.println(mg instanceof Employee); // true System.out.println(ep instanceof Manager); // false } } | cs |
- Employee 객체 ep는 Manager의 부모 클래스로서, Manager 클래스가 가진 새로운 특징은 가지고 있지 않음 -> Manager 형이 아님
> 객체 형변환 test
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Employee { String name; int employeeNo; int departmentNo; public String getEmployeeInfo() { ... } } class Manager extends Employee { Employee[] employeeList; public String getManagerInfo() { ... } } public class Test { public static void main(String arg[]) { // 1, 2, 3, 4 } } | cs |
1. Employee 객체에 접근할 수 있는 경우
=> Employee e1 = new Employee();
// type과 생성된 객체 모두 Employee, - Employee 객체가 가지고 있는 변수나 메스드 모두 접근 가능
2. Employee, Manager 객체에 모두 접근하라 수 있는 묵시적 형변환인 경우
=> Manager m1 = new Manager();
// type과 생성된 객체 모두 Manager, - Employee, Manager 객체의 변수와 메스드를 모두 접근 가능
3. 생성된 객체와 참조하는 변수의 타입이 다른 경우
=> Emplyee e2 = new Manager();
// 생성된 객체는 Manager이지만 참조 변수의 타입이 Employee이므로, 접근 가능한 변수와 메서드는 같이 Employee 객체로 제한
4. Employee, Manager 객체에 모두 접근할 수 있는 명시적 형변환인 경우
=> manager m2 = (manager)e2;
// m2는 Manager 타입이므로 e2가 참조하고 있던 Manager 객체의 모든 멤버 필드와 메서드에 접근 가능
> 형변환과 멤버 변수
- 형변환에 참여한 서로 상속 관계에 있는 두 클래스 간에는 동일한 이름의 변수가 존재하거나 메서드가 Overriding 되어 있을 수 있음
- 생성된 객체 변수를 통해 멤버에 접근할 때 주의해야 함
- 객체 참조 변수가 변수나 메서드를 참조하는 경우, 참조 관계를 결정하는 시간이 다르기 때문에 차이가 발생
- ex)
1. Parent 클래시의 객체 생성 및 요소 접근
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Parent { int num = 10; void printNum() { System.out.println(num); } } class Child extends Parent { int num = 20; void printNum() { System.out.println(num); } } public class ObjectCastTest { public static void main(String args[]) { Parent p = new Parent(); p.printNum(); // 10 System.out.println(p.num); // 10 } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Parent { int num = 10; void printNum() { System.out.println(num); } } class Child extends Parent { int num = 20; void printNum() { System.out.println(num); } } public class ObjectCastTest { public static void main(String args[]) { Child c = new Child(); c.printNum(); // 20 System.out.println(c.num); // 20 } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | class Parent { int num = 10; void printNum() { System.out.println(num); } } class Child extends Parent { int num = 20; void printNum() { System.out.println(num); } } public class ObjectCastTest { public static void main(String args[]) { Parent p = new Child(); p.printNum(); // 20 System.out.println(p.num); // 10 } } | cs |
참고 : SW Expert Academy
'Web > JAVA' 카테고리의 다른 글
[JAVA] 기술 정리 (2) | 2019.08.28 |
---|---|
[JAVA] HashSet (0) | 2019.08.14 |
[JAVA] 내부 클래스(Inner Class) (0) | 2019.08.12 |
[JAVA] 추상 클래스(Abstract Class) (0) | 2019.08.12 |
[JAVA] 상속과 멤버(변수, 메서드) (2) | 2019.08.08 |