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: 객체의 실제 타입을 확인하여 안전하게 다운캐스팅 수행
이 코드를 통해 상속, 업캐스팅, 다운캐스팅의 기본 개념을 이해하고, 자바의 다형성을 활용하는 방법을 배울 수 있습니다. 😊
즐거운 코딩 되세요! 🚀
'개발 > JAVA' 카테고리의 다른 글
자바의 this와 생성자 활용: 상품 관리 프로그램 심화 학습 (12) | 2025.01.31 |
---|---|
Java에서 객체와 클래스 기본 이해하기: 간단한 상품 관리 예제 (12) | 2025.01.30 |
Java로 네트워크 프로그래밍 시작하기: InetAddress를 활용한 IP 주소 확인 (4) | 2025.01.28 |
Java로 배우는 간단한 TCP 소켓 프로그래밍 예제 (4) | 2025.01.27 |
쉽게 배우는 Java 에코 서버와 클라이언트 만들기! (8) | 2025.01.24 |