JAVA _다형성(Polymorphism)

JAVA _다형성(Polymorphism)

★다형성★

1.다형성이란

- 다형성이란 : 객체가 여러 형태 를 가진다, 하나의 객체가 여러가지 유형으로 사용되는 것.

- 다형성은 상속을 전제조건으로 함.

- 다형성을 위해 자바는 자식클래스가 부모클래스 타입을 가질수 있도록 허용함. 즉, 부모 타입에 모든 자식객체가 대입될수 있음.

▶다형성 예시

//클래스A와 A를 상속받는 B와C클래스 class A{} class B extends A{} class C extends A{} public class Poly{ //클래스타입 멤버변수 A a = new A(); B b = new B(); //다형성 A a1 = b; // A a1 = new B(); // B -> A형 반환 // 부모 타입A에 자식타입 B대입 // 자식클래스가 부모클래스 타입을 가지게됨. A a2 = new B(); A a3 = new C(); //우선순위 높은 바이트로 변경 가능하듯이 다형성을 똑같이 생각하면 됨 byte x = 1; int y = x; // byte -> int //++Object는 자바의 가장 상위객체로 모든 객체 저장 가능함. Object o1 = new A(); Object o2 = new B(); Object o3 = "java";

++우선순위가 낮은 데이터형에서 높은 데이터 형으로 변환하는 것과 다형성을 똑같이 생각하면 됨++

++Object는 자바의 가장 상위객체임++

▶다형성 실행예제

Parent클래스와, Parent클래스를 상속받는 Child클래스

// public class MainClass { public static void main(String[] args){ Child c = new Child(); c.method1(); // 상속받은 메서드 c.method2(); // 오버라이딩된 메서드 c.method3(); // 자식의 3번 메서드 Parent p = c; // Parent p = new Child(); System.out.println(p == c); //Child가 Parent기능을 가짐 --> true p.method1(); p.method2(); //오버라이딩 된 메서드 실행됨. --> 오버라이딩 코드 우선! p.method3(); //Child가 Parent기능을 가지게 되었으므로 사용불가 // // 위의 예시는 "Child가 갖는 고유한 성질 잃어버림"을 보여주는 예시 // } }

위의 Main문 실행결과

2. 클래스 캐스팅(Casting)

- 클래스 캐스팅 = 클래스 강제 형변환

- 강제 타입변환은 부모 타입을 자식타입으로 변환하는 것을 말함.

- 객체에서 타입 캐스팅 사용하려면 우선 Promotion이 일어나야 함. 즉, 부모타입으로 한번 형변환이 된 자식 객체만 강제 타입 변환 사용가능.

- Promotion일어나면 자식 클래스가 가지고 있는 재정의되지 않은 메서드 사용할 수 없다는 단점이 있음.

☞ 이 단점을 극복하기 위해 강제 타입변환 사용해 자식 메서드 호출하는 방법 사용.

▶다형성 예시

위에서 사용했던 Parent클래스와 Child드 클래스를 사용해보는 예시

// public class MainClass{ public static void main(String[] args){ // Child가 Parent타입으로 한번 형변환이 되면서 Child가 갖는 고유한성질을 잃어버림 Parent p = new Child(); c.method3(); //실행되지 않음. //위의 단점을 보안하기위해 만들어진 Casting(강제 형변환) //Casting통해 고유한 성질 되찾아옴. Child c = (Child)p; System.out.println(c == p); // true c.method1(); c.method2(); c.method3(); //고유한 성질 되찾아와 실행됨 } }

위 MAIN문의 결과

위의 Main문에서 Chlid가 Parent클래스 타입으로 변경되었을때는 Child만의 고유 성질이 사라져 Child내 메서드 method3을 사용하지 못하게 됨.

하지만, 강제 형변환을 사용해 Child의 고유 성질을 원상복귀시켜 method3을 다시 사용할수 있게 해줌.

▶중요!◀

3. 다형성적용

▶멤버변수의 다형성

- 멤버변수를 부모형으로 선언해 타입 통일

▶매개변수의 다형성

- 보통 메서드 호출시에는 메서드 선언부에서 지정한 데이터 타입과 일치하는 매개값을 전달해 호출하지만, 매개 변수에 다형성 적용하면 자식객체 전달할 수 있음.

▶배열에 적용한 다형성

부모클래스형 배열에 자식클래스 언제든 저장 가능.

Peron클래스와, Person클래스를 상속받는 Employee, Student, Teacher클래스

▶다형성을 사용하지 않은 코딩과, 그 코딩을 다형성을 사용해 나타낸 코드.◀

++위의 예제들을 통해 다형성을 사용하지 않을 때보다 다형성을 사용했을 경우,

코드의 가독성과 단순성이 높아짐을 볼수있음++

from http://shinny.tistory.com/23 by ccl(A) rewrite - 2021-09-09 14:27:31