
Java는 객체 지향 프로그래밍(OOP) 언어로, OOP의 4가지 주요 요소인 추상화, 캡슐화, 다형성, 상속성을 중심으로 설계되었다. 이 글에서는 그 중 다형성(Polymorphism)에 대해 알아보자.
다형성(Polymorphism)이란?
다형성이란 하나의 이름을 가진 변수, 함수, 클래스가 다양한 의미로 해석 될 수 있도록 구현하는 것을 말한다. 다형성은 코드의 유연성과 재사용성을 높여주며, 프로그램의 유지보수를 쉽게 만든다. 다형성은 주로 메소드 오버라이딩(Method Overriding)과 메소드 오버로딩(Method Overloading), 상속의 계층관계 활용 등을 통해 구현된다.
다형성 실현 방법 - 메소드 오버로딩과 오버라이딩
메서드 오버로딩을 이용해 동일한 이름의 메서드를 여러 개 정의하여 다형성 구현하고 메서드 오버라이딩을 이용해 상속받은 상위 클래스의 메서드를 재정의하여 다형성 구현한다. 자세한 내용은 아래 페이지에 정리했다.
https://for-habit.tistory.com/84
Java의 메소드 오버로딩과 메소드 오버라이딩
Java에서 메소드 오버로딩과 메소드 오버라이딩은 다형성을 구현하는 중요한 개념으로 이 글에서는 메소드 오버로딩과 메소드 오버라이딩의 차이점과 사용법을 알아보자. 메소드 오버로딩(Met
for-habit.tistory.com
다형성 실현 방법 - 다형적 참조 (Polymorphic Reference)
다형적 참조는 상위 클래스 타입의 참조 변수가 하위 클래스 객체를 참조할 수 있는 것을 말한다. 이를 통해 코드의 유연성과 재사용성을 높일 수 있다. 다형적 참조는 주로 인터페이스나 상위 클래스를 통해 구현된다.
public class Main {
public static void main(String[] args) {
Animal animal1 = new Dog(); // 다형적 참조
Animal animal2 = new Cat(); // 다형적 참조
animal1.sound(); // Bark
animal2.sound(); // Meow
}
}
위의 예시에서 Animal 타입의 참조 변수가 Dog와 Cat 객체를 참조하고 있다. 이를 통해 동일한 Animal 타입으로 여러 하위 클래스 객체를 다룰 수 있다.
# 업캐스팅(Upcasting)과 다운캐스팅(Downcasting)
업캐스팅
업캐스팅(Upcasting)은 하위 클래스 타입의 객체를 상위 클래스 타입의 참조 변수로 변환하는 것을 말한다. 업캐스팅은 명시적으로 타입 변환을 하지 않아도 자동으로 수행된다.
특징:
- 하위 클래스 객체를 상위 클래스 타입으로 변환한다.
- 안전한 변환으로 컴파일러에 의해 자동으로 수행된다.
- 상위 클래스의 참조 변수는 하위 클래스의 확장된 멤버에 접근할 수 없다.
public class Main {
public static void main(String[] args) {
Dog dog = new Dog();
Animal animal = dog; // 업캐스팅 (자동)
animal.sound(); // Bark
}
}
다운캐스팅
반면에 다운캐스팅(Downcasting)은 상위 클래스 타입의 객체를 하위 클래스 타입의 참조 변수로 변환하는 것을 말한다. 다운캐스팅은 명시적으로 타입 변환을 수행해야 하며, 잘못된 변환은 ClassCastException을 발생시킬 수 있다
특징:
- 상위 클래스 객체를 하위 클래스 타입으로 변환한다.
- 명시적으로 타입 변환을 수행해야 한다.
- 객체가 실제로 해당 하위 클래스 타입인지 확인해야 안전하다.
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 업캐스팅
Dog dog = (Dog) animal; // 다운캐스팅 (명시적)
dog.sound(); // Bark
Animal animal2 = new Animal();
// Dog dog2 = (Dog) animal2; // 잘못된 다운캐스팅, ClassCastException 발생
// dog2.sound();
}
}
다운캐스팅을 수행하기 전에 객체가 실제로 해당 타입인지 확인하는 것이 중요하다. ClassCastException이 발생할 수 있기 때문이다. ClassCastException은 Java에서 객체의 타입을 잘못 변환하려 할 때 발생하는 예외다. 이는 주로 상위 클래스 타입의 객체를 하위 클래스 타입으로 캐스팅하려 할 때, 객체의 실제 타입이 캐스팅하려는 타입과 일치하지 않을 때 발생한다.
위 예사에서 animal2는 Animal 타입의 객체로 생성되었으므로 Dog 타입으로 다운캐스팅할 수 없다.
이 예외를 피하기 위해 instanceof 연산자를 사용할 수 있다.
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 업캐스팅
if (animal instanceof Dog) {
Dog dog = (Dog) animal; // 안전한 다운캐스팅
dog.sound(); // Bark
}
}
}
위 예시에서 알 수 있듯 instanceof 연산자는 어떤 객체가 특정 클래스 또는 인터페이스의 인스턴스인지 확인하고 불리언 값을 반환한다.
기본 형식 : (테스트 객체) instanceof (대조할 타입)
'개발 > java' 카테고리의 다른 글
Java의 람다 표현식 과 스트림 (0) | 2024.07.12 |
---|---|
Java의 익명 클래스 (0) | 2024.07.12 |
객체지향 프로그래밍의 4가지 요소(2) 캡슐화 (0) | 2024.07.11 |
Java의 주요 키워드: this, static, super, final (0) | 2024.07.11 |
Localtime 클래스 Java 공식 문서를 통한 클래스에 대한 이해 (0) | 2024.07.10 |
