개발/JAVA

Java에서 상속과 업캐스팅/다운캐스팅 배우기

예니03 2025. 1. 29. 10:45
반응형

Java에서 객체지향 프로그래밍(Object-Oriented Programming)의 중요한 개념 중 하나는 상속(Inheritance)입니다. 상속을 활용하면 부모 클래스의 기능을 자식 클래스에서 재사용하거나 확장할 수 있습니다. 오늘은 이를 기반으로 업캐스팅(Upcasting)다운캐스팅(Downcasting)을 이해하는 간단한 예제를 알아보겠습니다.

1. 상속(Inheritance)이란?

상속은 부모 클래스의 필드와 메서드를 자식 클래스가 물려받는 기능입니다. 이를 통해 코드의 재사용성을 높이고, 객체들 간의 관계를 명확히 정의할 수 있습니다.

예제: 기본 클래스 Animal

package com.javaex.oop.casting;

public class Animal {
    // 필드
    protected String name;
    
    // 생성자
    public Animal(String name) {
        this.name = name;
    }

    // 메서드
    public void eat() {
        System.out.println(name + "이 먹고 있다.");
    }

    public void walk() {
        System.out.println(name + "은 산책중...");
    }
}

Animal 클래스는 이름(name)을 필드로 가지며, 먹기(eat)와 산책(walk)하는 기능을 제공합니다. 이 클래스를 부모로 삼아, 고유 기능이 있는 동물을 만들어 보겠습니다.

 

2. 자식 클래스 만들기

자식 클래스 Dog와 Cat은 각각 부모 클래스 Animal을 상속받습니다.

package com.javaex.oop.casting;

public class Dog extends Animal {
    public Dog(String name) {
        super(name); // 부모 클래스의 생성자를 호출
    }

    public void bark() {
        System.out.println(name + " 멍멍~!");
    }
}
package com.javaex.oop.casting;

public class Cat extends Animal {
    public Cat(String name) {
        super(name); // 부모 클래스의 생성자를 호출
    }

    public void meow() {
        System.out.println(name + " 야옹~!");
    }
}

자식 클래스 Dog는 짖기(bark) 기능, Cat은 야옹하기(meow) 기능을 추가로 구현했습니다.

 

3. 업캐스팅(Upcasting)

업캐스팅자식 객체를 부모 클래스 타입으로 참조하는 것을 말합니다. 이를 통해 다형성(Polymorphism)을 구현할 수 있습니다.
하지만 업캐스팅된 객체는 부모 클래스의 설계도에 정의된 기능만 사용할 수 있습니다.

package com.javaex.oop.casting;

public class AnimalApp {
    public static void main(String[] args) {
        // 업캐스팅
        Animal dog1 = new Dog("Snoopy");
        dog1.eat();  // Animal 클래스의 메서드
        dog1.walk(); // Animal 클래스의 메서드
        // dog1.bark(); -> 부모 설계도에는 bark()가 없으므로 호출 불가
    }
}

업캐스팅의 특징:
부모 클래스 타입으로 참조하면, 부모 클래스에 정의된 기능만 사용할 수 있습니다.

 

4. 다운캐스팅(Downcasting)

다운캐스팅은 업캐스팅된 객체를 다시 자식 클래스 타입으로 변환하는 것입니다. 다운캐스팅을 통해 자식 클래스만의 고유한 기능을 사용할 수 있습니다.

package com.javaex.oop.casting;

public class AnimalApp {
    public static void main(String[] args) {
        Animal dog1 = new Dog("Snoopy");

        // 다운캐스팅
        if (dog1 instanceof Dog) {
            ((Dog) dog1).bark(); // 다운캐스팅 후 bark() 호출 가능
        }
    }
}

주의점: 다운캐스팅 시 객체가 실제로 자식 클래스의 인스턴스인지 확인해야 합니다. 그렇지 않으면 ClassCastException이 발생할 수 있습니다.

 

5. 업캐스팅과 다운캐스팅을 활용한 동적 메서드 호출

instanceof 키워드를 사용하면 객체가 어떤 클래스의 인스턴스인지 확인할 수 있습니다. 이를 활용하면 동적으로 메서드를 호출할 수 있습니다.

public class AnimalApp {
    public static void main(String[] args) {
        Animal pet = new Dog("Azi");
        pet.eat();
        pet.walk();
        // pet.bark(); -> 불가능 (업캐스팅 상태)

        if (pet instanceof Dog) {
            ((Dog) pet).bark(); // Dog의 메서드 호출
        }

        // 새로운 객체로 교체
        pet = new Cat("아즈라엘");
        pet.eat();
        pet.walk();
        // pet.meow(); -> 불가능 (업캐스팅 상태)

        if (pet instanceof Cat) {
            ((Cat) pet).meow(); // Cat의 메서드 호출
        }
    }
}

 

 

6. 전체 코드

아래는 완성된 코드입니다:

Animal.java

package com.javaex.oop.casting;

public class Animal {
    protected String name;

    public Animal(String name) {
        this.name = name;
    }

    public void eat() {
        System.out.println(name + "이 먹고 있다.");
    }

    public void walk() {
        System.out.println(name + "은 산책중...");
    }
}

Dog.java

package com.javaex.oop.casting;

public class Dog extends Animal {
    public Dog(String name) {
        super(name);
    }

    public void bark() {
        System.out.println(name + " 멍멍~!");
    }
}

Cat.java

package com.javaex.oop.casting;

public class Cat extends Animal {
    public Cat(String name) {
        super(name);
    }

    public void meow() {
        System.out.println(name + " 야옹~!");
    }
}

AnimalApp.java

package com.javaex.oop.casting;

public class AnimalApp {
    public static void main(String[] args) {
        Animal dog1 = new Dog("Snoopy");
        dog1.eat();
        dog1.walk();

        if (dog1 instanceof Dog) {
            ((Dog) dog1).bark();
        }

        Animal pet = new Cat("아즈라엘");
        pet.eat();
        pet.walk();

        if (pet instanceof Cat) {
            ((Cat) pet).meow();
        }
    }
}

 

 

7. 정리

  • 업캐스팅: 부모 클래스 타입으로 참조 → 부모 클래스 기능만 사용 가능
  • 다운캐스팅: 자식 클래스 타입으로 변환 → 자식 클래스 고유 기능 사용 가능
  • instanceof: 객체의 실제 타입을 확인하여 안전하게 다운캐스팅 수행

이 코드를 통해 상속, 업캐스팅, 다운캐스팅의 기본 개념을 이해하고, 자바의 다형성을 활용하는 방법을 배울 수 있습니다. 😊

즐거운 코딩 되세요! 🚀

반응형