ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 객체 지향3. 다형성(Polymorphism)이란 무엇일까?
    Java 2018. 7. 17. 12:04
    반응형





    객체 지향에서 가장 많이 쓰인다는 다형성이라는데...

    너무 어렵다.. 어려워도 내용정리해보자!!




    1. 다형성(Polymorphism)이란?

      - 하나의 소통 방식으로 다양한 객체들이 각자의 방식으로 다양하게 동작하는 성질입니다.

      - 부모 타입의 변수로 다양한 자식 객체를 참조할 수 있습니다.

        ▶ 다양한 수많은 객체를 하나의 인터페이스로 처리할 수 있습니다.






    2-1. 첫번째 사용 예시 -  부모타입의 변수로 자식 객체를 참조.

    ▶ 하나의 메소드를 통해 다양한 자식 객체를 처리할 수 있습니다. (단 상속관계가 아닌 객체는 에러가 발생합니다.)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    class Animal { // extends Object
        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("공부하다");
        }
    }
    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

         ▶ 다형성을 이용해서 자식 객체를 부모 타입의 배열 요소로 담을 수 있습니다. 그렇기 때문에 각 객체마다 배열을 생성할 필요가 없습니다.^^

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class 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 error
            
            Animal[] 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을 해야합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class 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 를 반환합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 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

      - 결과 화면



    반응형
Designed by Tistory.