GPT Archiving

제네릭 초기화

99duuk 2025. 2. 28. 11:35

스프링에서 리스트나 맵 같은 제네릭 컬렉션을 사용할 때 항상 초기화해야 하느냐는 질문에 대해, 답은 상황에 따라 다르지만 일반적으로 "예, 초기화하는 것이 좋다"고 할 수 있습니다. 다만, 스프링의 특정 기능(예: 의존성 주입)이나 코드 작성 방식에 따라 초기화가 필수적이지 않을 수도 있습니다. 좀 더 자세히 설명해볼게요.

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 발생
    }
}

위 코드에서는 myListnull이므로 초기화가 필요합니다. 다음과 같이 수정해야 합니다:

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