다형성
태그 :
- 개념
- 다형성(Polymorphism) - 상속되는 기능을 재정의하거나 하나의 인터페이스에 다양한 매소드를 정의하여 확장성, 유연성을 제공하는 객체지향 한 특징
다형성(Polymorphism)
I. 상속되는 기능을 재 정의하는 다형성(Polymorphism)의 개요
가. 다형성(Polymorphism)의 정의
- 상속되는 기능을 재정의하거나 하나의 인터페이스에 다양한 매소드를 정의하여 확장성, 유연성을 제공하는 객체지향 특징
- 다른 클래스이나 같은 이름의 오퍼레이션을 가지게 되는 경우 동일한 이름의 오퍼레이션이라도 그 오퍼레이션이 일어나는 클래스에 따라 각기 다른 행동을 수행하도록 함
나. 다형성의 장점
- 확장성: 하나의 인터페이스에 매소드를 type 및 개수를 변경하여 재정의
- 유연성: 하나의 인터페이스를 일관성있게 사용중심에서 제공, 편리성
- 재사용성: Overloading, Overriding을 이용한 재사용성 높임
II. 다형성의 동작원리와 구현방법
가. 다형성의 동작원리
- 하나의 인터페이스: draw(), erase() 함수명 (박스, 원, 삼각형 함수)
- 디자인패턴에 Prototype을 이용하면 효과적 코딩 가능
나. SW에서 다형성의 구현방법
구현형태 |
구분 |
설명 |
Overloading |
내용 |
- 동일한 클래스에 같은 이름을 가진 두 개 이상의 오퍼레이션을 정의하는 경우 - 이 경우 이름은 같더라도 파라미터의 개수와 형식은 달라야 함 - 다른 방식의 프로그래밍 언어와는 달리 객체지향 프로그래밍 언어에서는 파라메터의 개수와 형식만 다르면 얼마든지 같은 이름의 매소드를 정의할 수 있음 |
예제 |
integer Sum ( integer X , integer Y ) float Sum ( float X , float Y) 위 두 가지 같은 이름을 가진 매소드가 동일 클래스내 에서 정의 가능 |
|
Overriding |
내용 |
- 부모에게 상속받은 오퍼레이션을 자식 클래스가 같은 이름으로 재정의 하는 것을 의미 - 이 경우 동일한 오퍼레이션이 여러 개 정의되는 것과 마찬가지 효과를 가짐 - 부모의 오퍼레이션을 실행시킬 경우 부모 클래스의 이름을 지정해서 매소드를 호출해야 함 |
예제 |
그림에서 부모인 point에서 정의된 오퍼레이션인 Draw가 자식인 Line에서 중복해서 정의되었음 |
III. 다형성의 샘플코드
class Shape{ public void draw(); public void erase(); } class Circle extends Shape{ int radius; public void draw(); // Overriding public void draw(int r); // Overloading public void erase(); // Overriding } class Square extends Shape{ int s_line; public void draw(); // Overriding public void draw(int a, int b) ; // Overloading public void erase(); // Overriding } class Triangle extends Shape{ int t_line; public void draw(); // Overriding public void draw(int line); // Overloading public void erase(); // Overriding } Class RunTest{ public void main(){ Shape s1 = new Circle(); Shape s2 = new Square(); Shape s3 = new Triangle(); s1.draw(); // 원이 그려지고 - overriding s2.draw(); // 사각형이 그려지고 - overriding s3.draw(); // 삼각형이 그려지고 - overriding } } |
IV. Overloading 과 Overriding 의 코딩 비교
가. Overloading 코딩
eat() eat(int i)
class A { public static void main(String [] args) { A a = new A(); a .test(1L); a.test(1); } void test(int i) { System.out.println("1"); } void test(double i) { System.out.println("2"); } }
프로그램의 실행결과는와이 출력된다 |
나. Overriding 코딩
아래의 코드중 First s = new Second();에서 s가 멤버 변수(s.var)를 엑세스할 때는 s의 타입인 First이 사용되나, s가 매소드(s.method())를 엑세스할 때는 s가 가리키는 객체참조의 실제타입인 Second가 사용된다.
public class Test { public static void main(String[] args) { First s = new Second(); System.out.println(s.var); System.out.println(s.method()); } } class First { int var = 1; int method() { return var; } } class Second extends First { int var = 2; int method() { return var; } } 프로그램의 실행결과는 1과 2가 출력된다 |