다형성은 객체 지향 프로그래밍의
대표적인 특징 중 하나로,
하나의 타입으로 다양한 객체를
사용할 수 있는 것을 의미한다.
[ 다형성 ]
다형성을 구현하는 데 큰 역할을 하는
다음 세 가지 특징이 대표적인 항목이다.
- 상속
- 메서드 오버라이딩
- 클래스 타입 변환
객체가 특정 클래스의 필드가 되면서
하나의 부품처럼 사용될 수도 있는데
이때 부품을 교체할 일이 생긴다면 다형성을
구현함으로써 코드 수정을 최소화할 수 있다.
객체를 바꿔야만 할 경우
객체를 모두 바꾸면 어떤 영향이 발생할지
모르므로 위험한 상황이 연출된다.
그래서 객체를 필드로 가지는 클래스에서
객체 타입을 부모 클래스 타입으로 수정하면
간단하게 다형성을 적용한 코드가 될 수 있다.
또한 이렇게 구현해 놓으면
수정해야 할 코드가 적어져서 관리에 용이하다.
[ instanceof 연산자 ]
부모 타입으로 타입이 변환되어 저장된 변수는
안에 어떤 객체가 담겨 있는지 직접 확인해 보지 않는 이상
내부 객체를 알기 쉽지 않다.
이때 instance of 연산자를 사용하면
참조 변수가 참조하고 있는 인스턴스의
실제 타입을 확인할 수 있도록 해준다.
객체 instanceof 타입(클래스명)
instance of 기준으로 왼쪽 객체가 생성될 때
오른쪽 타입으로 생성되었는지를 확인하는 연산자.
맞으면 true, 아니면 false를 반환하며
만약 null을 가리키고 있으면 false를 반환한다.
class Animal {}
class Pig extends Animal {}
class Cow extends Animal {}
class Farm {
void sound(Animal animal){
if(animal instanceof Pig){
//애니멀 객체가 Pig 타입이라면
System.out.println("꿀꿀");
} else {
//애니멀 객체가 Pig 타입이 아니라면 = 소다.
System.out.println("음메");
}
}
}
위와 같이 인스턴스 오브를 활용하여
객체를 판단하는 조건문을 사용할 수도 있다.
※ instanceof 연산자와 '==' 연산자의 차이
A instanceof B : 객체 변수 A가 타입 B로 생성된 것인지 확인
C == D : 객체 변수 C와 D가 같은 객체를 참조하고 있는지 확인
- instanceof = “저 사람 직업이 의사야?” (타입 확인)
- == = “저 두 사람이 같은 사람이야?” (객체 동일성 확인)
▼ instanceof 예시
Animal a = new Dog();
System.out.println(a instanceof Dog); // true
System.out.println(a instanceof Animal); // true
System.out.println(a instanceof Cat); // false
▼ == 예시
Dog d1 = new Dog();
Dog d2 = new Dog();
System.out.println(d1 == d2); // false (서로 다른 객체)
Dog d3 = d1;
System.out.println(d1 == d3); // true (같은 객체 주소)
[ 오버로딩과 오버라이딩 ]
객체 지향 프로그래밍에서 다형성을 얘기할 때
빼놓을 수 없는 것이 바로 오버로딩과 오버라이딩이다.
메서드 이름이 같고 용어 생김새가 비슷하다는
특징 때문에 혼동하기 쉬운데 꼭 기억하자!
1) 오버로딩
자바는 매개변수의 자료형/개수/순서를 기반으로
메서드를 구별하므로 하나의 클래스 안에서
같은 이름의 메서드를 여러 개 구현하고
필요에 따라 메서드를 선택해 사용할 수 있다.
2) 오버라이딩
부모 클래스에게 상속받은 메서드를 재정의하여
자식 클래스용 메서드를 구현하고 자식 객체를 통해
메서드를 호출하면 오버라이딩된 메서드가 호출됩니다.
즉 오버로딩은 새로운 메서드를 정의하는 것이며,
오버라이딩은 상속받은 기존의 메서드를 재정의하는 것이다.
'개주 훈련일지 > 📚 코살대 교본 학습' 카테고리의 다른 글
| 소프트웨어 개발 프로세스의 전통적인 모델 (0) | 2025.11.15 |
|---|---|
| 소프트웨어 개발 프로세스 (1) | 2025.11.11 |
| 클래스 타입 변환 (0) | 2025.11.10 |
| 소프트웨어 생명주기 (0) | 2025.11.10 |
| 상속 (0) | 2025.11.08 |