본문 바로가기

반응형

IT/자바

[Effective JAVA] Item 16 public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라 class Point { public double x; public double y; } 위와 같은 퇴보한 클래스는 데이터 필드를 직접 접근할 수 있음으로 캡슐화의 이점을 제공할 수 없다. class Point { private double x; private double y; public Point(double x, double y){ this.x = x; this.y = y; } public double getx(){ return this.x; } public double gety(){ return this.y; } public void setx(double x){ this.x = x; } public void sety(double y){ this.y = y; } } 이렇게 패키지 바깥에서 접근할 수.. 더보기
[Effective Java] Item 15 클래스와 멤버의 접근 권한을 최소화하라 잘 설계된 컴포넌트와 어설프게 설계된 컴포넌트의 차이는 얼마나 잘 숨겼느냐다. 잘 설계된 컴포넌트는 모든 내부 구현을 완벽히 숨겨, 구현과 API를 깔끔하게 분리한다. 오직 API를 통해서만 다른 컴포넌트와 소통함으로 이를 정보 은닉 또는 캡슐화로 부른다. 정보은닉의 장점은 1. 시스템 개발 속도를 높인다. 2. 시스템 관리 비용을 낮춘다. 3. 성능 최적화에 도움을 준다. (다른 컴포넌트에 영향을 주지 않고 최적화 작업을 수월하게 할 수 있음으로) 4. 소프트웨어 재사용성을 높인다. 5. 큰 시스템을 제작하는 난이도를 낮춘다.(시스템 전체가 완성되지 않더라도 개발 컴포넌트의 동작을 검증할 수 있기때문에) 정보은닉의 핵심을 접근 제한자의 사용에 있다. 이 핵심의 원리는 모든 클래스와 멤버의 접근성을 가능.. 더보기
[Effective Java] Item 14 Comparable을 구현할지 고려하라 Comparable의 compareTo는 Object의 equals와 동일하지만 2가지 다른점이 존재한다. 1. 동시성 비교 + 순서 비교 2. 제네릭 형태 Comparable을 구현한 객체는 순서가 존재함으로 Arrays.sort로 쉽게 정렬할 수 있다. ex) 명령줄 인수들을 중복 제거 후 알파벳 순으로 정렬 public static void main(String[] args){ Set s = new TreeSet(); //TreeSet (순서 정렬 + 중복제거) Collections.addAll(s, args); System.out.println(s); } String이 Comparatable을 구현되어있으므로 가능한 코드이다. 순서가 명확한 값 클래스를 작성한다면 반드시 Comparable 인터페.. 더보기
[Effective Java] item 10 equals는 일반 규약을 지켜 재정의하라 equals 메서드를 재정의해서 사용하는 경우가 많은 아래의 경우엔 기본 equals 메소드를 사용하는 걸 추천한다. 1) 각 인스턴스가 본질적으로 고유한 경우 (thread -> 동작 클래스) 2) 인스턴스의 논리적 동치성을 검사할 일이 없는 경우 3) 상위클래스에서 재정의한 equals 가 하위 클래스에도 맞는 경우 4) 클래스가 private이거나 package-private이고 equals 메서드를 호출할 일이 없는 경우 하지만 equals 메서드를 재정의해야 된다면 아래의 규약을 따라야 한다. 1) 반사성 : 자기자신에 대한 비교 = 항상 참 2) 대치성 : 서로 비교 대상을 바꾸더라도 = 항상 참 3) 추이성 : 서로 참이라면 연결관계에 있는 제3의 객체도 참이여야 한다. 더보기 추이성을 보장.. 더보기
[Effective Java] item 8, 9 finalizer & cleaner 사용을 피해라 / try-finally 보다는 try-with-resources를 사용해라 자바는 두가지 객체 소멸자를 제공한다. 1) finalizer 2) cleaner finalizer 는 예측할 수 없고 상황에 따라 위험할 수 있어 사용을 권장하지 않는다. 반면에 cleaner는 finalizer 보단 안전하지만 여전히 예측할 수 없음으로 사용을 권장하지 않는다. 해결방법으론 item 9인 try-with-resources 를 사용하는 것인데 먼저 왜 사용하면 안되는지 설명하고자 한다. 문제점 1 finalizer, cleaner은 언제 수행될지 알기 어렵다. 왜냐하면 finalizer 쓰레드는 우선순위가 낮기 때문에 실행될 기회를 자꾸 놓치고 cleaner 스레드는 동일한 순위에 있지만 백그라운드에서 수행되고 가비지컬렉터의 통제를 받기 때문에 즉각 수행됨을 보장하지 못한다. 수행 시점.. 더보기
[Effective Java] item 7 다 쓴 객체 참조를 해제하라 자바가 가비지 컬렉터를 갖춘 언어라고 해서 메모리 관리는 무시해서는 안된다. public class stack { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public stack(){ elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object o){ ensureCapacity(); elements[size++] = o; } public Object pop(){ if (size == 0) throw new EmptyStackException(); return elements[--size].. 더보기
[Effective Java] item6 불필요한 객체 생성을 피하라 String s = new String("bikini"); => 실행될 때마다 String 인스턴스를 새로 만든다. 이 문장은 반복문이나 비번하게 호출할 경우 수백만개의 String 인스턴스가 생성될 수 있는 코드이다. String s = "bikini"; 로 코드를 수정함으로서 같은 객체를 재사용하도록 개선할 수 있다. 불필요한 객체 생성을 피할 수 있는 방법은 여러개가 있다. 1) 정적 팩터리 메서드를 사용해서 불필요한 객체 생성을 피할 수 있음 ex) Boolean(String) 생성자 대신에 Boolean.valueof(String) 팩터리 메서드를 사용 = 생성자는 호출때마다 새로운 객체를 생성하지만, 팩터리 메서드는 그렇지 않다. 2) 캐싱을 통해 재사용할 수 있음 static boolean .. 더보기
[Effective Java] Item 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 Item 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 예를 들어 스펠링 검사 클래스를 구현할때 사전이라는 객체는 불변의 객체로 공유되어야 한다. 하지만, 이때 사전은 언어별로 또는 특수 어휘용으로 검사의 기준이 되는 사전은 달라질 수 있다. 정적 유틸리티 public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() { } ... } 싱클턴 패턴 public class SpellChecker { private static final Lexicon dictionary = ...; p.. 더보기

반응형