개발 177

[Effective Java] item 59. 라이브러리를 익히고 사용하라

[Effective Java] item 59. 라이브러리를 익히고 사용하라 Random 메서드 무작위 정수 하나를 생성하고 싶다고 해보자. 값의 범위는 0부터 명시한 수이다. 아주 흔히 마주치는 문제로, 많은 프로그래머가 다음과 같은 짤막한 메서드를 만들곤 한다. 흔하지만 문제가 심각한 코드! static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 괜찮은 듯 보여도 문제를 세 가지나 내포하고 있다. Random 메서드의 결함 첫 번째, n이 그리 크지 않은 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. 두 번째, n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 ..

[Effective Java] item 58. 전통적인 for 문보다는 for-each 문을 사용하라

[Effective Java] item 58. 전통적인 for 문보다는 for-each 문을 사용하라 전통적인 for문 방식 컬렉션 순회하기 - 더 나은 방법이 있다. for (Iterator i = c.iterator(); i.hasNext(); ){ Element e = i.next(); ... // e로 무언가를 한다. } 배열 순회하기 - 더 나은 방법이 있다. for (int i = 0; i < a.length; i++) { ... // a[i]로 무언가를 한다. } 이 관용구들은 while문보다는 낫지만 가장 좋은 방법은 아니다. 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 아니라 우리에게 진짜 필요한 건 원소 뿐이다. 더군다나 이처럼 쓰이는 요소 종류가 늘어나면 오류가 생길 가능성이..

HTTP 프로토콜 1.0 vs 1.1 vs 2.0 비교

HTTP 프로토콜 1.0 vs 1.1 vs 2.0 1. HTTP 1.0 브라우저 친화적인 프로토콜 요청 및 응답에 대한 메타 데이터를 포함하는 헤더 필드 제공(Status code, Content-Type 등) Response: Content-Type에 Http 파일 외에도 스크립트, 스타일 시트, 미디어 등을 전송 가능 Method: GET, HEAD, POST Connection 특성: 응답 직후 종료 (Connection 1 Establishment - TCP Three-Way Handshake) Connected to xxx.xxx.xxx.xxx (Request) GET /my-page.html HTTP/1.0 User-Agent: NCSA_Mosaic/2.0 (Windows 3.1) (Respo..

개발 2021.03.15

[Effective Java] item 57. 지역변수의 범위를 최소화하라

[Effective Java] item 57. 지역변수의 범위를 최소화하라 지역변수의 유효범위 지역변수의 유효범위를 줄이면 어떤것이 좋을까? 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 유효범위를 어떻게 줄일까? 1. 가장 처음 쓰일 때 선언하자 미리 선언해두면 코드가 어수선해져 가독성이 떨어진다. 변수를 실제로 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수 있다. 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언한다거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 2. 선언과 동시에 초기화하자. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. 단, try-catch 문은 이 규칙에..

[Effective Java] item 56. 공개된 API 요소에는 항상 문서화 주석을 사용하라

[Effective Java] item 56. 공개된 API 요소에는 항상 문서화 주석을 사용하라 1. 자바독(Javadoc)이란? API 문서화 유틸리티 소스코드 파일에서 문서화 주석(자바독 주석)이라는특수한 형태로 기술된 설명을 추려 API 문서로 변환해준다. 2. javadoc 사용법 javadoc 명령어 사용 $ javadoc -d docs {file_name}한글 사용시 UTF-8로 인코딩 필요 $ javadoc -d docs *.java -encoding UTF-8 -charset UTF-8 -docencoding UTF-82.1. javadoc 명령어 실행 2.2. javadoc에서 자동으로 웹페이지 생성 2.3. 주석에 작성한대로 api 문서 생성 3. javadoc 주석 유의 사항 3.1..

[Effective Java] item 55. 옵셔널 반환은 신중히 하라

[Effective Java] item 55. 옵셔널 반환은 신중히 하라 메서드가 특정 조건에서 값을 반환할 수 없을 때 자바 8 이전의 방식의 단점 예외를 던진다. 예외는 진짜 예외적인 상황에서만 사용해야 한다. 예외를 생성할 때 스택 추적 전체를 캡쳐하므로 비용도 만만치 않다. null을 반환한다. null을 반환할 수 있는 메서드를 호출할 때는, (null이 반환될 일이 절대 없다고 확신하지 않는 한) 별도의 null 처리 코드를 추가해야 한다. 자바 8부터 생긴 Optional Optional는 null이 아닌 T 타입 참조를 하나 담거나, 혹은 아무것도 담지 않을 수 있다. 아무것도 담지 않은 옵셔널은 &#39;비었다&#39;고 말한다. 반대로, 어떤 값을 담은 옵셔널은 &#39;비지 않았다&#..

[Effective Java] item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다

[Effective Java] item 47. 반환 타입으로는 스트림보다 컬렉션이 낫다 핵심정리 원소 시퀀스를 반환하는 메서드를 작성할 때는, 이를 스트림으로 처리하기를 원하는 사용자와 반복으로 처리하길 원하는 사용자가 모두 있을 수 있음을 떠올리고, 양쪽을 다 만족시키려 노력하자. 컬렉션을 반환할 수 있으면 그렇게 하라. 반환 전부터 이미 원소들을 컬렉션에 담아 관리하고 있거나 컬렉션을 하나 더 만들어도 될 정도로 원소 개수가 적다면 ArrayList 같은 표준 컬렉션에 담아 반환하라. 그렇지 않으면 앞서의 멱집합 예처럼 전용 컬렉션을 구현할지 고민하라. 컬렉션을 반환하는 게 불가능하면 스트림과 Iterable 중 더 자연스러운 것을 반환하라. 만약 나중에 Stream 인터페이스가 Iterable을 지..

[Effective Java] item 46. 스트림에서는 부작용 없는 함수를 사용하라

[Effective Java] item 46. 스트림에서는 부작용 없는 함수를 사용하라 핵심정리 스트림 파이프라인 프로그래밍의 핵심은 부작용 없는 함수 객체에 있다. 스트림뿐만 아니라 스트림 관련 객체에 건네지는 모든 함수 객체가 부작용이 없어야 한다. 종단 연산 중 forEach는 스트림이 수행한 계산 결과를 보고할 때만 이용해야 한다. 계산 자체에는 이용하지 말자. 스트림을 올바로 사용하려면 수집기를 잘 알아둬야 한다. 가장 중요한 수집기 팩터리는 toList, toSet, toMap, groupingBy, joining이다. 스트림이 가져오는 함수형 프로그래밍의 패러다임 스트림은 그저 또 하나의 API가 아닌, 함수형 프로그래밍에 기초한 패러다임이다. 스트림이 제공하는 표현력, 속도 (상황에 따라서..

[Effective Java] item 45. 스트림은 주의해서 사용하라

[Effective Java] item 45. 스트림은 주의해서 사용하라 핵심 정리 스트림을 사용해야 멋지게 처리할 수 있는 일이 있고, 반복 방식이 더 알맞은 일도 있다. 그리고 수많은 작업이 이 둘을 조합했을 때 가장 멋지게 해결된다. 어느 쪽을 선택하든 확고부동한 규칙은 없지만 참고할 만한 지침 정도는 있다. 어느 쪽이 나은지가 확연히 드러나는 경우가 많겠지만, 아니더라도 방법은 있다. 스트림과 반복 중 어느 쪽이 나은지 확신하기 어렵다면 둘 다 해보고 더 나은 쪽을 선택하라. 스트림 스트림이란? 다량의 데이터 처리 작업(순차적이든 병렬적이든)을 돕고자 자바 8에 추가된 개념 스트림의 원소들은 어디로부터든 올 수 있다. 대표적으로는 컬렉션, 배열, 파일, 정규 표현식 패턴 매처(matcher), 난..

[Effective Java] item 44. 표준 함수형 인터페이스를 사용하라

[Effective Java] item 44. 표준 함수형 인터페이스를 사용하라 핵심정리 이제 자바도 람다를 지원하기 때문에 지금부터 API를 설계할 때 람다도 염두에 두어야 한다. 입력값과 반환값에 함수형 인터페이스 타입을 활용하라. 보통은 java.util.function 패키지의 표준 함수형 인터페이스를 사용하는 것이 가장 좋은 선택이다. 단 흔치는 않지만 직접 함수형 인터페이스를 만들어 쓰는 편이 나을 수도 있음을 잊지 말자. 불필요한 함수형 인터페이스를 만들지 말고 표준 함수형 인터페이스를 사용하라 자바가 람다를 지원하면서 API를 작성하는 모범 사례도 크게 바뀌었다. 예컨대 상위 클래스의 기본 메서드를 재정의해 원하는 동작을 구현하는 템플릿 매서드 패턴의 매력이 크게 줄었다. 이를 대체하는 현..