본문 바로가기
교재 실습/자바 웹 개발 워크북

135. 생성자와 프로퍼티 설정 (1)

by jint 2022. 10. 19.

이번 절에서는 스프링 IoC 컨테이너를 사용하여 빈을 생성할 때 생성자와 프로퍼티를 설정하는 방법을 배운다.

 

1. 호출할 생성자 설정

이번 실습에서는 인스턴스에 대해 호출될 생성자를 지정하는 방법을 알아본다. 빈을 선언할 때 <constructor-arg> 엘리먼트를 이용하여 호출될 생성자를 지정할 수 있다.

 

- 실습 패키지 생성

exam 패키지 아래에 test04 패키지를 생성한다. test03 패키지의 모든 파일을 test04 패키지에 복사한다.

 

- beans.xml 빈 설정 파일

exam/test04/beans.xml 파일을 열고 다음과 같이 편집한다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="score1" class="exam.test04.Score">
		<constructor-arg><value type="java.lang.String">홍길동</value></constructor-arg>
		<constructor-arg><value type="float">91</value></constructor-arg>
		<constructor-arg><value type="float">92</value></constructor-arg>
		<constructor-arg><value type="float">93</value></constructor-arg>
	</bean>
	
	<bean id="score2" class="exam.test04.Score">
		<constructor-arg><value>임꺽정</value></constructor-arg>
		<constructor-arg><value>81</value></constructor-arg>
		<constructor-arg><value>82</value></constructor-arg>
		<constructor-arg><value>83</value></constructor-arg>
	</bean> 
	
	<bean id="score3" class="exam.test04.Score">
		<constructor-arg type="java.lang.String" value="장보고"/>
		<constructor-arg type="float" value="71"/>
		<constructor-arg type="float" value="72"/>
		<constructor-arg type="float" value="73"/>
	</bean> 
	
	<bean id="score4" class="exam.test04.Score">
		<constructor-arg value="이순신"/>
		<constructor-arg value="100"/>
		<constructor-arg value="98"/>
		<constructor-arg value="99"/>
	</bean>
	
	<bean id="score5" class="exam.test04.Score">
		<constructor-arg value="70" index="3"/>
		<constructor-arg value="50" index="1"/>
		<constructor-arg value="강감찬" index="0"/>
		<constructor-arg value="60" index="2"/>
	</bean>

</beans>
public Score() {}

public Score(String name, float kor, float eng, float math) {...}

exam.test04.Score 클래스에는 두 개의 생성자가 있다. <constructor-arg> 태그를 사용하여 호출될 생성자를 지정할 수 있다.

<constructor-arg> ... </constructor-arg>

호출할 생성자는 매개변수 값에 의해 결정된다. 호출할 생성자의 매개변수 순서대로 <constructor-arg> 태그를 사용하여 매개변수 값을 설정한다. 매개변수 값은 <value> 태그를 사용하여 지정한다.

<value type="java.lang.String">홍길동</value>

<value> 태그의 type 속성은 매개변수 타입이고, 콘텐츠(시작 태그와 끝 태그 사이의 내용)는 매개변수 값이다. Score() 생성자의 첫 번째 매개변수는 String 타입이므로 type 속성에 java.lang.String을 지정하였다. 매개변수 값 "홍길동"은 <value>의 시작 태그와 끝 태그의 사이에 넣었다.

<constructor-arg><value type="float">91</value></constructor-arg>
<constructor-arg><value type="float">92</value></constructor-arg>
<constructor-arg><value type="float">93</value></constructor-arg>
▶ 자바 코드로 표현하면?
new Score("홍길동", 91, 91, 91);

나머지 세 개의 매개변수는 float이라서 type 속성에 float을 지정하였다.

<constructor-arg><value>임꺽정</value></constructor-arg>
<constructor-arg><value>81</value></constructor-arg>
<constructor-arg><value>82</value></constructor-arg>
<constructor-arg><value>83</value></constructor-arg>
▶ 자바 코드로 표현하면?
new Score("임꺽정", 81, 82, 83);

생성자의 매개변수 값을 지정할 때 위와 같이 타입을 생략할 수 있다. 빈 컨테이너는 생성자를 호출할 때 <constructor-arg> 태그가 선언된 순서대로 매개변수 값을 넘긴다. 그리고 매개변수 타입에 맞추어 자동 형변환을 수행한다. String 타입에 대해서는 <value> 태그의 내용을 String 객체로 만들고, float 타입에 대해서는 <value> 태그의 내용을 float으로 만든다.

<constructor-arg type="java.lang.String" value="장보고"/>
<constructor-arg type="float" value="71"/>
<constructor-arg type="float" value="72"/>
<constructor-arg type="float" value="73"/>
▶ 자바 코드로 표현하면?
new Score("장보고", 71, 72, 73);

<value> 태그를 사용하지 않고도 생성자의 매개변수 값을 지정할 수 있다. <constructor-arg> 태그의 type 속성과 value 속성을 이용하면 된다. 또한, 자식 태그 <value>가 없기 때문에 <constructor-arg> 태그의 끝 태그를 생략할 수 있다. 대신 시작 태그의 끝이 '/>'로 끝나야 한다.

<constructor-arg value="이순신"/>
<constructor-arg value="100"/>
<constructor-arg value="98"/>
<constructor-arg value="99"/>
▶ 자바 코드로 표현하면?
new Score("이순신", 100, 98, 99);

다른 생성자와 혼동되지 않는다면 type 속성을 생략할 수 있다. value 속성의 값은 생성자의 매개변수 타입에 맞추어 자동 형변환 된다.

<constructor-arg value="70" index="3"/>
<constructor-arg value="50" index="1"/>
<constructor-arg value="강감찬" index="0"/>
<constructor-arg value="60" index="2"/>
▶ 자바 코드로 표현하면?
new Score("강감찬", 50, 60, 70);

index 속성을 이용하면 매개변수의 순서를 지정할 수 있다. 인덱스는 0부터 시작한다. 앞의 코드의 경우 매개변수들은 "강감찬", 50, 60, 70의 순서로 생성자에 전달된다. 이것을 자바 코드로 표현하면 다음과 같다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글