스프링에서 리스트나 맵 같은 제네릭 컬렉션을 사용할 때 항상 초기화해야 하느냐는 질문에 대해, 답은 상황에 따라 다르지만 일반적으로 "예, 초기화하는 것이 좋다"고 할 수 있습니다. 다만, 스프링의 특정 기능(예: 의존성 주입)이나 코드 작성 방식에 따라 초기화가 필수적이지 않을 수도 있습니다. 좀 더 자세히 설명해볼게요.
1. 기본적인 초기화 필요성
자바에서 리스트나 맵 같은 컬렉션 객체는 선언만으로는 실제 객체가 생성되지 않습니다. 예를 들어:
List<String> myList;
myList.add("hello"); // NullPointerException 발생
위 코드처럼 myList
를 초기화하지 않으면 null
상태로 남아있고, 사용하려 할 때 NullPointerException
이 발생합니다. 따라서 컬렉션을 직접 사용할 경우에는 반드시 초기화해야 합니다:
List<String> myList = new ArrayList<>();
myList.add("hello"); // 정상 동작
맵도 마찬가지입니다:
Map<String, Integer> myMap = new HashMap<>();
myMap.put("key", 1); // 정상 동작
2. 스프링에서의 초기화
스프링에서는 의존성 주입(Dependency Injection)을 통해 객체를 관리하기 때문에 초기화 여부가 약간 달라질 수 있습니다.
(1) @Autowired
와 함께 사용할 때
스프링 빈으로 등록된 리스트나 맵을 @Autowired
로 주입받는 경우, 스프링이 자동으로 해당 컬렉션을 초기화해줍니다. 예를 들어:
@Component
public class MyService {
@Autowired
private List<MyInterface> myList;
public void printList() {
myList.forEach(System.out::println);
}
}
이 경우 myList
는 스프링이 관리하는 MyInterface
타입의 모든 빈을 리스트로 주입해줍니다. 여기서는 내가 직접 초기화할 필요가 없습니다. 단, 주입받을 빈이 없으면 myList
는 빈 리스트(빈 ArrayList
)로 초기화됩니다(null
이 아님).
(2) 일반 필드로 사용할 때
스프링 빈 내부에서 로컬 변수나 필드로 컬렉션을 선언하고 직접 사용할 경우에는 반드시 초기화해야 합니다. 예:
@Component
public class MyService {
private List<String> myList; // 초기화 안 함
public void addItem() {
myList.add("item"); // NullPointerException 발생
}
}
위 코드에서는 myList
가 null
이므로 초기화가 필요합니다. 다음과 같이 수정해야 합니다:
private List<String> myList = new ArrayList<>();
3. 초기화 생략 가능한 경우
- 스프링 설정에서 값 주입:
@Value
나 XML/자바 설정으로 컬렉션에 값을 주입받는 경우 초기화 없이도 스프링이 알아서 처리합니다. - lazy 초기화: 컬렉션을 처음 사용할 때 초기화하는 패턴을 사용할 수도 있습니다:
private List<String> myList;
public List<String> getMyList() {
if (myList == null) {
myList = new ArrayList<>();
}
return myList;
}
4. 결론 및 권장 사항
- 직접 초기화 권장: 스프링 주입에 의존하지 않는 일반 필드라면 항상 초기화하는 습관을 들이는 게 안전합니다.
new ArrayList<>()
나new HashMap<>()
로 초기화하는 비용은 미미하니 코드 안정성을 위해 추천합니다. - 스프링 주입에 의존 시:
@Autowired
나 설정으로 주입받는 경우에는 초기화를 생략해도 되지만, 코드 가독성과 명확성을 위해 초기화 여부를 문서화하거나 확인하는 게 좋습니다. - Null 체크: 초기화 여부가 불확실한 상황이라면 방어적으로
null
체크를 추가하는 것도 방법입니다.
궁금한 점이 더 있다면 구체적인 상황을 알려주시면 더 자세히 도와드릴게요!
'GPT Archiving' 카테고리의 다른 글
Java에서 저수준 메모리 관리를 한다면? 2 (0) | 2025.03.03 |
---|---|
Java에서도 저수준 메모리 관리를 할 수 있다면? (0) | 2025.03.03 |
계층별 @Transactional (0) | 2025.02.12 |
리플렉션 3 (0) | 2025.01.11 |
리플렉션 2 (0) | 2025.01.11 |