본문 바로가기

개발

Effective Java ( 이펙티브 자바 ) - 아이템 63 문자열 연결은 느리니 주의하라 문자열 연결 연산자(+)는 편리하다. 그러나 본격적으로 사용하면 성능 저하를 감내하기 어렵다. 문자열 연결 연산자로 문자열 n개를 잇는 시간은 n^2에 비례한다. 문자열은 불변이라서 양쪽의 내용을 모두 복사해야 한다. 성능을 포기하고 싶지 않다면 StringBuilder를 사용하자. ( Thread-safe StringBuffer? ) 보통 6.6~6.5배 빠르다. StringBuilder의 append 메서드를 사용하라. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 62 다른 타입이 적절하다면 문자열 사용을 피하라 문자열은 워낙 흔하고 자바가 또 잘 지원해주어 원래 의도하지 않은 용도로도 쓰이는 경향이 있다. 이번 아이템에서는 문자열을 쓰지 않아야 할 사례를 다룬다. 문자열은 다른 값 타입을 대신하기에 적합하지 않다. 많은 사람이 파일, 네트워크, 키보드 입력으로부터 데이터를 받을 때 주로 문자열을 사용한다. 사뭇 자연스러워 보이지만, 입력받을 데이터가 진짜 문자열일 때만 그렇게 하는게 좋다. 기본 타입이든 참조 타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라. 문자열은 열거 타입을 대신하기에 적합하지 않다. 상수를 열거할 때는 문자열보다는 열거 타입이 월등히 낫다. 문자열은 혼합 타입을 대신하기에 적합하지 않다. 여러 요소가 혼합된 데.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 61 박싱된 기본 타입보다는 기본 타입을 사용하라 자바의 데이터 타입은 기본 타입과 참조 타입으로 나뉜다. 그리고 각각의 기본 타입에 대응하는 참조 타입이 하나씩 있으며, 이를 박싱된 기본 타입이라고 한다. 오토박싱과 오토언박싱 덕분에 두 타입을 크게 구분하지 않고 사용할 수는 있지만, 그렇다고 차이가 사라지는 것은 아니다. 둘 사이에는 분명한 차이가 있으니 어떤 타입을 사용하는지는 상당히 중요하다. 주의해서 선택해야 한다. 기본 타입과 박싱된 기본 타입의 주된 차이는 크게 세 가지다. 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 값에 더해 식별성(identity)이란 속성을 갖는다. 달리 말하면 박싱된 두 인스턴스는 값이 같아도 서로 다르다고 식별될 수 있다. 기본 타입의 값은 언제나 유효하나, 박.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 60 정확한 답이 필요하다면 float와 double은 피하라 float와 double 타입은 과학과 공학 계산용으로 설계되었다. 이진 부동소수점 연산에 쓰이며, 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다. 따라서 정확한 결과가 필요할 때는 사용하면 안 된다. float와 double 타입은 특히 금융 관련 계산과는 맞지 않는다. 0.1 혹은 10의 음의 거듭 제곱 수(10^-1, 10^(-2))를 표현할 수 없기 때문이다. 예를 들어 주머니에 1.03 달러가 있었는데 그 중 42센트를 썼다고 해보자. 남은 돈은 얼마인가? 다음은 '어설프게' 작성해본 코드다. System.out.println(1.03 - 0.42); 이 코드는 0.6100000000000001 을 출력한다. .. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 59 라이브러리를 익히고 사용하라 무작위 정수 하나를 생성하고 싶다고 해보자. 값의 범위는 0부터 명시한 수 사이다. static Random rnd = new Random(); static int random(int n) { return Math.abs(rnd.nextInt()) % n; } 괜찮은 듯 보여도 문제를 세 가지나 내포하고 있다. n이 그리 크지 않는 2의 제곱수라면 얼마 지나지 않아 같은 수열이 반복된다. n이 2의 제곱수가 아니라면 몇몇 숫자가 평균적으로 더 자주 반환된다. n 값이 크면 이 현상은 더 두드러진다. 다음 코드는 예시를 위해 필자가 신중히 선택한 범위에서 무작위 수를 백만개를 생성한 다음, 그중 중간 값보다 작은게 몇 개인지를 출력한다. public static void mai.. 더보기
Effective Java ( 이펙티브 자바 ) - 아이템 58 전통적인 for문보다는 for-each 문을 사용하라 전통적인 for문으로 컬렉션과 배열을 순회하는 코드다. for (Iterator i = c.iterator(); i.hasNext(); ) { Element e = i.next(); } for (int i=0; i< a.length; i++) { ... } while문 보다는 낫지만 가장 좋은 방법은 아니다. 반복자와 인덱스 변수는 모두 코드를 지저분하게 할 뿐 진짜 필요한건 원소들뿐이다. 쓰이는 요소 종류가 늘어나면 오류가 생길 가능성이 높다. 컬렉션이냐 배열이냐에 따라 코드 형태가 상당히 달라지므로 주의해야 한다. 이상의 문제는 for-each 문을 사용하면 모두 해결된다. 정식 이름은 '향상된 for 문(enhanced for statement).. 더보기
Effective Java ( 이펙티브 자바 ) - 9장 - 아이템 57 일반적인 프로그래밍 원칙 - 9장 지역변수의 범위를 최소화하라 지역변수의 유효 범위를 최소로 줄이면 코드 가독성과 유지보수성이 높아지고 오류 가능성은 낮아진다. 지역변수의 범위를 줄이는 가장 강력한 기법은 역시 '가장 처음 쓰일 때 선언하기'다. 지역변수를 생각 없이 선언하다 보면 변수가 쓰이는 범위보다 너무 앞서 선언하거나, 다 쓴 뒤에도 여전히 살아 있게 되기 쉽다. 지역변수의 범위는 선언된 지점부터 그 지점을 포함한 블록이 끝날 때까지임을 명심하자. 거의 모든 지역변수는 선언과 동시에 초기화해야 한다. 초기화에 필요한 정보가 충분하지 않다면 충분해질 때까지 선언을 미뤄야 한다. try-catch문은 이 규칙에서 예외다. 변수 초기화 표현식에서 검사 예외를 던질 가능성이 있다면 try 블록 안에서 초.. 더보기
SRE 11장 - 비상대기 비상 대기는 많은 운영팀 및 엔지니어링팀이 서비스의 신뢰성과 가용성을 위해 반드시 수행해야 할 중요한 임무다. 그러나 교대로 수행하는 과정 속에는 많은 어려움이 도사리고 있다. 소개 구글의 여러 주요 서비스팀, 예를 들면 검색, 광고 및 지메일 등은 이 서비스들의 성능과 신뢰성을 책임지는 전담 SRE팀이 있다. 그래서 SRE들이 서비스를 위한 비상 대기 업무를 수행한다. SRE팀은 순수한 운영팀과는 사뭇 달라서 문제를 해결하기 위한 엔지니어링적 접근법을 강조한다. (가장 큰 차이점이다. 항상 엔지니어링을 생각하자) 이 문제들은 대부분 운영과 관련된 것들이지만 스케일링과 관련해서 소프트웨어 엔지니어링 솔루션 없이는 다루기 어려운 것들이다. 이런 종류들의 문제를 해결하기 위해 구글은 시스템과 소프트웨어 엔지.. 더보기