Phone 인터페이스를 구현한 GalaxyPhone 클래스에
갤럭시워치 타입의 갤럭시워치를 멤버변수로 추가 해보자.

그리고, 갤럭시폰의 볼륨 조절은 갤럭시워치를 통해서 할 수 있는 설계로 가정해보자.
갤럭시워치 클래스 내부는 아래와 같다.

그러면, 아래와 같이 작성 하게 된다.

그런데, 이것을 컴파일 하게 되면, NPE가 발생 하게 된다.


당연하게도,


저 두 아이를 객체화 해주지 않았기 때문이다.
주체가 galaxyWatch 이고, 주체로 메서드를 호출 하기 때문에,
인스턴스 메서드 이며, 주체를 new 키워드로 인스턴스화 하지 않았기에,
null로 메서드를 호출하니, 발생하는 NPE 에러인 것이다.

따라서, 위와 같이 코드를 삽입해주면,

이렇게 해결이 되는 모습을 확인 할 수 있다.
하지만, new 키워드를 결국 사용하게 되었다.
이것은 절대로 좋은 코드가 아니기에, new를 하지 않아야 한다.
이렇게,
갤럭시폰의 음량을 높히고, 낮추기 위해서,
갤럭시워치를 new 해야 한다 ?
>>
갤럭시폰과 갤럭시워치는 서로 의존 관계 라고 할 수 있다.
이를 해결 하기 위해, .xml 파일을 생성해볼건데,
그전에, 샤오미워치도 추가 하도록 하자.
워치가 2개가 되었으니, 이 두 클래스도 워치 인터페이스를 구현 하도록 코드를 작성 하자.



어쩌구.xml
>> 설정 파일 이다.
객체를 생성해주는 설정 파일 이다.
src/main/resources 내부에 만든다.



위와 같이, .xml 파일을 생성 했으면,

위와 같이 코드가 작성 되어 있는 모습을 확인 할 수 있다.

현재, test02 패키지 내부의 인터페이스와 클래스 이미지는 위와 같다.
이제 .xml 파일에 코드를 작성해, 객체를 생성 해보자.

위와 같이,
<bean> 태그를 사용해서, new를 표현 할 수 있다.
(개발자 대신에 new를 해준다)
그리고, 이렇게 .xml 파일 내부에서 객체를 인스턴스화 하면,
아래의 이미지와 같이, 파란색 S가 생겨난다.

현재 갤럭시폰은 갤럭시워치와 서로 의존 관계 이기 때문에,
갤럭시워치를 new 해줘야 한다고 했었다.
갤럭시워치도 .xml 파일 내부에서 객체 생성이 되어 있는 상황인데,
이 갤럭시워치는 갤럭시폰 클래스 내부에 멤버변수로 쓰이고 있기 때문에,
멤버변수의 값을 초기화 해주기 위해서, 아래와 같이 표현 한다.



.xml 파일 내부에서 생성된 객체는 아래의 15번째 라인의 코드를 통해 가져 온다.


이때,
객체가 아닌 멤버변수의 값을 초기화 하고 싶으면,
<constructor-arg value = "파라미터명" /> 으로 표현 한다.
포함관계인 멤버변수의 값을 초기화 하고 싶으면,
<constructor-arg ref = "파라미터명" /> 으로 표현 한다.
.xml 파일 내부에서
id 또는 ref 또는 value를 작성할 때,
나는 참조변수명 또는 파라미터명만
적었을뿐인데,
자료형 (데이터 타입 / 클래스명) 을 알아서,
인식하는 기능까지 지니고 있는듯 하다.
bean 태그 내부에
class 속성값에 패키지명.클래스명 을
명시 해줘서 그런건가 ,,
'Spring 프레임워크 > 예제' 카테고리의 다른 글
예제 06 의존 주입 (Setter Injection) (0) | 2023.08.01 |
---|---|
예제 05 의존 주입 (Contructor Injection) (0) | 2023.08.01 |
예제 04 (.xml 파일 기타 개념) (1) | 2023.07.31 |
예제 02 [ Factory 패턴 ] (BeanFactory) (0) | 2023.07.31 |
예제 01 (new 키워드의 높은 결합도) (2) | 2023.07.31 |