목록전체 글 (139)
럿고의 개발 노트
이펙티브 자바 - 2장. 객체 생성과 파괴 아이템 6. 불필요한 객체 생성을 피하라. 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 훨씬 나을때가 있다. 특히 불변 객체는 언제든 재사용할 수 있다. Item1에서 팩터리 메서드를 제공하는 불변클래스에서는 정적 팩터리 메서드를 사용해 불필요한 객체 생성을 피할 수 있다. 예를들어 Boolean(String) 생성자 대신 Boolean.valueOf(String) 팩터리 메서드를 사용하는 것이 좋다. 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 전혀 그렇지 않다. 불변 객체만이 아니라 가변 객체라 해도 사용 중에 변경 되지 않을 것임을 안다면 재사용할 수 있다. 생성 비용이 아주 비싼 객체는 반복해서 필요하다면 캐싱..
이펙티브 자바 - 2장. 객체 생성과 파괴 아이템 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 많은 클래스가 하나 이상의 자원에 의존한다. 가령 맞춤법 검사기는 사전에 의존하는데, 이런 클래스를 정적 유틸리티 클래스 또는 싱글턴으로 구현한 모습을 볼 수 있다. 정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다. public interface Lexicon { } public class KoreanDictionary implements Lexicon { } import java.util.List; public class SpellCheckerStatic { private static final Lexicon dictionary = new KoreanDictionary();..
이펙티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 4. 인스턴스화를 막으려거든 private 생성자를 사용하라. 정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때가 있다. Ex) java.lang.Math, java.util.Collections, java.util.Arrays final 클래스와 관련한 메서드들을 모아놓을 때도 사용한다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는건 불가능 하기 때문이다. 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 생성한다. 즉, 매개변수를 받지 않은 public 생성자가 만들어지며, 사용자는 이 생성자가 자동 생성된 것인지 구분할 수 없다...
오브젝트 - 코드로 이해하는 객체지향 설계 Chapter01. 객체, 설계 01. 티켓 판매 애플리케이션 구현하기 소극장의 이벤트를 기획했다. 추첨을 통해 선정된 관람객에게 공연을 무료로 관람할 수 있는 초대장을 발송하는 것이다. 조건이 있는데, 입장 시 이벤트에 당첨된 관람객과 그렇지 못한 관람객은 다른 방식으로 입장시켜야 한다. 이벤트 당첨 관람객은 초대장을 티켓으로 교환한 후에 입장할 수 있으며, 당첨되지 않은 관람객은 티켓을 구매해야만 입장할 수 있다. 따라서 관람객을 입장시키기 전 이벤트 당첨 여부 확인과 이벤트 당첨자가 아니면 티켓을 판매한 후에 입장시켜야 한다. Invitation Class - 초대장 when : 공연을 관람할 수 있는 초대일자 import java.time.LocalDat..
이펙티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라. 싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스다. 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 그러나 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 왜냐하면 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문이다. 싱글턴을 만드는 방법은 두가지 인데, 두가지 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나..
이팩티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 2. 생성자에 매개변수가 많다면 빌더를 고려하라. 매개 변수가 많은 코드들을 어떻게 관리해야 할까? 첫번째 대안 - 점층적 생성자 패턴(Telescoping Constructor Pattern) public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public NutritionFacts(int servingSize, int servings, int cal..
[프로그래머스] 코딩테스트 연습 다리를 지나는 트럭 간략한 문제 풀이 제대로된 큐를 사용하는 알고리즘 문제였다. 멀쩡한 사각형 이후로 제일 어려웠던 문제였다고 생각한다. 트럭을 하나씩 빼면서 다리 위에 올리는데, 계속해서 무게와 비교하면서 시간을 더해주는 것이다. 문제에서 나오는 조건을 조건문으로 고쳐나가는 부분이 어려웠다...ㅎㅎ Github 문제 및 풀이 문제 설명 트럭 여러 대가 강을 가로지르는 일 차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 트럭은 1초에 1만큼 움직이며, 다리 길이는 bridge_length이고 다리는 무게 weight까지 견딥니다. 트럭이 다리에 완전히 오르지 않은 경우, 이 트럭의 무게는 고려하지 않습니다. ..
이팩티브 자바 3판 - 2장. 객체 생성과 파괴 아이템 1. 생성자 대신 정적 팩터리 메서드를 고려하라. public class StaticFactoryMethodEx1 { public static Boolean valueOf(boolean b){ return b ? Boolean.TRUE : Boolean.FALSE; } } 정적 팩터리 메서드가 생성자보다 좋은 장점 1. 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로 반환될 객체의 특성을 제대로 설명을 못한다면, 정적 팩터리 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 예를들어 BigInteger(int, int, Random)과 BigInteger.probablePrime(int, Random) 둘 중 "값이 ..
동작 파라미터화 동작 파라미터화란? 메서드 내부적으로 다양한 동작을 수행할 수 있도록 코드를 메서드 인수로 전달합니다. 자주 바뀌는 요구사항에 대해 효과적으로 대응 할 수 있으며, 아직 어떻게 실행할 것인지 결정하지 않은 코드 블럭을 의미합니다. 이 코드 블럭은 나중에 프로그램에서 호출되며 코드 블록의 실행은 나중으로 미뤄집니다. 결과적으로 코드 블록에 따라서 메서드의 동작이 파라미터화가 됩니다. 예제 잘못된 코드 사과의 클래스 생성 enum Color { RED, GREEN } public class Apple { private int weight; private Color color; public Apple(int weight, Color color) { this.weight = weight; thi..