1. 다형성 (Polymorphism)
다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다.
키보드의 키를 통해 비유를 들어보겠다. 키보드의 키를 사용하는 방법은 '누른다'이다. 하지만 똑같은 동작 방법의 키라고 하더라도 ESC는 취소를 ENTER는 실행의 목적을 가지고 있다. 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른 것을 의미한다. -opentutorials -
우선 코드를 살펴보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class O{ public void a(int param){ System.out.println("숫자출력"); System.out.println(param); } public void a(String param){ System.out.println("문자출력"); System.out.println(param); } } public class PolymorphismOverloadingDemo { public static void main(String[] args) { O o = new O(); o.a(1);; o.a("one"); } } | cs |
클래스 O의 메소드 a는 두개의 본체를 가지고 있다. 동시에 두개이 본체는 하나의 이름인 a를 공유하고 있다. 같은 이름이지만 서로 다른 동작 방법을 가지고 있기 때문에 오버로딩은 다형성의 한 예라고 할 수 있다.
1 2 3 4 5 6 7 | class A{} class B extends A{} public class PolymorphismDemo1 { public static void main(String[] args) { A obj = new B(); } } | cs |
위 코드의 5번째 줄을 보면 class B의 데이터 형이 class A이다. Class B는 Class A를 상속하고 있다. 이런 경우에 Class B는 Class A를 데이터 형으로 삼을 수 있다. 다음 이렇게 하는 이유가 무엇인지 살펴보자.
다음 사진을 보자. 클릭하면 선명하게 볼 수 있다 ㅎㅎ
이제 왜 obj.y(); 호출부에서 오류가 발생하는지 그 이유를 알아보자.
그림의 11번째 줄을 보면 클래스 B를 인스턴스화한 obj 변수는 현재 A 클래스의 행세를 하고 있다고 했다.
12번째 줄에서 obj.x(); 메소드를 호출하는데 4번째 줄에 선언되어있는 B 클래스 안에는 x 메소드가 존재 하지 않는다. 그럼 B가 상속 받고 있는 부모 클래스인 A클래스에 가보면 메소드 x의 정의가 되어 있다.
B클래스를 인스턴스화 후 obj 변수에 담고 obj는 A클래스의 행세를 한다고 했다.
A클래스에는 메소드 x가 정의되어 있기 때문에 12번째 코드는 정상적으로 작동한다.
그런데 13번째는 실행되지 않는다.
코드에서 obj 안에 클래스 B를 담았지만 obj는 클래스A 행세를 하고 있기 때문에 클래스A에는 y메소드가 정의되어 있지 않아서 존재하지 않는다 라고 자바가 간주한다. 이유는 obj의 데이터타입은 A클래스이기 때문이다.
조금더 이해를 하기위해 다음 소스코드를 보도록하자.
위 소스코드에서 변경된 부분을 표시해두었다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class A { public String x() {return "A.x";} } class B extends A{ public String x() {return "B.x";} public String y() {return "y";} } public class test { public static void main(String[] args) { A obj = new B(); System.out.println(obj.x()); } } | cs |
B클래스를 인스턴스화 후 obj에 담겨있지만 obj는 A 클래스의 행세를 하고있다.13번째 줄의 코드가 실행되었을 때 실행되는게 어떤 클래스인지 확인해보자.결과는 다음처럼 나온다.
123456789101112131415161718 class A {public String x() {return "A.x";}}class B extends A{public String x() {return "B.x";}public String y() {return "y";}}public class test {public static void main(String[] args) {A obj = new B();System.out.println(obj.x());}}cs B클래스가 A클래스 행세를 한다는 것은 A클래스에 정의되어 있는 메소드만 호출이 가능하다. 13번째 콘솔창에 출력하는 부분을 obj.y()로 바꾼다면 에러가 발생하게 된다. 즉, A클래스 행세를 하면서 A클래스에 정의되어 있지 않고 B클래스에 추가적으로 정의된 메소드는 호출이 불가능하고 B클래스의 상위 클래스인 A클래스에 정의된 메소드를 오버라이딩한다면 호출이 가능하다.
'Dev > JAVA ' 카테고리의 다른 글
JAVA Split "|" 제거 방법 (0) | 2018.05.17 |
---|---|
JAVA 추상 클래스 (0) | 2018.01.15 |
JAVA 인터페이스(Interface) (0) | 2018.01.15 |
JAVA 상속 (2) | 2018.01.12 |
[JAVA] jsp / java를 이용한 DB연동 (0) | 2017.12.04 |