Java | 자동 타입 변환(promotion) & 강제 타입 변환(casting)

바다·2024년 4월 24일
0

Java

목록 보기
13/18
post-thumbnail

자바를 자주 사용하지만, int, String이 아닌 class의 타입 변환에 익숙하지 않았다.
오늘 Java 문법 강의를 들으며, 자동 타입 변환과 강제 타입 변환 그리고 이것들을 왜 사용해야 하는지에 대해서 간략하게 설명을 들었고, 이것들을 정리하며 내 것으로 만들어보려고 한다!

타입 변환

자바에서는 다형성을 위해 부모 클래스로 타입 변환을 허용한다.
즉, 부모 타입에 모든 자식 객체가 대입될 수 있다.

Parent parent = new Child();
  • 클래스 타입도, 기본 데이터 타입 변환과 마찬가지로 타입 변환을 할 수 있다.
  • 클래스 타입 변환은 상속 관계에 있는 클래스 사이에서 발생한다.
  • 자식 타입은 부모 타입으로 자동 타입 변환이 가능하다!

자동 타입 변환 (promotion)

부모 타입의 참조 변수에 자식 객체의 주소를 넣는 행위

Child child1 = new Child();
Parent child2 = child1;		//자동 타입 변환

child1 == child2 -> true 	// 타입은 달라도 객체는 같다.

상속 관계에서 자식 클래스는 상속 받은 데이터 + α 의 데이터를 가지고 있지만, 자동 타입 변환을 하게 되면 상속 받은 데이터만을 사용할 수 있다. 하지만, 부모 클래스에 있던 메소드를 오버라이딩 하였다면 자식 클래스의 메소드에 접근 가능하다.

왜냐하면, 타입이 부모의 타입이기 때문이다.
타입은 자료형이고, 우리가 자료형을 정의하는 목적을 '범위'를 설정하기 위함이다.

참조 타입은 해당 클래스가 지정한 필드와 메소드를 '범위'로 가지고 있기 때문에 해당 참조 타입으로 생성된 객체는 그 범위를 벗어날 수 없다.

child1과 child2가 가리키는 객체는 같지만, 두 변수는 '타입'이 달라서 서로 표현할 수 있는 범위가 다르다.

부모 클래스

public class Parent {
	public void parent() {
    	System.out.println("나는 부모");
    }
    
    public void parent2() {
    	System.out.println("나는 부모");
    }
    	
}

자식 클래스

public class Child extends Parent {
	public void parent() {
    	System.out.pritnln("나는 부모");
    }
    
    @Override
    public void parent2() {
    	System.out.println("나는 자식 클래스에서 오버라이딩 함");
    }
    
    public void child() {
    	System.out.println("나는 자식!");
    }
}

메인 클래스

public class Main {
	public static void main(String[] args) {
    	Child child = new Child();
        Parent parent = child;		//자동 타입 변환
        
        parent.parent1();			//부모에게만 있는 메소드
        parent.parent2();			//자식이 override 한 메소드
        //parent.child();			//자식 클래스에만 있는 메소드라서 실행하지 못함
    }
}

출력 결과

나는 부모
나는 자식 클래스에서 오버라이딩 함
  • 부모 클래스에 있는 메소드는 그대로 작동
  • 부모 클래스에 있지만, 자식 클래스에서 오버라이딩 했다면 자식 클래스의 메소드 작동
  • 부모 클래스에는 존재하지 않고 자식 클래스에만 존재하는 것은 작동 불가

자식 클래스에 있는 메소드를 실행하고 싶다면?

강제 타입 변환 (casting)

부모 타입을 자식 타입으로 변환하는 것

언제 가능한가요?

자식 타입이 부모 타입으로 자동 변환 되고 난 후,
다시 자식 타입으로 타입 변환을 할 때만...!

Parent parent = new Child();
Child child = (Child) parent;		// 강제 타입 변환

이제 자식 클래스의 메소드를 사용 가능한가요?

Parent parent = new Child();
Child child = (Child) parent;

child.parent();
child.parent2();
child.child();

출력 결과

나는 부모
나는 자식 클래스에서 오버라이딩 함
나는 자식!

타입 변환... 왜 할까요?!

그냥...

Child child = new Child();

이렇게만 써서 쓰면 되는 거 아닌가?

라고 강의를 보며 생각하고 있었는데,, 강사님이 이 예제를 통해 잘 설명해 주셨다!

// LG TV 구현체를 조작
MultiRemoteController mrc = new LgTv("LG");
mrc.turnOnOff();
mrc.volumeUp();

// 조작 대상을 Samsung TV로 교체
mrc = new SamsungTv("Samsung");
mrc.turnOnOff();
mrc.channelUp()

많은 코드가 있지만, 일단 간단하게 이 코드만 담는다
MultiRemoteController -> interface
LgTv, SamsungTv -> MultiRemoteController 인터페이스 와 Tv 추상 클래스를 상속 받음
  • 다형성은 '여러 가지 형태' 를 가질 수 있어야 함
  • 메소드는 같아도, 다양한 특징과 결과를 가질 수 있음
  • 구현 객체를 교체해도 수정 작업 없이 그대로 기능을 호출할 수 있음

간단한 코드에서는 이 장점이 잘 드러나지 않을지도 모르겠지만, 프로젝트가 점점 커진다면 객체 지향 프로그래밍을 할 때 중요한 포인트가 될 수 있을 것 같다!

profile
ᴘʜɪʟɪᴘᴘɪᴀɴs 3:14

0개의 댓글