-
객체 지향3. 다형성(Polymorphism)이란 무엇일까?Java 2018. 7. 17. 12:04반응형
객체 지향에서 가장 많이 쓰인다는 다형성이라는데...
너무 어렵다.. 어려워도 내용정리해보자!!
1. 다형성(Polymorphism)이란?
- 하나의 소통 방식으로 다양한 객체들이 각자의 방식으로 다양하게 동작하는 성질입니다.
- 부모 타입의 변수로 다양한 자식 객체를 참조할 수 있습니다.
▶ 다양한 수많은 객체를 하나의 인터페이스로 처리할 수 있습니다.
2-1. 첫번째 사용 예시 - 부모타입의 변수로 자식 객체를 참조.
▶ 하나의 메소드를 통해 다양한 자식 객체를 처리할 수 있습니다. (단 상속관계가 아닌 객체는 에러가 발생합니다.)
12345678910111213141516171819202122232425262728293031323334353637class Animal { // extends Objectpublic void sleep() {System.out.println("자다");}public void eat() {System.out.println("먹다");}}class Person extends Animal {public void eat() { // 메서드 오버라이딩System.out.println("수저로 먹다");}public void study() {System.out.println("공부하다");}}class AnimalService {public void pass(Animal a) { // 하나의 pass메소드를 통해 Person뿐만 아니라 다양한 객체를 처리할 수 있습니다.System.out.println(a.toString());a.sleep();a.eat();}}public class TestPolymorphism {public static void main(String[] args) {Animal a = new Person(); // 다형성 테스트 - 부모타입의 변수로 자식 객체를 참조한다.System.out.println(a.toString()); // 최상위 클래스 Object로부터 상속받았으므로 사용 가능a.sleep(); // Animal 상속받았으므로 사용 가능a.eat(); // 메서드 오버라이딩 했으므로 사용 가능AnimalService service = new AnimalService();service.pass(new Person()); // Person이라는 객체를 참조하도록 한다.}}cs 2-2. 두번째 사용 예시 - 다형성을 이용한 배열 처리
① 다형성 배열 사용 예시 1
▶ 다형성을 이용해서 자식 객체를 부모 타입의 배열 요소로 담을 수 있습니다. 그렇기 때문에 각 객체마다 배열을 생성할 필요가 없습니다.^^
123456789101112131415161718192021class Car{}class Animal{}class Person extends Animal{}class Dog extends Animal{}public class TestPolymorphismArray {public static void main(String[] args) {Car[] carArray = new Car[3];carArray[0] = new Car();// carArray[1] = new Person(); Car타입의 배열이므로 Person객체를 요소로 담을 수 없다. compile error//carArray[2] = new Dog(); Car타입의 배열이므로 Dog객체를 요소로 담을 수 없다. compile errorAnimal[] ani = new Animal[3];ani[0] = new Animal();ani[1] = new Dog(); // 다형성이 적용되므로 자식객체를 요소로 담을 수 있다.ani[2] = new Person(); // 다형성이 적용되므로 자식객체를 요소로 담을 수 있다.}}cs ② 다형성 배열 사용 예시 2
▶ api문서를 보면 java.io 의 패키지 안에 우리가 자주 사용하는 ObjectOutputStream을 보면 writeObject 메소드를 볼 수 있습니다.
wirteObject 메소드의 매개변수로 Object 객체를 넘기는 것을 볼 수 있는데요. 이는 Object 객체는 자바에서의 모든 객체의 최상위 객체이고
상속 관계이므로 어떤 객체든 다 받겠다는 의미입니다. 그렇기 때문에 우리는 wirteObject 메소드를 사용할 때 아주 편리하게 사용할 수 있답니다.
3. Object down casting
- 부모 타입의 변수로 자식 객체 참조시 부모로부터 상속받은 멤버(인스턴스 변수, 메서드)와 오버라이딩한 메소드는 직접 접근이 가능합니다.
단, 자식의 독자적 멤버(인스턴스 변수, 메서드)에는 직접 접근은 불가능합니다.
이 때는 Object down casting 절차를 거쳐서 참조변수의 타입을 자식 타입으로 인식시킨 다음에 호출하면 됩니다.
▶ 사용 예시를 보면 ((Person) a).study() 메소드를 볼 수 있는데, 이는 study()라는 메소드는 Person객체의 독자적 멤버이기에 접근이 불가합니다.
그렇기에 (Person)을 사용하여 casting을 해야합니다.
123456789101112131415161718192021222324252627282930313233class Animal { // extends Object// Animal() {super();}public void sleep() {System.out.println("자다");}public void eat() {System.out.println("먹다");}}class Person extends Animal {// 메서드 오버라이딩 : 부모 메서드를 자신에 맞게 구현부를 재정의public void eat() {System.out.println("수저로 먹다");}public void study() {System.out.println("공부하다");}}public class TestReview {public static void main(String[] args) {Person p = new Person();Animal a = new Person(); // 다형성 테스트System.out.println(a.toString()); // 최상위 클래스 Object로부터 상속받았으므로 사용 가능a.sleep(); // Animal 상속받았으므로 사용 가능a.eat(); // 메서드 오버라이딩 했으므로 사용 가능// a.study(); 에러 -> Animal타입의 변수로 참조했으므로 직접 접근 불가 -> Object down casting으로 접근((Person) a).study();}}cs 4. instanceof
- 객체의 타입을 비교할 수 있는 연산자입니다.
▶ 사용 예시를 보면 각 객체의 타입을 비교해서 true 또는 false 를 반환합니다.
1234567891011121314// instanceof 연산자 테스트 : 객체의 타입을 비교class Employee {}class Manager extends Employee {}class Engineer extends Employee {}public class TestInstanceof1 {public static void main(String[] args) {Employee e1 = new Manager();System.out.println(e1 instanceof Manager);System.out.println(e1 instanceof Employee);System.out.println(e1 instanceof Engineer);}}cs - 결과 화면
반응형'Java' 카테고리의 다른 글
객체의 관계들은 어떤것이 있을까? (0) 2018.07.25 static, final, abstract 무엇일까? (0) 2018.07.19 객체 지향2-1. 오버로딩(Overloading)과 오버라이딩(Overriding)은 무엇일까? (0) 2018.07.16 객체 지향2. 상속(Inheritance)은 무엇일까? (0) 2018.07.16 객체 지향1. 캡슐화(Encapsulation)은 무엇일까? (0) 2018.07.13