레퍼런스는 무엇일까요?

프로그램에서 실제로 존재해서 살아 움직이는 것은 객체이지 레퍼런스가 아닙니다.

실제로 일을 하는 것도 객체이구요. 파일을 읽는 것, 네트워크 연결을 하는 것,

메모리와 CPU등 시스템 자원을 소비하는 것도 객체입니다.

하지만 객체와 레퍼런스가 결합되어 있지 않다면 프로그래머는 객체를 참조할 수 없게 되고

결국엔 객체를 이용할 수 없습니다.

 

 

BigRib b = new BigRib();                                      // BigRib햄버거를 만듭니다.

int p = b.getPrice();                                              // BigRib햄버거의 가격을 알아봅니다.

예제 1-5

 

BigRib햄버거 레퍼런스 b BigRib햄버거 객체와 결합하고 있는 경우에는 레퍼런스를

이용해서 BigRib햄버거 객체로 하여금 행위를 시킬수 있습니다.

레퍼런스가 프로그램의 흐름에서 없어질 때까지 언제든 사용할 수 있습니다. 

(객체와 결합하지 않은 레퍼런스를 사용하게 되면 NullPointerException이 발생합니다.)

레퍼런스를 객체와 결합시키면 레퍼런스가 사라질 때까지 계속해서 객체를 사용할 수 있기

때문에 여러 번 객체를 사용해야 하는 경우는 반드시 객체와 레퍼런스를 결합시켜야 합니다.

예제 1-5 BigRib햄버거 객체와 결합한 레퍼런스는 b이고, 그 레퍼런스 b를 통해서

BigRib햄버거의 가격을 알아내고 있습니다.

 

 하지만 만약 객체로부터 한번의 서비스만 받고자 하는 경우, 객체에게 단 한번의 행위를

시키는 경우는 굳이 레퍼런스가 없어도 가능합니다. 하지만 기회는 한 번뿐이어서 다시는

객체를 사용하지 못합니다.

 

 

int p = new BigRib().getPrice();  // BigRib햄버거를 만든후 곧 가격을 알아봅니다.

예제 1-6

예제 1-6에서는 BigRib햄버거의 가격을 알아본 후에는 BigRib 햄버거객체와 결합한

레퍼런스가 없기 때문에 BigRib햄버거 객체를 이용할 수 없습니다.

이런 경우는 객체로부터 서비스 받는 기회(객체의 메소드를 호출할 수 있는 기회)

단 한번 뿐입니다.

 

객체와 레퍼런스에 대한 관계는 TV와 리모트 콘트롤과의 관계와 비슷합니다.

화면과 음성을 제공하며 시청자를 즐겁게 해주는 것은 TV입니다.

TV에 핑클이나 장나라가 나오면 많이 즐겁지요. 물론 현재 보고 있는 채널과

다른 채널에 핑클이 나오면 리모트 콘트롤을 이용해서 그 채널로 돌리지요.

TV를 돌리는게 아닙니다. 리모트 콘트롤을 이용해서 TV를 제어하는 것입니다.

 

이것을 자바 프로그램으로 비유하자면 TV는 실제로 일을 하는 객체인 셈입니다. 

하지만 TV에게 일을 시키는 행위는 리모트콘트롤을 통해서 하게 되지요.

시청할 때 리모트콘트롤을 통해서 TV의 볼륨도 높이고, 채널도 돌리고 , 전원을 켜고

끄듯이 자바프로그램에서는 프로그래머가 객체에게 어떤 행위를 시킬 때 객체와 결합한

레퍼런스를 가지고 일을 시키게 됩니다. 절대로 TV를 돌리는게 아니듯이 객체를 가지고

일을 하는 게 아닙니다. 객체의 레퍼런스를 가지고 객체를 제어합니다.

리모트 콘트롤은 TV는 아니지만 TV가 제공하는 모든 서비스를 제어할 수 있는 것처럼,

레퍼런스도 객체는 아니지만 객체가 제공하는 모든 서비스를 제어할 수 있습니다.

 좀 어렵게 말하면 리모트콘트롤은 TV라는 객체를 이용할 수 있는 인터페이스인 것입니다.

 

인터페이스에 대해서

 

인터페이스라는 개념은 아주 간명한 개념입니다.

리모트 콘트롤을 보면 채널번호가 적혀있는데(물론 채널 옆에 화살표가 적혀있는 리모트

콘트롤도 있습니다.) 해당 채널 번호를 누르면 TV에서 해당 채널에 대한 프로그램을

보여주겠지라고 생각할 것이고, 볼륨 높이는 버튼을 누르면 TV의 볼륨이 실제로 높아지

겠지하고 생각할 것입니다. 리모트콘트롤에 적혀져 있는 채널돌리기, 볼륨높이기등의 기능

은 실제로 TV가 제공합니다. 인터페이스는 객체가 제공하는 행위를 나열한 것이라고 생각하면 좋겠습니다. 반대로 인테페이스는 객체가 제공해야하는 행위를 나열한 것이라고 생각

해도 됩니다. 여기서 리모트 콘트롤은 자바언어로 비유하면 인퍼페이스입니다.

 

TV의 입장에서 보면 볼륨을 높이는 거나 채널을 돌리는 데는 상당한 노력이 필요할

것입니다. 불륨의 크기를 조절하기 위해서 전류를 더 많이 흐르게 한다던가, 저항을 더

준다던가 ,굉장히 복잡한 전기적 장치를 구동한다던가 하는 식으로요.

하지만 리모트콘트롤을 가진 사람은 TV가 어떻게 해서 볼륨을 높이는지,

채널을 변경하는지에는 아무런 관심이 없고, 알고 싶지도 않을 것입니다.

단지 볼륨을 높이는 버튼을 누르면 TV의 볼륨이 높아지고, 채널을 돌리는 버튼을 누르면

TV의 채널이 돌아가면 그 뿐인 것입니다.

여기에서 실제로 볼륨을 높이고,채널을 돌리는 일을 수행하는 것은 TV입니다.

여기서 TV는 자바에서 인터페이스를 구현한 객체입니다.

리모트콘트롤과 TV와의 관계에서처럼 자바에서 어떤 일을 해야하는지 선언한 것과

실제 구체적인 일을 하는 객체를 분리할 수 있는데, 앞의 역할을 하는 것을

인터페이스라고합니다. 리모트 콘트롤과 TV의 예에서와 같이 객체가 실행해야할 행위를

선언한 것과 실행해야할 행위를 구현한 것을 분리하는 경우가 아주 많은데,자바에서는

이를  인터페이스와 클래스를(구현)을 분리한다고 말합니다.

Posted by
,