공통화된 함수들의 작성이 필요할 때, 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 |
---|
댓글