클래스에서의 타입 변환
타입 변환은 타입을 다른 타입으로 변환하는 것으로 자바에서는 다음과 같이 두 가지의 대표적 타입 변환이 있다.
- 자료형(타입) 변환
- 클래스의 객체 타입 변환
클래스의 자동 타입 변환
자료형에서의 자동 형 변환과 마찬가지로 개발자가 직접 명시하지 않아도 자동으로 타입 변환이 일어나는 것을 '클래스 자동 타입 변환'이라고 한다.
클래스 자동 타입 변환은 상속 관계에 있는 자식 클래스의 객체를 부모 타입의 객체로 변환하는 것을 말한다.
자식 클래스를 만들면서 바로 부모 타입으로 변환할 때는 다음과 같이 구현한다.
부모 클래스(타입) 객체 변수 = new 자식 클래스();
만들어진자식 객체를 부모 타입으로 변환할 때는 다음과 같다.
부모 클래스(타입) 객체 변수 = 자식 객체;
▼ 예제
class Parent {}
class Child extends Parent{}
public class EX11_01{
public static void main(String[] args){
Parent p1 = new Parent(); // p1 객체 생성
Child c1 = new Child(); // c1 객체 생성
Parent p2 = new Chile(); // 자동 타입 변환
Parent p3 = c1; // 자동 타입 변환
// Child c2 = p1; // <== 자동 타입 변환 x
if(p3 == c1){
System.out.println("p3과 c1은 같은 객체를 참조하고 있습니다.");
}
}
}
* 실행 결과 : p3와 c1은 같은 객체를 참조하고 있다.
child c2 = p1; 코드의 경우, 부모 클래스인 Parent 타입을 자식 클래스인 Chiled 타입으로 변환 시도할 경우 오류가 발생된다.
클래스 자동 타입 변환은 자식 타입에서 부모 타입 방향으로만 가능하다.
1차 상속 관계가 아니더라도 상위 계층의 타입으로 변환할 수 있다.
하지만 같은 상위 계층을 가지고 있더라도, 타입 변환을 시도하려는 두 클래스 간의 상속 관계가 없다면 타입 변환은 불가능하다.
타입을 부모 타입으로 변환한 객체는, 더 이상 자신의 클래스에 부모 클래스와 별개로 추가한 멤버들을 사용할 수 없으며,
부모 클래스에 선언된 멤버(필드와 메서드)들만 사용할 수 있다.
단, 부모 클래스의 메서드를 오버라이딩한 메서드의 경우에는 자식 객체의 것을 호출할 수 있다.
클래스의 강제 타입 변환
자식 타입에서 부모 타입으로 자동 타입 변환을 했지만 자식 클래스의 멤버들에게 접근하고 싶을 때가 생길 수 있다.
이런 경우 다시 DeskCalendar 타입으로 변경해서 접근할 수 있도록 제공하고 있다.
이를 '클래스 강제 타입 변환'이라고 부른다. --> 자식 객체가 부모 타입으로 자동 타입 변환을 한 후, 다시 자식타입으로 변환하는 것을 말한다.
자식 타입 -------- 자동 타입 변환 --------> 부모 타입
자식 타입 <-------강제 타입 변환 -------- 부모 타입
강제 타입 변환의 경우 자동 타입 변환과는 다르게 개발자가 직접 명시해야만 타입 변환을 할 수 있다.
일회성으로 타입 변환이 필요한 경우에는 아래와 같이 작성한다.
((자식타입) 부모타입).메서드();
자식 클래스 멤버들에 대한 접근이 여러 번 필요한 경우는 아래와 같이 자식 타입 변수에 담아서 사용하기도 한다.
자식 타입 변수 = (자식 타입) 부모타입;
다형성
다형성은 객체 지향 프로그래밍의 대표적인 특징 중 하나로, 하나의 타입으로 다양한 객체를 사용할 수 있는 것을 의미한다.
다형성을 구현하려면 다음 세 가지 특징이 힘을 합쳐야 한다!
상속 + 메서드 오버라이딩 + 클래스 타입 변환
다형성을 사용했을 때의 장점은,
객체가 특정 클래스의 필드가 되면서, 하나의 부품처럼 사용될 수 있다.
이때, 부품을 교체할 일이 생긴다면 우리는 다형성을 구현함으로써 코드 수정을 최소화할 수 있다.
instanceof 연산자
부모 타입으로 타입이 변환되어 저장된 변수는 안에 어떤 객체가 담겨 있는지 직접 확인하지 않는 이상 내부 객체를 알기 어렵다.
자바에서는 이런 문제를 해결할 수 있는 instanceof 연산자를 제공하여 참조 변수가 참조하고 있는 인스턴스의 실제 타입을 확인할 수 있도록 해준다.
객체 instanceof 타입(클래스명)
instanceof 연산자의 특징은 다음과 같다
- instanceof 기준으로 왼쪽 객체가 생성될 때 오른쪽 타입으로 생성되었는지 확인하는 연산자이다
- 맞으면 true, 아니면 false를 반환하며 만약 null을 가리키고 있으면 false를 반환한다.
instanceof 연산자와 '==' 연산자의 차이
- A instanceof B : 객체 변수 A가 객체의 타입 B로 생성된 것인지 확인한다
- C == D : 객체변수 C와 객체변수 D가 같은 객체를 참조하고 있는지 확인한다.
오버로딩과 오버라이딩
객체 지향 프로그래밍에서 다형성을 이야기할 때 빼놓을 수 없는 것이 오버로딩/오버라이딩이다.
메서드 이름이 같고, 용어 생김새가 비슷하다는 특징 때문에 혼동하기 쉽지만, 두 용어의 개념은 확실히 다르다.
- 오버로딩 : 하나의 클래스 안에서 같은 이름의 메서드를 여러 개 구현하고 필요에 따라 메서드를 선택해 사용할 수 있다.
- 오버라이딩 : 부모 클래스에게 상속받은 메서드를 재정의하여 자식 클래스용 메서드를 구현하고, 자식 객체를 통해 메서드를 호출하면 오버라이딩된 메서드가 호출된다.
간단히 정리하자면 오버로딩은 새로운 메서드를 정의하는 것, 오버라이딩은 상속받은 기존의 메서드를 재정의 하는 것이다.
'JAVA > 멘토씨리즈_자바' 카테고리의 다른 글
[JAVA] 멘토씨리즈 자바_SECTION.13 (0) | 2024.07.25 |
---|---|
[JAVA] 멘토씨리즈 자바_SECTION.12 (0) | 2024.07.25 |
[JAVA] 멘토씨리즈 자바_SECTION.10 (0) | 2024.07.22 |
[JAVA] 멘토씨리즈 자바_SECTION.09 (0) | 2024.07.22 |
[JAVA] 멘토씨리즈 자바_SECTION.08 (0) | 2024.07.22 |