관리 메뉴

클라이언트/ 서버/ 엔지니어 "게임 개발자"를 향한 매일의 공부일지

상속 4 - 동물 계층 구조 만들기 실습 2 : 업 캐스팅과 다운 캐스팅에 대하여 본문

프로그래밍 언어/자바

상속 4 - 동물 계층 구조 만들기 실습 2 : 업 캐스팅과 다운 캐스팅에 대하여

huenuri 2024. 12. 1. 04:58

이어서 동물 계층 구조 상속 실습을 진행해 보겠다. 이번 시간에는 업캐스팅과 다운캐스팅이라는 새로운 개념을 배우게 된다. 이 개념도 처음 들었을 때는 무슨 말인지 하나도 이해하지 못했지만 지금은 왠지 충분히 이해할 수 있을 것 같다.


 

 

 

 

 

상속을 활용한 동물 프로젝트 실습 두 번째

 

1. 업 캐스팅과 다운 캐스팅에 대하여

캐스팅은 형 변환이라고 하며 강제 형변환과 자동 형 변환 둘로 나누어진다.

 


 

 

 

 

2. 메인 클래스 만들기

아직까지 메일 클래스를 만들기 않았으므로 이제 만들어준다.

 

 

 

 

 

그런 다음 이제 객체 생성을 해볼 것이다. 


 

 

 

 

 

3. 메인 클래스에서 객체 생성하고 업 캐스팅하기

클래스도 객체 자료형 중 하나이다. 객체를 하나 만들고 업 캐스팅과 다운 캐스팅을 진행해 본다. 먼저 업 캐스팅이다. animal 자료형인 p1을 a1으로 초기화시킨다. p1은 펭귄의 객체이므로 Penguin 자료형이다.

 

 

 

업 캐스팅은 float 자료형을 double 자료형에 넣는 것과 비슷하다.

 

 

 

 

즉, 펭귄은 자식 클래스인데 부모 클래스로 바꾸어주려는 것이다. 펭귄을 animal로 사용하려고 업 캐스팅을 한다.

 

 

업 캐스팅을 한 후 살펴보면 Bird의 기능이 보이지 않는다. move는 펭귄에서 오버라이딩을 했었다. 이제 move의 값을 한번 출력해 보기로 하자.

 

 

 

 

 

 

오버라이딩을 했는데 헤엄치다로 그대로 나온다.


 

 

 

 

4. 업 캐스팅의 특징

 

class Parent {
    void display() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("자식 클래스 메서드");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj = new Child();  // 업 캐스팅
        obj.display();             // 결과: "자식 클래스 메서드"
    }
}

 

 

특징

  1. 자동 변환
    • 업 캐스팅은 명시적인 타입 변환 없이도 자동으로 수행된다.
    • 예를 들어, Parent obj = new Child();처럼 자식 클래스 객체가 부모 클래스 타입으로 참조될 수 있다.
  2. 제한된 접근
    • 부모 클래스 타입으로 참조하면 부모 클래스에 정의된 메서드와 필드만 접근할 수 있다.
    • 하지만, 자식 클래스에서 오버라이딩된 메서드가 호출된다.
  3. 다형성
    • 업 캐스팅은 다형성을 활용하기 위한 주요 메커니즘이다. 같은 부모 클래스를 상속받는 여러 자식 클래스를 하나의 부모 클래스 타입으로 다룰 수 있다.
    • 예를 들어, 부모 클래스 타입의 배열에 다양한 자식 클래스 객체를 저장하고 처리할 수 있다.

 

업 캐스팅의 장점

  • 유연성: 다양한 자식 클래스를 하나의 부모 클래스 타입으로 처리할 수 있다.
  • 다형성 활용: 런타임 시 자식 클래스의 오버라이딩된 메서드를 호출하여 동적 바인딩(dynamic binding)이 가능하다.
  • 코드 간결화: 공통된 부모 클래스 인터페이스를 통해 코드를 단순화하고 유지보수를 용이하게 한다.

 

업 캐스팅과 관련된 주의점

  1. 부모 클래스에 없는 메서드나 속성은 사용 불가능하다.
  2. 자식 클래스 고유의 기능을 사용하려면 다운 캐스팅(Downcasting)이 필요하다.

이를 통해 업 캐스팅은 다형성(polymorphism)을 활용하기 위한 중요한 개념이다.


 

 

 

 

5. 다운 캐스팅의 개념 및 오류가 나는 상황

 

하지만 실행을 해보면 오류가 발생하는 것을 볼 수 있다.

 

 

 

 

문법적으로 틀리지 않았지만 개념적으로 말이 안된다는 것이다. 이것은 동물은 고래라는 말과 같다. 

 

작성한 코드를 주석 처리하고 새로운 방식으로 다운 캐스팅을 진행할 것이다.


 

 

 

 

 

6. 다운 캐스팅 사용하기

오류는 나지 않지만 경고 표시는 뜬다.

 

 

 

a2는 한번도 업 캐스팅이 된 적이 없기 때문에 오류가 뜨는 것이다. a1은 penguin이었던 적이 있었기에 펭귄으로 다시 바뀌는 것이 가능하다.

 

 

 

 

그리고 나면 원래 펭귄이 가지고 있던 고유한 기능이 살아난다.


 

 

 

 

 

7. 다운 캐스팅을 사용하는 상황

다운 캐스팅은 자료형이 다를 때 하나로 묶어서 사용할 수 있다.

 

 

원래는 각기 다른 자료형이었지만 Animal 자료형으로 업 캐스팅을 함으로 모두 사용할 수 있는 상태가 된다.

 

 

 

 

 


 

 

 

 

 

8. 다운 캐스팅의 특징 정리하기

선생님은 다운 캐스팅의 특징을 하나만 알려주셨지만 난 더 알고 싶어서 어떤 특징이 있는지 찾아보았다.

 

class Parent {
    void display() {
        System.out.println("부모 클래스 메서드");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("자식 클래스 메서드");
    }

    void childMethod() {
        System.out.println("자식 클래스만의 메서드");
    }
}

public class Main {
    public static void main(String[] args) {
        Parent parent = new Child();  // 업 캐스팅
        parent.display();             // 결과: "자식 클래스 메서드"

        // 다운 캐스팅
        Child child = (Child) parent; // 명시적 변환 필요
        child.childMethod();          // 결과: "자식 클래스만의 메서드"
    }
}

 

 

다운 캐스팅의 특징

  1. 명시적 타입 변환 필요
    • 다운 캐스팅은 업 캐스팅된 객체를 다시 자식 클래스 타입으로 변환할 때 사용된다.
    • 예: (Child) parent처럼 타입을 명시적으로 변환해야 한다.
  2. 런타임 검증
    • 다운 캐스팅은 컴파일러가 허용해도, 실제로 객체가 자식 클래스 타입인지 런타임에 검증된다.
    • 부모 클래스 타입 객체를 자식 클래스 타입으로 변환할 경우 ClassCastException이 발생할 수 있다.
  3. 자식 클래스 고유 메서드 접근 가능
    • 다운 캐스팅을 하면 자식 클래스에서 추가된 메서드나 필드에 접근할 수 있다.

 

장점

  • 부모 클래스 타입으로는 접근할 수 없는 자식 클래스 고유의 기능을 사용할 수 있다.
  • 업 캐스팅과 함께 사용하면 다형성을 효과적으로 활용할 수 있다.

 

주의사항

1. 객체 타입 확인 필요

  • 다운 캐스팅 전에 객체가 실제로 자식 클래스 타입인지 확인해야 한다. Java에서는 instanceof 키워드를 사용하여 안전하게 확인할 수 있다.
if (parent instanceof Child) {
    Child child = (Child) parent;
    child.childMethod();
}

 

 

2. 불필요한 사용 자제

  • 잘못된 다운 캐스팅은 런타임 오류를 발생시키므로, 가능하면 부모 클래스의 다형성을 활용하고 다운 캐스팅을 최소화하는 것이 좋다.

 

업 캐스팅과 다운 캐스팅의 관계

  • 업 캐스팅: 자식 → 부모 (자동 변환)
  • 다운 캐스팅: 부모 → 자식 (명시적 변환)

다운 캐스팅은 다형성의 유연성을 활용하면서도 자식 클래스의 고유 기능을 사용할 수 있는 중요한 기법이라 할 수 있다.


 

 

 

 

학습을 마치고

업 캐스팅과 다운 캐스팅의 개념은 많이 어려워서 여러번 돌려서 시청하느라 시간이 내 예상보다 많이 초과되었다. 근데 인사교 초창기에 진행되었던 수업들은 선생님의 탁자에만 마이크가 달려 있어서 녹화 영상을 보면 소리가 전혀 녹음이 되어 있지 않은 영상도 정말 많고 소리가 끊겨 개미 소리마냥 들려 무슨 말인지 이해하기 힘든 강의들도 많았다.

특히 자바 수업은 선생님이 이곳저곳 이동하며 수업을 하실 때가 많아서 절반은 알아듣지 못했다. 

 

나중에는 이 부분을 개선해서 7월부터 진행된 수업에서는 선생님들이 이동 마이크를 몸에 부착하고 하시니 소리가 잘 들려서 좋았다. 근데 4기때는 이런 점이 반영하지 않았나 보다. 어쨌든 5기를 수료하길 잘했다는 생각이 들었다.