전체 글 194

[Effective Java] item 63. 문자열 연결은 느리니 주의하라

[Effective Java] item 63. 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단이다. 그런데 한 줄짜리 출력값 혹은 작고 크기가 고정된 객체의 문자열 표현을 만들 때라면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n의 제곱에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과다. 예를 들어 다음 메서드는 청구서의 품목(item)을 전부 하나의 문자열로 연결해준다. 문자열 연결을 잘못 사용한 예 - 느리다! public String statement() { String result = ""; fo..

[Effective Java] item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

[Effective Java] item 62. 다른 타입이 적절하다면 문자열 사용을 피하라 문자열을 쓰지 말아야 할 사례 1. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 사뭇 자연스러워 보이지만, 입력받을 데이터가 진짜 문자열일 때만 그렇게 하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInteger 등 적당한 수치 타입으로 변환해야 한다. '예/아니오' 질문의 답이라면 적절한 열거 타입이나 boolean으로 변환해야 한다. 일반화해 이야기하자면, 기본 타입이든 참조 타입이든 절절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 당연한 조언 같겠지만,..

[Effective Java] item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

[Effective Java] item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 1. 자바의 데이터 타입 기본 타입(primitive type) int, double, boolean 등 박싱된 기본 타입 Integer, Double, Boolean 등 2. 기본 타입과 박싱된 기본 타입의 차이점 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 그렇다고 차이가 사라지는 것은 아니다. 2.1. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 2.2. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 ..

[Effective Java] item 60. 정확한 답이 필요하다면 float와 double은 피하라

[Effective Java] item 60. 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입 부동소수점 연산 (부정확하다) float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않다. 0.1 혹은 10의 음의 거듭 제곱 수(10의 -1승, 10의 -2승 등)를 표현할 수 없기 때문이다. 예를 들어 주머니에 1.03 달러가 있었는데 그중 42센트를 썼다고 해보자. 남은 돈은 얼마인가? 다음은 이 문제의 답을 구하기 위..

[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;비지 않았다&#..