1.다형성(Polymorphism)
다형성은 대입되는 객체에 따라 메서드를 다르게 동작하도록 구현하는 기술이다.
이는 실행도중 동일한 이름의 메서드 호출(오버라이드)에도 각각의 메서드를 선택할 수 있다는데에 큰 특장점이 있다.
종류가 다른 객체라도, 비슷한 동작의 메서드를 모아 관리해 간결한 코드를 유지할 수 있다.
위 그림에서, Animal이라는 부모객체에서 동물의 공통적인 '울음소리' 나타내는 sound()라는 메소드를 정의하였다고 가정한다.
동물클래스인 Dog, Cat, Duck은 각각 Animal 클래스를 상속받아
sound()를 각각의 특성에 맞게 재정의 하여 실행한다
그 결과
Dog의 sound() : Bow Bow / Cat의 sound() : meow meow / Duck의 sound() : quack quack
이처럼 sound()라는 동일한 메소드를 전달하지만 각각의 클래스는 다르게 반응하도록 할 수 있는 것이다.
앞서 언급한 오버라이딩(Overriding)과 오버로딩(Overloading)이 메서드의 다형성의 예시이다.
자 그럼, 이제 다형성을 이용한 객체를 생성해 볼까?
2.다형성의 조건
- 상속 클래스의 구현(부모-자식 클래스 구현)
- 메소드 오버라이딩
- 업캐스팅한 객체선언
- 부모 클래스의 객체로 자식 메소드 호출
3. 클래스 선언과 객체생성
객체를 생성할 때에는 new 연산자를 사용하는데, 이 연산자는 생성한 객체의 주소를 반환한다.(→변수의 이름에!)
객체를 생성할 때
해당 객체를 자료형이나 클래스를 규정하여 해당 객체의 타입을 지정해주고
참조할 변수의 이름을 지정하여, 해당 변수에 주소값을 받아 변수로서 객체를 활용한다.
클래스 이름(자료형) 변수 = new 클래스 이름() ;
그리고 다형성을 가능케 하는 상속을 포함한 객체의 생성은 4가지 경우의 수가 있다.
문법 = 메모리
Aaa t1 = new Aaa(); // 부모 = 부모
t1.f1(); //상속의 의미두지 않아도됨
Aaa t2 = new Bbb(); // 부모 = 자손(up casting)
t2.f1();
t2.f3(); //부모의 객체로 자손의 재정의된 메소드를 호출할 수 있다
//Bbb t3 = new Aaa(); // 자손 = 부모 ... 자바에서는 불가!(down casting)
// //
//
Bbb t4 = new Bbb(); // 자손 = 자손
t4.f1();
t4.f2(); //상속받아 모두 사용
일반적인 객체생성과 크게 다르지 않는 1,4의 경우는 상속받은 메서드를 모두 사용한다는것 이외에는 큰 차이가 없고 다형성의 특성을 띄지 않는다.
주목해야할 부분은 < 부모의 형태로 생성한 자식 객체> 의 형태이다.
- 부모의 객체로서 - 메서드 호출하는데, 자손의 재정의된 메서드를 호출하거나,
- 별개의 새로운 클래스를 정의하고
매서드에 해당 부모클래스를 매개변수삼아 관련된 자손의 매서드를 호출 할 수 있다.
이로서 재사용성이 획기적으로 증가되어 중복된 코드를 줄일 수 있으며
유지보수가 쉬워지고
클래스간에 느슨한 결합도로서 높은 안정성과 함께 유연한 상호작용이 가능해진다.
아래의 예시코드를 확인해보자
package pack01; //다형성 예시코드
class Aaa{
void f1() {System.out.println( "부모 메소드 f1" );}
void f3() {System.out.println( "부모 메소드 f3" );}
}
class Bbb extends Aaa{
void f2() {System.out.println( "Bbb자식 메소드 f2" );}
void f3() {System.out.println( "Bbb자식 메소드 f3" );}
}
class Ccc extends Aaa{
void f2() {System.out.println( "Ccc자식 메소드 f2" );}
void f3() {System.out.println( "Ccc자식 메소드 f3" );}
}
class Ddd{
void f1000(Aaa a) { // Aaa t5 = new Bbb();
a.f3(); // Aaa t6 = new Ccc();
}
}
public class Ex19_Polymol {
public static void main(String[] args) {
Aaa t5 = new Bbb(); // 부모의 객체에 자손(Bbb)인스턴스의 주소값을 담는다 ( 자손Bbb을 가르킨다 )
t5.f1(); // 부모에게만 있는 f1()메소드는 부모식대로 실행한다
t5.f3(); // 부모와 자식클래스 모두 있는 f3()는 오버라이딩으로 자식의 f3()를 우선 실행한다
Aaa t6 = new Ccc(); // 부모의 객체에 자손(Ccc)인스턴스의 주소값을 담는다 ( 자손Ccc을 가르킨다 )
t6.f1(); // 부모에게만 있는 f1()메소드는 부모식대로 실행한다
t6.f3(); //마찬가지로, 자식(Ccc클래스)의 f3()를 실행한다.
//--------------------다형성의 꽃이 피었다!
Ddd t7 = new Ddd();
t7.f1000(new Bbb());
t7.f1000(new Ccc());
}
}
'개발언어 > Java _ Spring' 카테고리의 다른 글
스프링 입문 _ 섹션2. 스프링 웹 개발 기초 (0) | 2022.12.05 |
---|---|
자바_this의 활용 (0) | 2022.08.18 |
for문 (0) | 2022.08.03 |
조건문 if (0) | 2022.08.02 |
변수2 / 연산과 형 변환 (0) | 2022.08.01 |