전체 글 129

Item6. 불필요한 객체 생성을 피하라

👎 불필요한 객체 생성기존 객체를 재사용해야 한다면 새로운 객체를 만들지 마라 [EX. 불필요한 객체 생성의 예]String s = new String("bikini");// 개선 예String s = "bikini"; [EX. 불필요한 객체 생성의 예2 - 오토박싱]private static long sum() { Long sum = 0L; for(long i = 0; i 👍 객체의 재사용대안1. 정적 팩터리 메서드생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 그렇지 않음불변 객체 뿐 아니라 가변 객체 중에서도 사용 중 변경되지 않을 것임을 안다면 재사용 가능 [EX. 불변 클래스에서 생성자 대신 제공하는 정적 팩터리 매서드]Boolean.valueOf(String)// Jav..

Item5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

많은 클래스가 하나 이상의 자원에 의존사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않음 [EX.정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어려움]public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... }} [EX.싱글턴을 잘못 사용한 예 - 유연하지 않고 테스트하기 어려움]public class SpellChec..

Item4. 인스턴스화를 막으려거든 private 생성자를 사용하라

정적 메서드와 정적 필드만을 담은 클래스객체 지향의 관점에서 좋은 방식은 아니나 나름의 쓰임새 존재🙂기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있음 → ex. java.lang.Math, java.util.Arrays특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수 있음 → ex. java.util.Collectionsfinal 클래스와 관련한 메서드를 모아놓을 때 → final 클래스를 상속해 하위 클래스에 메서드를 넣는 것이 불가능하기 때문 ☝️ 문제점정적 멤버만 담은 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아님그럼에도 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어버림즉, 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 이 생성..

Item3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글턴 (Singleton)인스턴스를 오직 하나만 생성할 수 있는 클래스함수와 같은 무상태(stateless) 객체, 혹은 설계상 유일해야 하는 시스템 컴포넌트 등클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기 어려워질 수 있음 → 인터페이스를 구현해 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없음싱글턴을 만드는 방식은 크게 두 가지이며, 두 방식에는 공통적인 특징 존재생성자는 private으로 감춰두고,유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련 1. public static 멤버가 final 필드인 방식[EX.public static final 필드 방식의 싱글턴]public class Elvis { publ..

정렬 알고리즘 정리

🎶 단순 정렬시간 복잡도 O(n2)효율이 좋지 않음 버블 정렬 (Bubble Sort)이웃한 두 요소의 대소 관계를 비교해 교환을 반복 (가장 기본적인 정렬)n개 요소의 정렬이 모두 끝나려면 n-1회의 패스가 수행되어야 함하나의 패스에서 요소 간의 교환이 이루어지지 않았다면 정렬이 완료된 상태로 간주하여 정렬 작업 중단나아가 특정 인덱스부터 요소 간의 교환이 이루어지지 않았다면 해당 인덱스까지는 정렬 완료 상태로 간주 for(int i = 0; i i; j--) { if(a[j-1] > a[j]) { // 앞의 요소와 비교 및 교환 swap(a, j, j-1); chk++; } } if(chk == 0) { break; } // 패스 내에서 요소 간 교환이 이루어지지 않았으므로 ..