Java

    이펙티브 자바, 쉽게 정리하기 - item 53. 가변 인수는 신중히 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 53. 가변 인수는 신중히 사용하라 가변 인수가 1개 이상이어야 할 때 잘못 구현한 예 public static int min(int... args) { if (args.length == 0) { throw new IllegalArgumentException("인수가 1개 이상 필요합니다."); } int min = args[0]; for (int i = 0; i < args.length; i++) { if(args[i] < min) { min = args[i]; } } return min; } @Test public void minTest(){ int min = min(); System.out.println("min = " + min); } 인수를 넣지 않고 ..

    이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 52. 다중정의는 신중히 사용하라 다중정의(Overloading) 문제의 예제 코드 static class CollectionClassifier { public static String classify(Set s) { return "집합"; } public static String classify(List s) { return "리스트"; } public static String classify(Collection s) { return "그 외 컬렉션"; } } @Test public void collectionClassifierTest() { Collection[] collections = { new HashSet(), new ArrayList(), new H..

    이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라

    이펙티브 자바, 쉽게 정리하기 - item 51. 메서드 시그니처를 신중히 설계하라 메서드 이름은 신중히 짓자 메서드 표준 명명규칙을 따르자. (item. 68) 최대한 커뮤니티에서 널리 받아들여지는 이름을 사용하자. 편의 메서드를 너무 많이 만들진 말자 클래스에 메서드가 너무 많으면 다른 개발자가 알기도 힘들뿐더러 문서화 등 유지보수도 힘들다. 확신이 서지 않으면 만들지 말자. 매개변수 목록은 짧게 유지하자 일반적으로 4개 이하가 좋다. 같은 타입의 매개변수가 연속으로 나오면 특히 해롭다. 동작이 의도와 다르게 변질되기 쉽다. JS 에서는 3개 이상인 경우 매개변수 객체 등을 이용하는 것이 깔끔했다. 자바에서는 이걸 헬퍼 클래스라고 한다. 매개변수가 너무 길 때 1: 메서드를 쪼개자 메서드를 여러 메서..

    이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라

    이펙티브 자바, 쉽게 정리하기 - item 50. 적시에 방어적 복사본을 만들라 클래스 내부 수정을 본의아니게 허락하는 경우 static class Period { private final Date start; private final Date end; public Period(Date start, Date end, int version) { if (start.compareTo(end) > 0) { throw new IllegalArgumentException( start + "가 " + end + "보다 늦다." ); } if(version == 1) { this.start = start; this.end = end; } else { // 방어적 복사본 만들기 this.start = new Date(s..

    이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라

    이펙티브 자바, 쉽게 정리하기 - item 49. 매개변수가 유효한지 검사하라 오류 검사의 일반 원칙1: 오류를 즉시 잡아라 "오류는 가능한 한 빨리 발생한 곳에서 잡아야 한다." 오류를 발생한 즉시 잡지 못하면 해당 오류를 감지하기도 어렵고, 정확히 어디서 발생했는지 알기도 어렵다. 다양한 매개변수 검사 예시 (가장 간단한 원칙) 인덱스 값은 음수이면 안 된다. 객체 참조는 null 이 아니어야 한다. 매개변수 검사를 제대로 하지 못했을 때 벌어지는 일 메서드가 수행되다가 모호한 예외를 던지며 실패한다. 메서드가 잘 수행되지만 잘못된 결과를 반환한다. 메서드에서 사용한 다른 객체를 이상한 상태로 만들어 미래의 알 수 없는 시점에 문제가 발생한다. 아래 단계의 현상일수록 문제는 더욱 심각해진다. 예외의 ..

    이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라

    이펙티브 자바, 쉽게 정리하기 - item 48. 스트림 병렬화는 주의해서 적용하라 자바 언어와 동시성 동시성 프로그래밍에서는 항상 앞서가있었다. 1996년부터 스레드, 동기화, wait/notify를 지원 자바 5부터 java.util.concurrent, Executor 등을 선도적으로 지원했다. 자바 7부터 fork/join 패키지를 추가 자바 8부터 병렬 스트림을 지원 스트림에서는 parallel()을 통해 손쉽게 동시성을 제공했다. 동시성 주의점 안전성(safety) 과 응답 가능(liveness) 메르센 소수 구하기 예제로 parallel() 문제 살펴보기 메르센 소수란 2의 n승 빼기 1로 표현되는 소수를 말한다. @Test public void mersenne() { primes() .ma..

    중재자 패턴 (Mediator Pattern) 이란?

    중재자 패턴 (Mediator Pattern) 이란? 여러 객체 간의 의사소통하는 방법을 추상화한다. 객체간의 혼란스러운 종속성을 줄일 수 있는 디자인 패턴이다. 객체간 직접적인 통신을 제한하고 중개자 객체(Mediator Object)를 통해서만 협업하도록 한다. 실생활 예제 아파트의 관리사무소는 주민들간의 갈등을 중간에서 해결해준다. 비행기 이착륙을 돕는 관제탑 다이어그램으로 살펴보기 아래의 형태만 중재자 패턴인 게 아니라, 아래의 형태가 대표적인 중재자 패턴인 것이다. 즉, 다른 다이어그램으로 그려져도 중재자 패턴을 사용한 것일 수 있다. 여러 컴포넌트간 결합도를 중재자를 통해 낮춘다. Colleague 가 Colleague 를 직접 참조하는 선이 없다는 것이 중요하다. Mediator 를 참조하고..

    이터레이터 패턴 (Iterator Pattern) 이란?

    이터레이터 패턴 (Iterator Pattern) 이란? 컬렉션의 요소를 순회하는 패턴이다. 내부의 표현을 노출시키지 않는다. List, Stack, Tree, Set 과 같이 어떠한 컬렉션인지 노출시키지 않는다. 내부 표현을 노출시키면 컬렉션의 종류가 바뀔 때마다 클라이언트 코드를 변경해주어야 하는 불편함이 생긴다. 다이어그램으로 살펴보기 예시: 게시판 게시글 순회 Before: 인덱스를 직접 이용해 순회하기 전통적인 배열 및 컬렉션 순회 방법이다. 단, 컬렉션의 종류가 바뀌게 되면 클라이언트 코드를 수정해주어야 한다는 단점이 있다. public class Client { public static void main(String[] args) { Board board = new Board(); board..

    인터프리터 패턴 (Interpreter Pattern) 이란?

    인터프리터 패턴 (Interpreter Pattern) 이란? 인터프리터의 의미 자체는 보통 해석해주거나 통역해주는 역할을 가진 사람 혹은 물건이다. 악보를 음악으로 변환하는 것도 이러한 역할의 하나이기 때문에 연주자라는 의미도 있다. 가장 쉽게 볼 수 있는 예로는 정규표현식이 있다. 자주 등장하는 문제를 별개의 언어로 정의하고 재사용하는 패턴이다. 문법에 등장하는 규칙을 클래스로 표현하고 언어에서의 표현식을 해석하고 평가한다. Expression 이라는 추상 클래스를 만드는 경우가 많다. Expression 클래스에서 파생된 구체적인 클래스는 언어의 다양한 규칙 또는 요소를 나타낸다. 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있다. 다이어그램으로 살펴보기 컴포짓 패턴과 굉장히 유사하..

    커맨드 패턴 (Command Pattern) 이란?

    커맨드 패턴 (Command Pattern) 요청을 호출하는 쪽과 요청을 수행하는 쪽을 분리하는 (Decoupling) 패턴이다. 요청을 요청에 대한 모든 정보를 포함하는 독립형 객체 (stand-alone object) 로 변환하는 동작 디자인 패턴이다. 요청을 메서드 인수로 제공하거나 요청 실행을 지연하거나 대기열에 추가하거나 실행 취소 가능한 작업을 지원할 수 있다. 다이어그램으로 살펴보기 호출자, 명령, 수신자가 각각 나누어져 있다. 이 때문에 요청을 처리하는 방법이 바뀌더라도 호출자의 코드는 바뀌지 않는다. 커맨드 자체는 재사용도 가능하다. 로깅 혹은 실행취소 등 문제: 텍스트 에디터 앱의 예시 텍스트 에디터 상단 툴바에는 다양한 버튼들이 존재한다. 버튼들은 모두 다른 기능을 하지만 비슷하게 생..

    책임 연쇄 패턴 (Chain Of Responsibility) 이란?

    책임 연쇄 패턴 (Chain of Responsibility) 각각의 책임이 연결된 패턴이다. 단일 책임 원칙에서 말하는 그 책임과 비슷하다. ex) 어떤 클래스가 변경되어야 한다면 그 이유는 단 한가지 (단일 책임) 여야만 한다. 요청을 보내는 쪽과 요청을 처리하는 쪽 (핸들러) 을 분리하는 패턴이다. 일련의 핸들러를 따라 요청을 전달하는 패턴이다. 핸들러는 요청을 받으면 자신이 처리할지 다음 핸들러로 넘길지 결정한다. 일련의 핸들러를 가지고 있지만 실제요청이 들어오기 전까지는 어떤 핸들러를 써야할지 모를 때 유용하다. 적절한 핸들러를 찾거나 체인이 모두 소진될 때까지 체인을 따라 요청이 전달된다. 다이어그램으로 살펴보기 클라이언트는 핸들러 체인에 요청을 보내 처리를 요청한다. 클라이언트는 자신이 어떤..

    프록시 패턴 (Proxy Pattern) 이란?

    프록시 패턴이란? 사전적 의미로 대리 혹은 대리인과 같은 의미가 있다. 사용자가 접근하고 싶은 오브젝트에 접근하기 전에 프록시 오브젝트라 불리는 오브젝트에 접근을 먼저 하도록 강제하는 것이다. 오브젝트 접근 요청 시 해당 요청은 먼저 프록시 오브젝트에게 간다. 실생활에 비유하자면 연예인을 섭외하기 위해서 연예인에게 직접 전화를 거는 것이 아니라 매니저에게 전화를 걸어 섭외하는 것이다. 다이어그램으로 보기 Proxy 는 데코레이터 패턴처럼 필드 내부에서 RealSubject 를 참조하고 있다. 활용 예제: 메서드의 소요시간 측정과 게으른 초기화 (Lazy initialization) 가정 자동차를 만드는 메서드가 있다. 자동차를 만드는데 걸리는 시간은 그때그때 다르다. 평균적으로 1초 ~ 1.5초가 걸린다..

반응형