문자열 연결 연산자(+)는 여러 문자열을 하나로 합쳐주는 편리한 수단으로 크기가 작고 고정된 객체의 문자열을 만들때면 괜찮지만, 본격적으로 사용하기 시작하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n²에 비례한다. 문자열은 불변이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과다. String + 연산자를 사용하면 더할 문자열이 많아질수록 심각하게 느려질 수 있다. 성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자. 자바 6 이후 문자열 연결 성능을 다방면으로 개선했지만, 이 두 메서드의 성능 차이는 여전히 크다. statement 메서드의 수행 시간은 아이템 수의 제곱이 비례해 늘어나..
문자열을 쓰지 않아야할 사례 문자열은 다른 값 타입을 대신하기에 적합하지 않다 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 입력 받을 데이터가 진짜 문자열일 때만 사용하는게 좋다. 받은 데이터가 수치형이라면 int, float, BigInteger등 적당한 수치 타입으로 변환해야 한다. 예/아니오 질문의 답이라면 적절한 열거타입이나 boolean으로 변환해야 한다. 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 때는 문자열보다 열거 타입이 월등히 낫다. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 대체로 좋지 않은 생각이다. 예시) String compoundKet = className + ..
자바의 데이터 타입은 2가지로 나뉘는데 기본 타입인 byte, short, int, long, float, double, boolean, char과 그외에는 모두 참조형 타입의 데이터이다. 각각의 기본 타입에 대응하는 참조 타입이 하나씩 있는데 이를 박싱된 기본 타입이라고 한다. 기본 타입과 박싱된 기본 타입의 차이점 기본 타입은 값만 가지고 있으나 박싱된 기본 타입은 값에 더해 식별성이란 속성을 갖는다. 달리 말하면 박싱된 기본 타입의 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 유효하지 않은 값, 즉 null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다. 박싱된 기본 타입의 문제점 In..
float과 double 타입은 실수를 나타내기 위해 사용하는 기본타입으로 컴퓨터에서 실수를 표현하는 방법은 정수에 비해 복잡한데 부동소수점 표준에 의해 실수를 정수와 마찬가지로 2진수로 표현해야 하기 때문이다. 1,2,3과 같은 정수는 2진수로 표현이 가능하지만 0.1 같은 소수는 2진수로 표현할 방법이 없어서 컴퓨터는 그 값과 가장 근사한 값을 반환하게 되고 이 때 부동소수점의 부정확성이 나타난다. 부동소수점(浮動小數點, floating point) 방식은 실수를 컴퓨터상에서 근사하여 표현할 때 소수점의 위치를 고정하지 않고 그 위치를 나타내는 수를 따로 적는 것으로, 유효숫자를 나타내는 가수(假數)와 소수점의 위치를 풀이하는 지수(指數)로 나누어 표현한다. 컴퓨터에서는 고정 소수점 방식보다 넓은 범..
전통적인 for 문으로 컬렉션을 순회하는 코드 for(Iterator i = c.iterator(); i.hasNext();) { Element e = i.next(); ... // e로 무언가 한다. } 전통적인 for 문으로 배열 순회하는 코드 for(int i = 0; i < a.length; i++) { ... // a[i]로 무언가를 한다. } 이 관용구들은 while 문보다는 낫지만 가장 좋은 방법은 아니다. 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 진짜 필요한건 원소들이다. 이처럼 쓰이는 요소 종류가 늘어나면 오류가 생길 가능성이 높아진다. 혹시라도 잘못된 변수를 사용했을 때 컴파일러가 잡아주리라는 보장도 없다. 마지막으로 컬렉션이냐 배열이냐에 따라 코드 형태가 달라지므로 주의해..
지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 가장 강력한 기법은 '가장 처음 쓰일 때 선언하기'다. 사용하려면 멀었는데 미리 선언부터 하면 코드가 어수선해져 가독성이 떨어진다. 변수를 실제 사용하는 시점엔 타입과 초깃값이 기억나지 않을 수 있다. 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아있게 되기 쉽다. 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때 까지이므로, 실제 사용하는 블록 바깥에 선언된 변수는 그 블록이 끝난 뒤까지 살아있게 되어 실수로 의도한 범위 앞 혹은 뒤에서 그 변수를 사용하면 끔찍한 결과로 이어질 수 있다. 거의 모든 지역..
자바에서 자바독(javadoc)은 소스코드 파일에서 문서화 주석(자바독 주석)이라는 특수한 형태로 기술된 설명을 추려 API 문서로 변환해준다. 자바독 가이드 https://www.oracle.com/technical-resources/articles/java/javadoc-tool.html How to Write Doc Comments for the Javadoc Tool Javadoc Home Page This document describes the style guide, tag and image conventions we use in documentation comments for Java programs written at Java Software, Oracle. It does not rehas..
자바 8 전에는 메서드가 특정 조건에서 값을 반환할 수 없을 때 예외를 던지거나 예외는 진짜 예외적인 상황에서만 사용해야 하며 예외를 생성할 때 스택 추적 전체를 캡쳐하므로 비용도 만만치 않다. 반환타입이 객체 참조라면 null을 반환하는 두가지 선택지가 있었다. null을 반환할 수 있는 메서드를 호출할때는 null이 반환될 일이 절대 없다고 확신하지 않는 한 별도의 null 처리 코드를 추가해야 한다. null 처리를 무시하고 반환된 null 값을 어딘가에 저장해두면 언젠가 실제 원인과 전혀 상관없는 코드에서 NullPointerException이 발생할 수 있다. 자바 8 버전으로 올라가면서 Optional 이라는 또 하나의 선택지가 생겼다. Optional는 null이 아닌 T 타입을 참조를 하나..