오류 코드 (무한 루프)
public MemberService(){
private final MemberService instance = new MemberService();
}
무한 루프의 동작 원리
- final 키워드를 사용하면 해당 필드는 생성 시점에 반드시 초기화되어야 합니다.
- 클래스 내부에서 다른 인스턴스를 생성하는 final 변수가 있다면, 이 필드를 초기화하기 위해 생성자가 호출될 때 새로운 인스턴스를 생성하게 됩니다.
- 그런데 new MemberService()로 인스턴스를 생성할 때, 클래스 내에서 또 다른 new MemberService()가 호출되면 무한 재귀가 발생하게 됩니다.
- 즉, 객체가 생성되기 전에 final 필드를 초기화하기 위한 과정에서 또 다른 객체 생성이 발생하므로 무한 루프에 빠지게 됩니다.
- 이 과정이 끝없이 반복되어 메모리가 소모되면서 StackOverflowError가 발생할 수 있습니다.
해결 코드
public class MemberService {
private static final MemberService instance = new MemberService();
private MemberService() {}
public static MemberService getInstance() {
return instance;
}
}
결론
- 생성자를 사용할 때 final을 통해서 객체를 생성하게 된다면, 무한루프에 빠지지 않도록 조심하자