본문 바로가기

Java Programming

Reference의 선언과 Object의 생성과정 그리고 Polymorphism

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
ClassName Class_One = new ClassName();

아무생각 없이 쓰는 이 객체 생성문에도 재미있는 절차가 있었기에 정리해봅니다.
어떻게 레퍼런스(리퍼런스 ㅋㅋ)를 선언하고 객체를 만드는지 과정을 한번 살펴보도록 하죠..

<레퍼런스 변수를 선언합니다>
ClassName Class_One = new ClassName();
JVM에서 레퍼런스 변수를 위한 공간을 할당하도록 지시를 합니다.
레퍼런스 변수의 유형은 한 번 정해지면 바뀌지 않습니다.


<객체를 만듭니다>
ClassName Class_One = new ClassName();
JVM에 가비지 컬렉션 기능이 있는 힙에 새로운 ClassName 객체를 위한 공간을 할당하도록 합니다.


<객체와 레퍼런스를 연결합니다>
ClassName Class_One = new ClassName();
새로 만들어진 ClassName 객체를 Class_One이라는 레퍼런스 변수에 대입합니다.



그런데! 객체 생성하는 코드를 보시면 알수 있듯 레퍼런스의 유형과 객체의 유형이 똑같습니다
위에 있는 예제에서는 모두 ClassName 이 되겠지요.

우선 Polymorphism에 대해서 알아보도록 합시다-
Polymorphism은 서로 다른 객체가 동일한 메세지에 대하여 저마다 고유한 방식으로 응답할 수 있는 기능입니다!

그러나 Polymorphism을 활용하면 레퍼런스와 객체와의 유형이 달라도 된답니다 -ㅅ-;;
그래서 더 찾아봤습니다. 이게 무슨 말도 안되는 소리인가...

폴리모피즘을 사용하면 레퍼런스 유형을 실제 객체 유형의 상위 클래스 유형으로 지정할 수 있다고 합니다.
상위 클래스라는 개념이 나올려면 상속의 개념에 대해서 알아야겠죠 일단 상속은 재껴두고 얘기를 하겠습니다.

<이런 클래스 다이어그램이 있다고 가정합시다>

이런경우에는 다형성을 사용한다면


public class ClassName {
   public static void main(String[] args) {
       ClassName[] classes = new ClassName[5];
       classes[0] = new Class_Zero();
       classes[1] = new Class_One();
       classes[2] = new Class_Two();
       classes[3] = new Class_Three();
       classes[4] = new Class_Four();

       for (int i = 0; i < classes.length; i++){
           classes[i].Open();
           classes[i].Close();
       }
   }

   public void Open() {
       System.out.println("클래스가 열려용");
   }

   public void Close() {
       System.out.println("클래스가 닫혀용");
   }

}

이런식으로 레퍼런스 유형을 실제 객체 유형의 상위클래스 유형으로 지정할수가 있는거라는거죠 -ㅅ-/

그리고 또 있습니다. Argument와 Return Type에 대해서도 Polymorphism 을 적용시킬수 있답니다.
ClassName형의 Object를 Argument로 받는 경우에는 ClassName 의 하위 클래스의 Object가 와도
무관하다는 내용입니다 -ㅅ-/