본문 바로가기
Java

static method를 담은 Utility 클래스의 인스턴스화(객체 생성) 문제

by jaeyong 2022. 4. 3.

공통화된 함수들의 작성이 필요할 때, static method만을 추가한 Utility 클래스를 만들때가 있습니다.

이 Utiility 클래스의 경우에는 static method만을 담고 있어 굳이 객체를 만들지 않고도 다음과 같이 사용할 수가 있습니다.

 

public class Main {
    public static void main(String[] args) {
        System.out.println(Utility.add(1, 2));
    }
}

class Utility {
    public static int add(int a, int b) {
        return a + b;
    }
}

 

그러나 이 Utility 클래스의 단점은 개발자는 의도하지 않았지만 사용자가 Utility 클래스를 생성할 수 있다는 것입니다.

Utility 클래스의 생성자를 명시하지 않았기 때문에 컴파일러에서 컴파일할 때 public 기본 생성자를 생성하게 됩니다.

그래서 이 Utility 클래스를 다음과 같이 생성할 수 있게 됩니다.

 

Utility util = new Utility();

 

생성을 할 수 있다고 해서 바로 문제가 나타나는 것은 아니지만 이것에는 여러 단점이 있습니다.

 

1. 객체를 만들어 쓰라고 만든 클래스가 아니지만 실제 사용자가 오해하여 사용할 수 있다.

(static method만 있어서 굳이 안할 확률이 높긴 하지만...)

2. 개발자의 의도와는 다르게 이 객체를 상속해서 다른 클래스를 생성할 수 있다. 

 

개발자가 이것을 명확히 하려면 다음과 같이 private 생성자를 추가해주면 된다.

(의도를 명확히 하기 위해서 주석을 추가하였다.)

class Utility {
	// 기본 생성자가 만들어지는 것 방지
	private Utility() {}

    public static int add(int a, int b) {
        return a + b;
    }
}

 

참고 도서: effective java 

'Java' 카테고리의 다른 글

Java의 불필요한 객체 생성 피하기  (0) 2022.04.03

댓글