본문 바로가기
컴퓨터/Java

[레거시분석] 메모리 관점에서 참조형 객체 초기화 방법 (new, null)

by 버니케이 2024. 10. 22.
반응형

 

 

회사 레거시 코드 분석중

 

어떤 코드는 참조형 객체를 null로 초기화했고

어떤 코드는 참조형 객체를 new() 로 생성했다.

 

비슷한 로직인데 왜 이렇게 다르게 로직을 짰을까

 

 

예전에 고객이 프로젝트가 자꾸 죽는다고 컴플레인이 들어왔다.

원인을 찾아보니 힙메모리를 3기가로 설정해서

조금만 메모리를 사용해도 풀 gc 가 계속 돌아서 죽어버렸다.

 

아무튼 위의 얘기를 한 이유는



new() 키워드로 객체 생성 : 안정성

List<String> columnList = new ArrayList<>();

 

안정성: null 체크 없이 리스트의 메서드를 호출할 수 있으므로, NullPointerException 이 나지 않는다.

그라고 변수를 선언할 때 바로 리스트를 생성하기 때문에 별도의 초기화 과정 없이 변수를 바로 사용할 수 있다.



단점
불필요한 객체 생성: 

리스트가 실제로 사용되지 않는 경우에도 객체가 생성되기 때문에 메모리 낭비로 이어질 수 있다.

가비지 컬렉션이 이를 잘 처리하긴 하지만 

관리가 되지 않을 경우 힙메모리가 가득 차버리면 풀 gc 가 계속해서 일어나 프로그램이 죽을 수도 있다.

 


 

null 로 초기화하기 : 명백한 초기 상태

List<String> columnList = null;

 

명확한 초기 상태:

null로 초기화하면 해당 변수가 아직 초기화되지 않았음을 명확하게 알 수 있다.

변수가 나중에 특정 조건에 따라 초기화되는 경우에 유용할 수 있다.


하지만 이 로직은 NullPointerException 을 조심해야 되는데 

변수를 사용하기 전에 반드시 초기화하지 않았다면 NullPointerException이 발생할 수 있다.

그래서 변수 사용 전 항상 null 체크를 해야 한다.



+ 특정 조건에 따라 초기화되는 경우

 

리소스절약과 성능 최적화를 위해 

코드의 실행 흐름에서 특정 조건이 만족될 때 그 변수를 초기화하는 것을 의미한다.

List<String> ColumnList = null;

for (String table : filteredQueryTList) {
    if ("oracle".equals(databaseName)) {
        if (vo.getSynonymTable() != null && !vo.getSynonymTable().equals("")) {
            // 특정 조건이 만족될 때만 초기화
            ColumnList.add(table);
        }
    }
}

 

ColumnList가 초기화되었다면 사용되고, 그렇지 않다면 사용되지 않을 것이다.

 

리소스 절약

불필요한 객체 생성을 피하여 메모리 사용을 줄일 수 있다. 

 

성능 최적화

객체 생성 비용이 높은 경우, 필요할 때만 객체를 생성함으로써 성능을 최적화해야 한다.

 


 

모두가 다 좋은 환경에서 프로젝트를 돌리면 좋겠지만 대부분은 그렇지 않다.

이러한 관점에서 레거시 코드를 분석하는건 굉장히 좋은 자세라고 생각한다.

반응형

댓글