[Effective Java] 챕터4. 인스턴스화를 막으려거든 private 생성자를 사용하라

Posted by 김성철

Effective Java - 챕터4. 인스턴스화를 막으려거든 private 생성자를 사용하라

정적 메소드와 정적 필드만을 담은 클래스를만들때가 있음  
	=================================================================================================================  
	public class StringUtil {  
		public static final String stringValue = "hihi";  
  
		//생성자가 존재하지 않음  
  
		public static String getString(){  
			return stringValue;  
		}  
	}  
	=================================================================================================================  
  
정적 멤버만 담음 유틸리티 클래스는 인스턴스로 만들어서 쓰려고 설계한게 아니지만  
생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어줌  
  
//개발자가 의도한 사용법  
	=================================================================================================================  
	StringUtil.getString();  
	=================================================================================================================  
  
//생성자를 명시하지 않아서 사용가능한 사용법  
	=================================================================================================================  
	StringUtil stringUtil = new StringUtil();  
  
	=================================================================================================================  
  
위와같이 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 이게 자동으로 생성된것인지 구분할수 없음  
  
이럴때 private 생성자를 추가하면 클래스의 인스턴스화를 막을수 있음  
  
	=================================================================================================================  
	public class StringUtil {  
		public static final String stringValue = "hihi";  
  
		//private 생성자  
		private StringUtil(){  
  
		}  
		public static String getString(){  
			return stringValue;  
		}  
  
	}  
  
	=================================================================================================================  
  
위와같이 만들면 사용자는 아래와 같이 인스턴스를 생성할수 없게 됨  
	=================================================================================================================  
	StringUtil stringUtil = new StringUtil();  
  
	=================================================================================================================  
  
또한 상속을 불가능하게 함, 모든 생성자는 명시적이든 묵시적이든 상위클래스의 생성자를 호출하게 되는데,  
이를 private 로 선언하면 하위클래스에서 상위클래스의 생성자에 접근할수 있는 방법이 막힘