객체를 재사용해야 할 때 똑같은 기능의 객체를 매번 생성하기보다는 객체 하나를 재사용하는 편이 나을 때가 많다. String s = new String("example"); 위 문장은 실행될 때마다 String 인스턴스를 새로 만든다. "example" 이라는 문자열의 쓰임새와 목적이 완전히 동일함에도 불구하고, 불필요한 인스턴스를 계속 생성한다. Stirng s = "example"; 위 코드는 매번 새로운 인스턴스를 생성하는 대신 하나의 String 인스턴스를 사용한다. JVM은 동일한 문자열 리터럴에 대해 인스턴스를 공유하도록 설계되어 있다. 정적 팩토리 메서드를 활용해 객체생성 효율을 높여보자 생성자 대신 정적 팩토리 메서드를 제공하는 불변 클래스에서는 이를 활용해 불필요한 객체 생성을 피할 수 ..
클래스의 의존 관계 많은 클래스들은 하나 이상의 자원에 의존한다. 자원에 의존해 기능을 수행하는 클래스는 의존성(dependency) 을 갖는다. 라고 표현할 수 있다. 이러한 클래스의 의존성은 보통 의존하고자 하는 기능을 가진 클래스의 참조변수를 멤버변수로 선언함으로써 표현한다. public class AccountService { private TransferService transferService; public void transfer(Account withdrawalAccount, Account depositAccount) { // business logic start ... } } 위 예시에서 계좌 서비스는 송금 서비스에 의존한다. (계좌 서비스의 기능 구현에는 송금 서비스의 도움이 필요하다...
static 메서드와 필드로만 구성된 클래스 개발을 하다보면 static 메서드와 필드로만 구성된 클래스가 필요한 경우가 있다. 객체지향적인 설계는 아니지만, 다음과 같은 상황이 필요한 경우에는 유용하게 사용할 수 있다. 기본 타입 값이나 처리대상 클래스와 관련된 메서드들을 모아놓은 유틸리티성 클래스의 설계 ex) java.util.Arrays 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드 또는 팩토리 ex) java.util.Collections 추가 상속을 방지하기 위한 final 클래스와 관련한 메서드들의 집합 정적 유틸리티 클래스의 설계의도 정적 유틸리티 클래스는 인스턴스로 만들어 쓰기 위해 설계한 것이 아니다. 그런데 자바 언어에서 클래스의 생성자를 명시하지 않는 경우, 매개변수가 없..
싱글턴(singleton) 오직 하나의 인스턴스로 구성된 클래스를 의미한다. 싱글턴은 보통 무상태(stateless) 객체 또는 설계상 유일하게 사용하는 시스템 컨포넌트를 구현할 때 사용한다. 싱글턴 구현방법 1. public static 멤버를 final 필드로 선언 public class WorkScheduler { public static final WorkScheduler INSTANCE = new WorkScheduler(); private WorkScheduler() {} public void resetSchedule() {} } 위 코드에서 private 생성자는 public static final 필드인 INSTANCE 를 초기화할 때 딱 한 번 호출된다. 외부로 노출되는 다른 생성자는 존..
생성자의 매개변수가 많을 때 생성자는 선택적 매개변수가 많아질 때 설계가 곤란해진다. 클래스는 여러 개의 필드를 가질 수 있기 때문에, 초기화대상 필드의 수가 많아지면 (필자는 보통 4개 이상이 되면 많게 느껴지는 것 같다) 적절한 대응방안에 대해 고민하게 된다. 정적 팩토리 메서드의 경우도 마찬가지이다. 점층적 생성자 패턴 (Telescoping Constructor Pattern) 생성자에 필요한 인자가 많아질 때, 개발자들은 일반적으로 '점층적 생성자 패턴' 을 사용한다. 단순히 생성자에 필요한 매개변수의 여러가지 조합으로 생성자의 입력 파라미터를 구성하는 구현방법이다. public class Member { private Long memberId; private String name; privat..
getter/setter/property를 쓰지 않는다 도메인 오브젝트로 설계한 Entity 또는 VO 클래스에는 getter/setter/property 사용을 지양해 상태노출을 최소화 하라는 지침이다. 숨은 의미 객체지향 프로그래밍의 핵심 개념 중 캡슐화를 지키면서 객체에 메시지를 보내 스스로 상태에 대한 처리로직을 수행하도록 하라는 의미이다. 이 지침은 데이터 전달을 목적으로 하는 DTO나 비즈니스 플로우 실행을 목적으로 하는 컨트롤러•서비스 유형의 무상태 클래스를 대상으로 하지 않는다. 객체에 메시지를 전달해라 객체지향 프로그래밍은 객체의 '역할과 책임' 이라는 핵심 가치를 잘 유지할 때 그 의미가 살아난다. 이 역할과 책임의 대한 의의는 객체가 자신의 상태, 즉 정보에 대한 처리책임을 자신 스스..
일급 컬렉션 컬렉션은 wrapping 하면서 컬렉션 외의 다른 필드를 가지고 있지 않은 클래스를 일급 컬렉션 이라고 한다. 이번 여덟번째 지침에서는 도메인 클래스를 컬렉션으로 감싸 처리하는 경우, 이를 일급 컬렉션으로 구현하라는 가이드를 제시한다. 숨은 의미 컬렉션은 '무리', '모음' 이라는 의미를 갖는다. 클래스 인스턴스들을 컬렉션 자료구조로 감싸게 되면 구조로부터 도메인 로직을 얻을 수 있다. 인스턴스들의 집합에서 특정 인스턴스를 찾아내거나, 정렬을 할 수도 있고, 특정한 패턴으로 자료구조의 내용을 변형하는 것도 가능하다. 일급컬렉션은 인스턴스의 집합을 '복수형 클래스'로 정의함으로써 단수형 클래스가 가질 수 없는 비즈니스 로직을 구현할 수 있도록 도와주는 도메인 설계라고 볼 수 있다. 예시 고객이..
2개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다 클래스의 인스턴수 변수를 제한하라는 지침이다. 여기서의 인스턴수 변수는 원시타입, 또는 컬렉션과 같이 기본 또는 자료구조형의 변수를 의미한다. 숨은 의미 클래스의 인스턴수 변수는 클래스가 관리하는 '상태' 를 의미한다. 클래스의 상태는 클래스의 정체성을 나타내는 요소이다. 이 상태의 종류가 많다는 것은 클래스가 여러 종류의 정체성을 가지고 설계되었다는 것을 의미한다. 이 지침은 원칙의 세 번째 지침인 '모든 원시값과 문자열을 포장한다' 의 내용과 통한다. 세 번째 지침은 상태에 도메인적 의미를 부여하라는 가이드라고 할 수 있다. 이 일곱번째 지침에서는 의미를 갖는 상태를 어떻게 관리하는 것이 좋은지에 대한 내용을 이야기하고 있다. 예시 class N..
모든 엔티티를 작게 유지한다 이 원칙에서 칭하는 엔티티는 클래스, 패키지를 통틀어 업무적 구분을 갖는 단위를 의미한다. '작은 엔티티' 라고 판단할 수 있는 대략적인 기준은 다음과 같다. 50줄 이하의 클래스 10개 이하의 파일을 갖는 패키지 숨은 의미 엔티티를 작성할 때 하나의 목적을 염두하고 설계하라는 의미이다. SOLID 원칙중 '단일 책임 원칙' 과도 상통한다. 먼저 클래스의 크기를 줄여 분리하기 시작하면, 작은 역할을 하게 될 것이다. 이 때 작은 역할을 통해 이루려는 하나의 목적을 도출할 수 있다. 그 목적을 이루기 위한 클래스들을 모아 패키지로 구성하면 된다. 패키지와 파일이 많은 것은 나쁜게 아니다 이 원칙을 지키기 어려운 가장 큰 원인은, 패키지를 새로 만들고 파일을 새로 만드는 행위에 ..
- Total
- Today
- Yesterday