티스토리 뷰

반응형


#. 객체의 형변환


> 형변환(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

    2. Child 클래스의 객체 생성 및 요소 접근
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

    3.  묵시적 형변환을 하는 경우
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
댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday