반응형
타진
개발 그라운드
타진
전체 방문자
오늘
어제
  • 분류 전체보기 (136)
    • 프로그래밍 (65)
      • Java (28)
      • Android (1)
      • Web (19)
      • Web-Spring (12)
      • R (5)
      • Angular (0)
    • 운영체제 (17)
      • Linux (14)
      • Docker(vmware) (3)
    • 클라우드 (4)
      • aws (0)
      • aws_handson (4)
    • 개발문제해결 (25)
      • Exception (12)
      • 알고리즘 문제풀이 (13)
    • 그 외 개발관련 (23)
    • 일상 (1)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • handson
  • docker
  • 빠른 시작 끄기
  • chromium edge
  • 키보드매핑
  • docker ps
  • 문법 체크
  • GIT
  • stackset
  • 정올알고리즘 정올 알고리즘
  • angular cli
  • github
  • 라이젠
  • cfn
  • github actions
  • transit_gateway
  • Github CLI
  • alt tab
  • ubuntu terminal
  • wsl_update_x64
  • 일어키보드
  • 빠른 시작 켜기
  • AWS
  • vmmem
  • wsl2
  • 4700u
  • jdk14
  • docker desktop
  • transit gateway peering
  • 크로미움 엣지

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
타진

개발 그라운드

프로그래밍/Java

이펙티브 자바 규칙 19 - 인터페이스는 자료형을 정의할 때만 사용하라

2018. 2. 18. 23:52
반응형

인터페이스는 해당 클래스의 객체를 참조 할 수 있는 자료형(type)의 역할을 합니다.


인터페이스를 구현하면 int, string 등의 자료형을 그대로 오버라이드 하게되는데


이 목적을 위해 언터페이스를 사용하죠.


하지만 개중에는 그렇지 않은 인터페이스도 있습니다.


public Interface PhysicalConstants {
// 아보가르도 수(1/mol)
static final double AVOGADROS_NUMBER = 6.02214199e23;
// 볼쯔만 상수(J/K)
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
// 전자 질량(kg)
static final double ELECTRON_MASS = 9.10938188e-31;
}

이는 상수 인터페이스 패턴입니다.


보통 편의성 때문에 사용하게 됩니다.


이런식의 인터페이스 사용은 


public class Main {
public static void main(String[] args) {
System.out.println(PhysicalConstants.AVOGADROS_NUMBER);
}
}

이렇게 사용해야 할 코드를


public class Main implements PhysicalConstants  {
public static void main(String[] args) {
System.out.println(AVOGADROS_NUMBER);
}
}

이렇게 사용하게 해주거든요


하지만 이런 방식의 사용은 클래스의 세부사항이 공개되게 됩니다. 캡슐화 원칙 훼손이죠.


그리고 인터페이스는 자료형의 구현이라는 하나의 약속입니다.


이 사항을 모르는 일반 사용자들은 자료형의 구현으로 파악할텐데 혼란을 줄 가능성도 큽니다.


그리고 Main 클래스를 상속하는 모든 하위 클래스가 저 구현형태에 영향을 받게됩니다.


다 같이 사이좋게 오염! 되는거죠.


때문에 삼갈 필요가 있습니다.


저런 형식의 상수정의를 사용하고 싶다면


자바 1.5부터는 더 좋은 방법이 있습니다.



public class PhysicalConstants {
private PhysicalConstants() {}
static final double AVOGADROS_NUMBER = 6.02214199e23;
static final double BOLTZMANN_CONSTANT = 1.3806503e-23;
static final double ELECTRON_MASS = 9.10938188e-31;
}

이런 식의 상수 클래스를 정의한 후



사용할 클래스에 이런 식으로 정적 임포트를 해주면 됩니다.

import static com.effectivejava.science.PhysicalConstants;


이렇게 한다면 인터페이스를 사용하지 않고도


사용하던 방식 그대로 상수 사용이 가능해집니다.



이 규칙의 요는 인터페이스를 자료형 구현 이외의 용도로 사용하지 말라는 것이지요.

반응형
저작자표시 비영리 변경금지 (새창열림)

'프로그래밍 > Java' 카테고리의 다른 글

이펙티브 자바 규칙 20 - 태그가 달린 클래스 대신 클래스 계층을 활용하라  (0) 2018.02.20
이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자  (0) 2018.02.17
이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자  (0) 2018.02.15
    '프로그래밍/Java' 카테고리의 다른 글
    • 이펙티브 자바 규칙 21 - 전략을 표현하고 싶을 때는 함수 객체를 사용해라
    • 이펙티브 자바 규칙 20 - 태그가 달린 클래스 대신 클래스 계층을 활용하라
    • 이펙티브 자바 규칙 18 - 추상 클래스 대신 인터페이스를 사용하자
    • 이펙티브 자바 규칙 17 - 계승을 위한 문서를 갖추거나, 그럴 수 없다면 금지하자
    타진
    타진
    vulnerable1324@gmail.com

    티스토리툴바