본문 바로가기

전체 글

(60)
007. 다 쓴 객체 참조를 해제하라 👉 메모리 누수 컴퓨터 프로그램이 필요하지 않은 메모리를 계속 점유하고 있는 현상을 말한다. ♦︎ 객체들의 다 쓴 참조 배열로 Stack 을 구현 /** StackMemoryLeak.java */ public class StackMemoryLeak { private Object[] elements; private int size = 0; private static final int DEFAULT_INITIAL_CAPACITY = 16; public StackMemoryLeak() { elements = new Object[DEFAULT_INITIAL_CAPACITY]; } public void push(Object e) { ensureCapacity(); elements[size++] = e; } pub..
006. 불필요한 객체 생성을 피해라 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. 특히 불변 객체는 언제든 재사용할 수 있다. 👉 문자열 객체 이 코드는 실행될 때마다 String 인스턴스를 새로 만든다. String s = new String("bikini"); 생성자로 넘기는 “bikini” 자체가 이 생성자로 만들어내려는 String과 기능적으로 완전히 똑같으므로 아래와 같이 생성하는 것이 올바르다. 아래 코드는 새로운 인스턴스를 매번 만드는 대신 하나의 String 인스턴스를 사용한다. String s = "bikini"; 나아가 같은 가상 머신 안에서 이와 똑같은 문자열 리터럴을 사용하는 모든 코드가 같은 객체를 재사용함이 보장된다. (같은 내용의 String 객체가 선언된다면 기존의 객체..
005. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 👉 의존 객체 주입 패턴 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식 (의존 객체 주입의 한 형태) 클래스의 유연성, 재사용성, 테스트 용이성을 높인다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Lexicon dictionary) { this.dictionary = Objects.requireNonNull(dictionary); // 의존성 주입 } public boolean isValid(Stri..
004. 인스턴스화를 막으려거든 private 생성자를 사용하라 단순히 정적 메서드와 정적 필드만을 담을 클래스를 만들고자 할 때 (아래 예시) 인스턴스를 만들어 쓰지 못하도록 의도할 때 생성자를 명시하지 않으면 컴파일러가 자동으로 생성하기 때문에 private 접근 제한자로 생성자를 만들면 클래스의 인스턴스화를 막을 수 있다. Util 용도의 클래스 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓은 클래스 final 클래스와 관련한 메서드들을 모아놓을 때
003. private 생성자나 열거 타입으로 싱글턴임을 보증하라 👉 싱글턴(Singleton) 인스턴스를 오직 하나만 생성할 수 있는 클래스 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트 등 단점 클라이언트 테스트가 용이하지 않다. 클래스를 싱글턴으로 만들면 타입을 인터페이스로 만들고 그 인터페이스를 구현해서 만든 싱글턴이 아닌 경우 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할 수 없기 때문 👉 싱글턴을 입력하는 방식 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 마련한다. ♦︎ public static final 필드 방식의 싱글턴 private 생성자는 public static final 필드인 Elvis.INSTANCE를 초기화 할 때 딱 ..
002. 생성자에 매개변수가 많다면 빌더를 고려하라 선택적 매개변수가 많을 때 선택할 수 있는 세가지 패턴 1. 점층적 생성자 패턴(telescoping constructor pattern) 필수 매개변수만 받는 생성자, 필수 매개변수와 선택 매개변수 1개를 받는 생성자, 선택 매개변수를 2개까지 받는 생성자, ... 형태로 늘려가며 매개변수를 전부 다 받는 생성자까지 늘려가는 방식 단점 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 사용자가 설정하길 원치 않는 매개변수가 있어도 지정하지 않을 수 없다. 클라이언트가 실수로 매개변수의 순서를 바꿔도 컴파일 오류가 발생하지 않아 런타임 시 오동작 할 수 있다. 2. 자바빈즈 패턴(JavaBeans Pattern) 매개변수가 없는 생성자로 객체를 만든 후 setter 메서드들을 호출해 원..
6. 클래스 (2) 6.9 인스턴스 멤버와 this 인스턴스 멤버 인스턴스 멤버를 생성한 후 사용할 수 있는 필드와 메소드 인스턴스 멤버와 메모리 인스턴스 필드는 객체마다 별도 인스턴스 메소드는 객체마다 존재하지 않고 메소드 영역에 저장되고 공유됨 개구리책에서 본 내용이랑 다른거같아서 이해가 안됨.. 나중에 개구리 책을 다시 읽어보면서 정리 할 것 * 6.10 정적 멤버와 static 정적 멤버 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드 static 타입 필드 [= 초기값]; static 리턴타입 메소드(매개변수) { } 정적 필드의 초기화 필드 선언과 동시에 부여 계산이 필요한 경우 정적 블록 사용 정적 블록 static { } 클래스가 메모리로 로딩될 때 자동으로 실행됨 클..
6. 클래스 (1) 6.1 객체 지향 프로그래밍 객체 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것 객체의 구성요소 속성 동작 객체 지향 프로그래밍의 특징 캡슐화 Encapsulation 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있음 외부의 잘못된 사용으로 인해 객체가 손상되는 것을 막기 위함 상속 Inheritance 부모 역할의 상위 객체와 자식 역할의 하위 객체가 있음 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해줌 상속은 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와줌 이미 잘 개발된 객체를 재사용해서 새로운..