-
아이템22. 인터페이스는 타입을 정의하는 용도로만 사용하라TL;DR
인터페이스의 용도
❌ 위의 지침에 맞지 않는 예시 (안티패턴)
// 상수 인터페이스 안티패턴 - 사용금지!!!
public interface PhysicalConstants {
// 아보가드로 수 (1/몰)
static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수 (J/K)
static final double BOLTZMANN_CONSTANT = 1.380_648_52e-23;
// 전자 질량 (kg)
static final double ELECTRON_MASS = 9.109_383_56e-31;
}
그렇다면 상수를 공개할 목적이라면?몇가지 선택지가 있다.
public class PhysicalConstants{
private PhysicalConstants{} //인스턴스화 방지
// 아보가드로 수(1/몰)
public static final double AVOGADROS_NUMBER = 6.022_140_857e23;
// 볼츠만 상수(J/K)
public static final double BOLYZMANN_COUNT = 1.380.648_52
// 전자 질량(kg)
public static final double ELECTRON_MASS = 9.109.383-56e-31;
import static effectivejava.chapter4.item22.constantutilityclass.PhysicalConstants.*;
public class Test {
double atoms(double mols) {
return AVOGADROS_NUMBER * mols;
// }
...
// PhysicalConstants 를 빈번히 사용햤다면 정적 임포트를 값어치를 한다.
} |
Beta Was this translation helpful? Give feedback.
Replies: 4 comments 9 replies
-
깔끔하게 요약해주셔서 넘 잘봤습니다👍 대표적으로 ObjectInputStream, ObjectOUtputStream 이 사용하고 있는데, 이는 직렬화 역직렬화에 사용되는 클래스라고 합니다. 그리고 이 두 클래스들은 유명한 프레임워크나 라이브러리에서 참조하고 있더라구요. 사소한 부분이라도 설계를 잘 해야겠구나... 라는걸 느꼈습니다. |
Beta Was this translation helpful? Give feedback.
-
제가 이전에 정리한 #14 를 정리할 때 Utils 클래스는 객체 지향과는 거리가 먼 클래스 방식이라고 하였고 그러나 Util 클래스를 사용하는 경우가 있다고 하였는데 Utils 클래스 사용 경우
위 3가지 경우 말고도 하나의 다른 경우도 존재함을 알게 되었습니다. ㅎㅎ 이 뿐만 아니라 #48 멤버 클래스는 되도록 static으로 만들라는 이유가 해당 주제
멤버 클래스가 바깥 인스턴스를 사용하지 않는 경우 static으로 선언해야만 쓸데 없이 객체가 만들어 질 때마다 해당 멤버 클래스의 메모리 공간이 사용되는 낭비를 하지 않듯 인터페이스 내 상수 또한 변하지 않을 값을 굳이 interface를 구현하는 객체를 만들때 마다 상수를 만들기에 메모리 공간 사용이 낭비 되는 것이기 떄문입니다. 두 경우 모두 변할 일이 없거나 특정한 객체에 연관이 없다면 굳이 여러개가 만들어질 낭비를 일으킬 필요가 없기에 이런 것 까지 고려하여 설계하는 것이 중요한 것 같습니다.!! |
Beta Was this translation helpful? Give feedback.
-
최근에 책에서 언급한 대로 상수용 인터페이스를 만들어서 사용한 적이 있어 얼굴이 홍당무가 됐습니다 😞 P.S. 많은 사람들이(심지어 시니어 이상 급도 해당) 유틸리티 클래스를 만들 때 단/복수를 오용한다고 생각합니다. |
Beta Was this translation helpful? Give feedback.
-
바이너리 호환성이라는 개념을 잘 몰라 찾아보니 자바 프로그램을 바꾸는 것과 관련된 호환성 개념이 크게 3가지로 분류하더라구요 호환성
reference : 모던 자바 인 액션, 한빛미디어 |
Beta Was this translation helpful? Give feedback.
최근에 책에서 언급한 대로 상수용 인터페이스를 만들어서 사용한 적이 있어 얼굴이 홍당무가 됐습니다 😞
stackoverflow 등의 정보의 홍수 사이트 속에서 허우적대다 보면, 심심치 않게
final class
형태를 접할 수 있었습니다.그 당시에는
final
키워드를 붙인 코드가 이질감이 느껴져 그냥 지나쳤는데, 적절한 이유를 상기하며 적재적소에 활용해야겠다는 성찰의 시간을 가졌네요 👍P.S. 많은 사람들이(심지어 시니어 이상 급도 해당) 유틸리티 클래스를 만들 때 단/복수를 오용한다고 생각합니다.
이 자리를 통해 패키지명은
util
(단수), 유틸리티 메서드를 제공하는 클래스 이름은XXXs
처럼 복수형을 사용하자고 외쳐봅니다.