OOP의 다형성의 핵심은 같은 참조 타입으로 다양한 객체를 다룰 수 있다 라는 점이다.
예시코드
// 부모 클래스
class Animal {
void sound() {
System.out.println("Some generic animal sound");
}
}
// 자식 클래스들
class Dog extends Animal {
@Override
void sound() {
System.out.println("Woof! Woof!");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("Meow!");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal myAnimal; // 부모 클래스 타입 선언
// 다형성을 통해 서로 다른 객체를 할당
myAnimal = new Dog();
myAnimal.sound(); // 출력: Woof! Woof!
myAnimal = new Cat();
myAnimal.sound(); // 출력: Meow!
}
}
다형적 참조 (Polymorphic Reference)
상위 클래스 타입의 참조 변수로 하위 클래스의 객체를 참조하는 것 (업캐스팅의 결과)
class Parent {
void display() {
System.out.println("Parent의 display 호출");
}
}
class Child extends Parent {
@Override
void display() {
System.out.println("Child의 display 호출");
}
}
public class Main {
public static void main(String[] args) {
Parent obj = new Child(); // 다형적 참조
obj.display(); // "Child의 display 호출" 출력
}
}
메서드 오버라이딩 (Method Overriding)
상속받은 메서드를 자식 클래스에서 재정의하는 것
규칙 :
- 메서드 시그니처가 동일해야 한다.
- 접근 제어자는 부모 메서드보다 더 넓은 범위로 변경 가능하다.
- 반환 타입은 부모와 동일하거나, 부모 반환 타입의 하위타입 이어야 한다.
- 부모 메서드에 final이 있으면 오버라이딩 불가하다.'
오버라이딩 하지 않고 부모 변수 > 자식메서드 호출하려면 다운캐스팅 필요하나 메서드 오버라이딩이 되었다면 자바의 동적 바인딩(Dynamic Method Binding) 메커니즘을 통해 실체 객체의 타입을 기준으로 실행할 메서드가 결정된다 <> 정적 바인딩 private, static, final 메서드(오버라이딩 자체가 불가)
다형적 참조에서 가장 중요한 점은, 참조 변수의 타입에 따라 호출되는 메서드는 달라지지 않는다는 것이다. (재정의된 메서드!!!)
핵심:
1. 코드의 유연성이 증가: 부모클래스로 다양한 객체(자식)를 다룰 수 있다.
2. 런타임 다형성: 어떤 메서드가 호출될지는 객체의 타입에 따라 결정된다.
'언어 > Java' 카테고리의 다른 글
| [자바] +자바 메모리 구조 (0) | 2025.04.15 |
|---|---|
| [자바] + 맵 (2) | 2025.04.08 |