개발 용어/Spring

Property와 Constructor는 무엇일까?

디벨로퍼룽쓰 2021. 4. 29. 23:35

우리가 클래스를 만들고 사용할 때, TV를 만들어두고 volumeUp메서드를 실행할 때 스피커 클래스의 메서드가 출력되도록 하고 싶으면 어떤 방법들이 있을까?

 

방법 1. 

private SonySpeaker speaker = new SonySpeaker();

 

방법 2.

<bean id="S_TV" class="org.zerock.polymorphism2.SamsungTV">
	<constructor-arg ref="speaker"></constructor-arg>
</bean>

<bean id="speaker" class="org.zerock.polymorphism2.SonySpeaker"/>

 

일반적으로 우리가 사용하는 것은 TV 클래스 안에서 방법 1과 같이 객체를 생성해주는 것을 해왔다.

그럼 방법 2는 무엇일까? 앞서 말했던 것처럼 일단 컨테이너 안에서 일이 진행된다.

즉, 컨테이너에서 bean을 통해 SamsungTV를 만들 때, speaker도 사용할 수 있도록 한 것이다.

 

이렇게 설정을 해두면 우린 SamsungTV 클래스 안에서 SonySpeaker 클래스의 메서드도 사용할 수 있기 때문에 사용할 때마다 객체를 생성할 필요가 없어지는 장점이 있다.

 

그럼 제목과 같이 두 개의 차이점은 무엇일까?

내가 현재까지 알기로는 결과론적으로는 유의미한 차이를 갖지 않을 수 있다. 

동일한 역할을 한다고 보면 더 정확할 것이다. 코드를 보자

 

 

[ A. Construtor-arg를 통한 구현 ]

<bean id="S_TV" class="org.zerock.polymorphism6.SamsungTV">
	<constructor-arg ref="apple"></constructor-arg>
	<constructor-arg value="270000"></constructor-arg>
</bean>

 

 

[ B. Property를 통한 구현 ]

<bean id="S_TV" class="org.zerock.polymorphism6.SamsungTV">
	<property name="speaker" ref="apple"></property>
	<property name="price" value="250000"></property>
</bean>

두 코드를 보게 되면 A와 B는 쓰는 단어와 모양새만 다를 뿐, 사실상 하는 역할은 같다는 것을 알 수 있다.

여기서 주의할 점은 constructor을 통한 구현은 우리가 이전에 봤던 컨테이너 사용법과 같지만, Property는 다르다는 점이다. 즉, 사용하려 하는 곳에 반드시 setter가 있어야 한다.