전체 글 230

클린코드 10장 - 클래스

클래스 체계 클래스는 public static 변수 → private static 변수 → private 변수 순으로 배치. public 변수가 필요한 경우는 거의 없다. 변수 목록 다음에는 public 함수를 배치하며, private 함수는 자신을 호출하는 함수 직후에 넣는다. 즉, 추상화 단계가 순차적으로 내려가서, 신문 기사처럼 읽혀야 한다. 캡슐화 테스트 코드에서 private 변수나 함수에 접근하려고 하면 protected로 선언하는 방법도 있으나, 테스트 코드에서 private 변수나 함수에 접근해야 하는 경우는 별도 클래스로 빼는게 맞다. 클래스는 작아야 한다. 하나의 함수가 하나의 행동만을 해야 했다면, 하나의 클래스는 하나의 책임만을 맡아야 한다. 간결한 클래스 이름이 떠오르지 않는다면 ..

클린코드 9장 - 단위테스트

애자일과 TDD덕택에 단위테스트를 자동화하는 프로그래머들이 많아졌으며 점점 늘어나는 추세다. 하지만, 테스트를 추가하려고 급하게 서두르는 와중에 제대로 된 테스트 케이스를 작성해야 한다는 더 중요하고 미묘한 사실을 놓치고 있다. TDD법칙 세 가지 첫째 법칙 : 실패하는 단위 테스트를 작성할 때까지 실제 코드를 작성하지 않는다. 둘째 법칙 : 컴파일은 실패하지 않으면서 실행이 실패하는 정도로만 단위 테스트를 작성한다. 셋째 법칙 : 현재 실패하는 테스트를 통과할 정도로만 실제 코드를 작성한다. 실패하는 테스트 추가 → 최소한의 코딩을 통한 테스트 통과 → 테스트 통과를 유지하면서 구조/설계 개선 깨끗한 테스트 코드 유지하기 테스트 코드는 구현에 신경쓰지 않고 조금 지저분해도 빨리 개발하는게 좋다고 생각하..

[책] 성공하는 프로그래밍 공부법

자바지기라는 아이디로 유명한 NextStep의 박재성님 외 3분의 프로그래밍 학습에 대한 책이다. 박재성님의 "동의하지 않는 권위에 굴복하지 않기"라는 글귀가 인상적이었다. 이태원클래쓰의 한 장면이 떠오르기도 하는데, 이 말은 체계적이고 이론적 지식체계(권위)보다 실질적이고 깊은 경험에 집중하라는 의미로도 연결된다. 책에서는 저자의 중학생 아들에게 프로그래밍의 경험을 전파하는 과정이 나오는데, 공감이 많이 됐고 나도 애들에게 응용해 보고 있다. 저자는 의식적인 연습의 중요성을 강조하는데, 컴포트존에서 업무/연습하는 것보다 목적의식을 가지고 의식적으로 연습하는 부분을 강조한다. '아웃라이어'에서 얘기하는 1만시간도 단순히 1만시간을 보내는 것이 아닌 의식적인 연습시간을 의미한다. "한 단계 성장하려면 같은..

책 이야기 2022.05.28

Optional

Optional 만드는 법 • of – Null이 아닌 오브젝트를 이용해 Optional을 만들 때 • empty – 빈 Optional을 만들 때 • ofNullable – Null인지 아닌지 알지 못하는 오브젝트로 Optional을 만들 때 private static final Optional EMPTY = new Optional(null); public static Optional of(T value) { return new Optional(Objects.requireNonNull(value)); } public static Optional empty() { Optional t = (Optional) EMPTY; return t; } public static Optional ofNullable(T ..

stream 함수

filter 함수 : 만족하는 데이터만 걸러내는데 사용 map 함수 : 데이터를 변형하는데 사용 sorted 함수 : 데이터가 순서대로 정렬된 stream을 리턴 distinct 함수 : 중복되는 데이터가 제거된 stream을 리턴 flatMap 함수 : Map + Flatten ( Stream 을 Stream으로 반환) filter 함수 : 만족하는 데이터만 걸러내는데 사용 • Predicate에 true를 반환하는 데이터만 존재하는 stream을 리턴 Stream filter(Predicate

클린코드 8장 - 경계

외부 코드 사용하기 외부 코드(다른 팀의 컴포넌트 또는 오픈소스)는 기능성과 유연성을 제공하기 위해 필요이상의 기능을 제공할 수가 있다. 아래와 같이 Sensor를 담는 Map(외부 인터페이스)을 사용하면, get할때마다 캐스팅을 해야 한다. Map sensors = new HashMap(); ... Sensor s = (Sensor)sensors.get(sensorId); 아래와 같이 Generics를 사용하면 조금 나아지지만, Map인터페이스가 변하면 소스를 다 수정해야 한다. Map sensors = new HashMap(); ... Sensor s = sensors.get(sensorId); 아래와 같이 Map을 Sensors 안으로 숨기면, Map이 변해도 나머지 프로그램에 영향을 미치지 않는다..

클린코드 7장 - 오류처리

오류 코드보다 예외를 사용하라 오류를 코드로 관리하면, 함수를 호출하는 호출자 코드가 복잡해진다. 예외를 던지면, 실제 로직과 오류처리 로직이 뒤섞이지 않으니까 호출자 코드가 더 깔끔해진다. // Bad public class DeviceController { ... public void sendShutDown() { DeviceHandle handle = getHandle(DEV1); // Check the state of the device if (handle != DeviceHandle.INVALID) { // Save the device status to the record field retrieveDeviceRecord(handle); // If not suspended, shut down if..

Functional Interface

Function Interface package java.util.function; import java.util.Objects; @FunctionalInterface public interface Function { R apply(T t); } 아래와 같이 T를 받아 R을 리턴하는 apply 함수 구현하여 사용 public static void main(String[] args) { Function myAdder = x -> x + 10; int result = myAdder.apply(5); System.out.println(result); } ByFunction Interface package java.util.function; import java.util.Objects; @FunctionalIn..

반응형