Book

    [Effective Java] item 8 + 9. finalizer와 cleaner 사용을 피하라, try-finally보다는 try-with-resources를 사용하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. [ item 8. finalizer와 cleaner 사용을 피하라 ] 자바는 두 가지 객체 소멸자를 제공한다. ☑️ finalizer : 예측할 수 없고, 상황에 따라 위험할 수 있어 일반적으로 불필요하다. ☑️ cleaner : finalizer보다는 덜 위험하지만, 여전히 예측할 수 없고, 느리고, 일반적으로 불필요하다. finalizer와 cleaner는 즉시 수행된다는 보장이 없다. 얼마나 신속하게 수행될지는 전적으로 가비지 컬렉터 알고리즘에 달렸으며, 동작 또한 마찬가지 finalizer를 달아두면 그 인스턴스의 자원 회수가 제멋대로 지연될 수 있다. 수행 여부조차 보장하지 못한다. 따라서 상태를 영구적으로 수정하..

    [Effective Java] item 6 + 7. 불필요한 객체 생성을 피하라, 다 쓴 객체 참조를 해제하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. [ item 6. 불필요한 객체 생성을 피하라 ] 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 재사용은 빠르고 세련되다. ☑️ 기존의 인스턴스 재사용하기 String s = new String("bikini") // X String s = "bikini" // O ☑️ 생성자 대신 정적 팩터리 메서드 사용하기 생성자 대신 정적 팩터리 메서드를 제공하는 불변 클래스(item1) → 불필요한 객체 생성을 피할 수 있음 ↔ 생성자는 호출할 때마다 새로운 객체를 만들지만, 팩터리 메서드는 X ex) Boolean(String) 대신 Boolean.valueOf(String) 사용하기 ☑️..

    [Effective Java] item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 많은 클래스가 하나 이상의 자원에 의존한다. 하지만 의존관계를 잘못 사용하면 유연하지 않고 테스트가 어렵다. 정적 유틸리티를 잘못 사용한 경우 public class SpellChecker { private static final Lexicon dictionary = ...; // 의존하는 리소스 (의존성) private SpellChecker() {} // 객체 생성 방지 public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글톤을 잘못 사용한 경우 public class SpellChe..

    [대규모 시스템 설계 기초] ch1. 사용자 수에 따른 규모 확장성

    본문은 '가상 면접 사례로 배우는 대규모 시스템 설계 기초’를 읽고 정리한 내용을 기반으로 작성된 글입니다. [단일 서버] ☑️ 단일 서버 구성에서의 사용자 요청 처리 흐름 사용자는 도메인 이름(api.site.com)을 통해 웹사이트에 접속함 이 접속을 위해서는 도메인 이름을 DNS(Domain Name Service)에 질의하여 IP주로 변환하는 과정 필요 DNS는 보통 제 3사업자(third party) ↔ 우리 시스템의 일부는 아님 DNS 조회 결과로 IP주소 반환 (15.123 …) 해당 IP주소로 HTTP(HyperText Transfer Protocol) 요청이 전달됨 요청을 받은 웹 서버는 HTML페이지나 JSON형태의 응답 반환 [데이터베이스] 사용자가 늘면 서버 하나로는 충분하지 않아서..

    [Effective Java] item 3+4. private 생성자나 열거 타입으로 싱글턴임을 보증하라, 인스턴스화를 막으려거든 private 생성자를 사용하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 ☑️ 싱글턴 : 인스턴스를 오직 하나만 생성할 수 있는 클래스 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 싱글턴으로 만들어진 클래스에 의존하는 클라이언트 코드는 테스트가 어렵기 때문 의존성 주입을 통해 테스트하도록 설계하는게 바람직함 [싱글턴을 만드는 방법] ☑️ 방법 1) private 생성자 + public static final 필드 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() {} public ..

    [Effective Java] item 2. 생성자에 매개변수가 많다면 빌더를 고려하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 정적 팩터리와 생성자는 똑같은 제약이 하나 있다. 선택적 매개변수가 많을 때 적절하게 대응하기 어렵다는 점이다. ex) 식품 포장 영양정보 표현 클래스 ↔ 항목이 엄청 많은데 대부분의 값이 0인 경우 [점층적 생성자 패턴 - 확장하기 어렵다!] : 필수 생성자 1개, 선택 매개변수를 늘여가며 생성자를 만드는 패턴 public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private fi..

    [Effective Java] item 1. 생성자 대신 정적 팩터리 메서드를 고려하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자지만, 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다. [정적 팩터리 메서드의 장점] ☑️ 이름을 가질 수 있다 : 반환될 객체의 특성을 잘 드러내는 이름을 지어주자 ☑️ 호출될 때마다 인스턴스를 새로 생성하지는 않아도 된다 : 반복되는 요청에 같은 객체를 반환하는 식으로, 언제 어디스 인스턴스를 살아있게 할지를 철저히 통제할 수 있다. (인스턴스 통제 클래스) 싱글톤으로 만들 수 있음 인스턴스화 불가로 만들 수도 있음 불변 값 클래스에서 동치인 인스턴스가 단 하나뿐임을 보장할 수 있음 ☑️ 반환 타입의 하위 타입 객체를 반환할 수 있는..

    [Effective Java] item 25. 톱레벨 클래스는 한 파일에 하나만 담으라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 말 그대로.. ☑️ 톱레벨 클래스 중복정의 예시 Utensil과 Dessert를 참조하는 Main 클래스 public class Main { public static void main(String[] args) { System.out.println(Utensil.NAME + Dessert.NAME); } } Utensil.java class Utensil { static final String NAME = "pan"; } class Dessert { static final String NAME = "cake"; } Main클래스와 Utensil클래스만 있는 상태에서 Main을 실행하면 pancake를 출력한다. Desser..

    [Effective Java] item 24. 멤버 클래스는 되도록 static으로 만들어라 **

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. ☑️ 중첩 클래스(nested class) : 다른 클래스 안에 정의된 클래스 ↔ 자신을 감싼 바깥 클래스에서만 쓰여야함 정적 멤버 클래스 비정적 멤버 클래스 익명 클래스 지역 클래스 정적 멤버 클래스를 제외한 나머지는 내부 클래스(inner class)에 해당된다. [정적 멤버 클래스 & 비정적 멤버 클래스] ☑️ 정적 멤버 클래스 : 다른 클래스 안에 선언되고, 바깥 클래스의 private 멤버에도 접근할 수 있다 외부 클래스와 독립적으로 존재할 수 있음 → 외부 클래스의 인스턴스에 종속되지 않음 (inner class로 간주되지 않는 이유) ☑️ 비정적 멤버 클래스 구문상으로는 static 있고 없고 차이지만, 비정적..

    [Effective Java] item 23. 태그 달린 클래스보다는 클래스 계층구조를 활용하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 태그 달린 클래스는 클래스 계층구조보다 훨씬 나쁘다! [태그 달린 클래스] : 두가지 이상의 의미를 표현할 수 있고, 그 중 현재 표현하는 의미를 태그 값으로 알려주는 클래스 public class Figure { enum Shape {RECTANGLE, CIRCLE}; // 태그 필드 - 현재 모양을 나타낸다. final Shape shape; // 다음 필드들은 모양이 사각형(RECTANGLE)일 때만 쓰인다. double length; double width; // 다음 필드는 모양이 원(CIRCLE)일 때만 쓰인다. double radius; // 원용 생성자 public FigureWithTag(double rad..

    [Effective Java] item 21+22. 인터페이스는 구현하는 쪽을 생각해 설계하라, 인터페이스는 타입을 정의하는 용도로만 사용하라

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. [item 21. 인터페이스는 구현하는 쪽을 생각해 설계하라] ☑️ 생각할 수 있는 모든 상황에서 불변식을 해치지 않는 디폴트 메서드를 작성하기란 어려운 법이다 최대한 범용적으로 구현하더라도 현존하는 모든 Collection 구현체와 잘 어우러지는 것은 아니다 → 컴파일에 성공하더라도 기존 구현체에 런타임 오류 발생시키기 가능 ☑️ 디폴트 메서드라는 도국 생겼더라도, 인터페이스를 설계할 때는 여전히 세심한 주의를 기울여야 한다. 릴리즈 전에 테스트하여 결함 찾아내기 [item 22. 인터페이스는 타입을 정의하는 용도로만 사용하라] ☑️ 인터페이스 : 자신을 구현한 클래스의 인스턴스를 참조할 수 있는 타입 역할 → 자신의 인..

    [Effective Java] item 20. 추상 클래스보다는 인터페이스를 우선하라 *

    본문은 Effective Java를 읽고 정리한 내용을 기반으로 작성된 글입니다. 추상 클래스 >인터페이스 >인터페이스+추상 골격 구현 클래스 [인터페이스와 추상 클래스] ☑️ 추상 클래스 단일 상속만 가능 구현 → 추상 클래스의 하위 클래스가 된다. 기존 클래스 위에 새로운 추상 클래스를 끼워넣기는 어렵다. ☑️ 인터페이스 다중 상속 가능 구현 → 같은 타입으로 취급된다. 기존 클래스에도 손쉽게 새로운 인터페이스를 구현해넣을 수 있다. → 믹스인 정의에 안성맞춤 ☑️ 계층구조가 없는 타입 프레임워크 ex) 다음 코드는 아무런 문제가 되지 않는다. public interface Singer { AudioClip sing(Song song); } public interface SongWriter{ Song..