2017년 4월 23일 일요일

[java] interface constant는 왜 쓰면 안될까?

가끔 이런 생각을 해보기도 한다.
귀찮은데 그냥 상수도 인터페이스로 넣어서 쓰면 안되나?
아니면 implements로 상수를 전부 가져와서 이름만으로 써도 되지 않을까?
아래의 예시가 왜 쓰면 안되는지 도움이 될 것 같다. 우선 클래스 안에 있는 상수들을 보자.
public class ClassCons {
 public static final double CONS = 0.0;
 public static final String CONS1 = "22";
 public static final int CONS2 = 1;
}
이제 이것들을 인터페이스 상수로 바꿔보자.
interface InterCons {
 double CONS = 0.0;
 String CONS1 = "22";
 int CONS2 = 1;
}
인터페이스는 어짜피 public이다. 그러니 public이 필요없다. 바뀌지 않을 것이니 final도 필요없다.
마치 짧아진 코드를 보며 내가 뭔가 해낸(?)사람 처럼 느낄 수도 있지만 아님을 바로 깨달을 수 있다.
public class BadIdea implements InterCons{
 public BadIdea() {
  System.out.println(CONS);
  System.out.println(CONS1);
  System.out.println(CONS2);
 }
 public static void main(String[] args) {
  BadIdea badIdea = new BadIdea();
 }
}
이 내용은 위에서 만든 인터페이스 상수를 가져온 것이다. 과연 이렇게 하면 잘 될까?
0.0
22
1
예상한 대로 나왔다. 하지만 이렇게 한다면?
public class BadIdea implements InterCons{
 private int CONS = 100;
 public BadIdea() {
  System.out.println(CONS);
  System.out.println(CONS1);
  System.out.println(CONS2);
 }
 public static void main(String[] args) {
  BadIdea badIdea = new BadIdea();
 }
}
다시 실행해보자.
100
22
1
값이 바뀌어 있다. 이 말은 인터페이스 상수를 가져오는 순간 해당 클래스와 그 서브 클래스들이 상수들로 더러워(?)진다는 것을 말한다.
자칫하면 값들이 꼬일 수 있다. 에러도 잘 보이지 않을 거고 디버깅에도 애를 먹을 수도 있겠다.

댓글 없음:

댓글 쓰기