글
이번 시간에는, 상속 관계에서의 객체 생성 및 대입에 대해서 살펴보겠습니다.
먼저, 부모에 자식을 생성 및 대입하는 경우입니다. (기본적으로 Sub 클래스는 Super 클래스를 상속한다고 가정합니다.)
객체를 생성함과 동시에 대입하는 경우
부모 클래스형 인스턴스의 변수명 = new 자식 클래스형의 생성자();
ex) Super sp = new Sub(); // 정상적으로 컴파일됨
부모 클래스형 인스턴스의 변수명 = (부모 클래스형) new 자식 클래스형의 생성자();
ex) Super sp = (Super) new Sub(); // 정상적으로 컴파일됨
이미 생성된 객체를 대입하는 경우
부모 클래스형 인스턴스의 변수명 = 자식 클래스형의 인스턴스 변수명;
ex)
Sub sb = new Sub();
Super sp = sb; // 정상적으로 컴파일됨
부모 클래스형 인스턴스의 변수명 = (부모 클래스형) 자식 클래스형의 인스턴스 변수명;
ex)
Sub sb = new Sub();
Super sp = (Super) sb; // 정상적으로 컴파일됨
위의 경우 4 가지 모두, 정상적으로 컴파일됩니다. 요약하자면, 자식 클래스 객체를 부모 클래스 변수에 대입하고자 할때는, 형변환을 하던, 안 하던 컴파일 에러가 안 납니다.
그럼, 반대로, 자식에 부모를 생성 및 대입하는 경우를 살펴보겠습니다.
객체를 생성함과 동시에 대입하는 경우
자식 클래스형 인스턴스의 변수명 = new 부모 클래스형의 생성자();
ex) Sub sb = new Super(); // 컴파일 에러 발생
자식 클래스형 인스턴스의 변수명 = (자식 클래스형) new 부모 클래스형의 생성자();
ex) Sub sb = (Sub) new Super(); // 정상적으로 컴파일은 되나, 실행시 ClassCastException 예외 발생
이미 생성된 객체를 대입하는 경우
자식 클래스형 인스턴스의 변수명 = 부모 클래스형의 인스턴스 변수명;
ex)
Super sp = new Super();
Sub sb = sp; // 컴파일 에러 발생
자식 클래스형 인스턴스의 변수명 = (자식 클래스형) 부모 클래스형의 인스턴스 변수명;
ex)
Super sp = new Super();
Sub sb = (Sub) sp; // 정상적으로 컴파일은 되나, 실행시 ClassCastException 예외 발생
위의 경우에서, 형변환 하지 않고, 그냥 대입하면, 컴파일 에러가 발생하고, 자식 클래스 객체를 부모 클래스 변수에 형변환하여 대입한 경우에는, 컴파일 에러는 발생하지 않지만, 실행시 ClassCastException 예외가 발생합니다. 이것은, 부모를 자식으로 형변환하려고 해서 예외가 발생한 것입니다. 결론적으로, 부모를 자식형으로 형변환하는 것과 부모를 자식에 대입하는 것은 어떤 경우에도 올바르지 않다는 것을 의미합니다.
추가적으로, 형변환을 두 번 하는 경우에 대해서 말씀드리겠습니다.
class One{
}
class Two extends One{
}
class Three extends Two{
}
...
One one = new Two(); // One 형 변수에 Two 형 객체를 만들어 대입
Two two = (Two)(One)one; // 정상적으로 컴파일됨
// Two two = (Three)(One)one; // 정상적으로 컴파일은 되나, 실행시 ClassCastException 예외 발생
위의 예시를 보면, one 을 Two 클래스 객체로 만들고 나서, 첫 번째로 One 형으로 형변환하고, (자식 -> 부모로 형변환하는 것이라 문제 없음) 그 다음에, Two 형으로 형변환하면, 컴파일이 정상적으로 됩니다. 하지만, Two 형이 아닌, Threee 형으로 형변환하려고 하면, 컴파일은 되나, 실행시 ClassCastException 이 발생하게 됩니다. 이는, 원래 객체가 Two 형이었기 때문에, 형변환하여 하위 클래스로 내려갈 수 있는 범위가 Two 형까지이기 때문입니다.
결론적으로, 부모 자식간의 형변환은 자식을 부모로 형변환하는 것은 문제없으나, 부모를 자식으로 형변환하는 것은 예외를 발생시킨다는 것입니다. 상속관계에서 형변환시에는, 항상 하한선을 잘 확인하여 형변환해야 할 것입니다.
'4.1) OCJP > 관련 이론 및 문법' 카테고리의 다른 글
관련 이론 및 문법 - File 클래스 (0) | 2015.07.24 |
---|---|
관련 이론 및 문법 - 객체 직렬화 (Serialization) (0) | 2015.07.14 |
관련 이론 및 문법 - NumberFormat 클래스 (0) | 2015.07.14 |
관련 이론 및 문법 - DateFormat 클래스 (0) | 2015.07.13 |
관련 이론 및 문법 - 상속관계에서 클래스형의 의미 (0) | 2015.07.13 |
관련 이론 및 문법 - has a / is a (0) | 2015.07.08 |
관련 이론 및 문법 - 익명 클래스 (anonymous class) (0) | 2015.07.08 |
관련 이론 및 문법 - Runnable 인터페이스 (0) | 2015.07.08 |
관련 이론 및 문법 - synchronized (0) | 2015.07.08 |
관련 이론 및 문법 - Thread 클래스 (0) | 2015.07.07 |
RECENT COMMENT