다형성

개념
다형성(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)

위 두 가지 같은 이름을 가진 매소드가 동일 클래스내 에서 정의 가능

설명: 설명: http://contents.e-campus.co.kr/vmc/3310/3310_02/07/grp/0102a.gif

Overriding

내용

- 부모에게 상속받은 오퍼레이션을 자식 클래스가 같은 이름으로 재정의 하는 것을 의미

- 이 경우 동일한 오퍼레이션이 여러 개 정의되는 것과 마찬가지 효과를 가짐

- 부모의 오퍼레이션을 실행시킬 경우 부모 클래스의 이름을 지정해서 매소드를 호출해야 함

예제

설명: 설명: http://contents.e-campus.co.kr/vmc/3310/3310_02/07/grp/0102b.gif

그림에서 부모인 point에서 정의된 오퍼레이션인 Draw가 자식인 Line에서 중복해서 정의되었음

 

III. 다형성의 샘플코드

설명: 설명: http://contents.e-campus.co.kr/vmc/3310/3310_02/07/grp/0101a.gif

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가 출력된다                        

 

 

 

댓글