목록전체 글 (191)
개발 기록
## 표준 예외를 사용하라 ### 표준 예외를 사용해야 하는 이유표준이기 때문에 다른 개발자가 내 코드에서 예외의 의미를 이해하기 쉬워진다.클래스를 적게 만들어 성능상의 이득도 있다.자바 라이브러리에서 충분한 수의 예외를 제공해줘서 일반적인 경우 표준 예외로 전부 처리가 가능하다.직렬화에도 용이하다.### 표준 예외 중 자주 쓰이는 것들IllegalArgumentException이름 그대로 잘못된 인수를 넘겼을 때 던져주는 예외이다.ex) 사람의 나이 설정에 음수를 넘겼을 때관례적으로 null은 NullPointerException을 이용한다.IllegalStateException객체의 상태가 메서드 수행에 적합하지 않을 때객체 초기화 자체가 제대로 되지 않은채로 메서드를 수행한다면 IllegalStat..
## 필요없는 검사 예외 사용은 피하라 ### 검사 예외의 불편함 검사 예외를 싫어하는 개발자가 많지만 제대로 활용하면 API와 프로그램의 질을 높일 수 있다.반면 사용이 과해지면 불편하기만 할 수도 있다. (검사 예외를 던지는 메서드는 스트림 안에서 직접 사용할 수 없기 때문에 자바 8부터는 부담이 더욱 커졌다) 검사 예외가 프로그래머에게 지우는 부담은 메서드가 단 하나의 검사 예외만 던질 때가 특히 크다.API 안에 검사 예외가 여러개 있을 때나, 하나만 있을 때나 어차피 try catch로 묶거나 throws로 던져줘야 하는건 똑같다.그리고 이처럼 검사 예외에 대한 책임을 지게 되면 해당 메서드를 스트림에서 직접 사용할 수 없다. ### 검사 예외 회피 방법 :: 1. 비검사 예외 API를 제대..
## 복구할 수 있는 상황에는 검사 예외를, 프로그래밍 오류에는 런타임 예외를 사용하라 자바에는 문제 상황을 알리는 타입으로 검사 예외, 런타임 예외, 에러, 이렇게 세가지를 제공한다.하지만 언제 무엇을 사용해야 하는지 헷갈려 하는 프로그래머들이 종종 있다.이럴 때 참고하면 좋은 지침들을 알아보자. ###검사 예외 (Checked Exception)호출하는 쪽에서 복구하리라 여기지는 상황검사 예외를 던지면 호출자가 그 예외를 catch로 잡아 처리하거나 더 바깥으로 전파하도록 강제하게 된다.따라서 메서드 선언에 포함된 검사 예외 각각은 그 메서드를 호출했을 때 발생할 수 있는 유력한 결과임을 API 사용자에게 알려주는 것이다.API 설계자는 API 사용자에게 검사 예외를 던져주어 그 상황에서 회복해내라고..
## 추상화 수준에 맞는 예외를 던지라 수행하려는 일과 관련 없어 보이는 예외가 튀어나오는 경우가 있는데, 메서드가 저수준 예외를 처리하지 않고 바깥으로 전파해버릴 때 종종 일어나는 일이다.이는 단순히 프로그래머를 당황시키는 데 그치지 않고, 내부 구현 방식을 드러내어 윗 레벨 API를 오염시킨다.다음 릴리스에서 구현 방식을 바꾸면 다른 예외가 튀어나와 기존 클라이언트 프로그램을 깨지게 할 수도 있는 것이다.이 문제를 피하려면 상위 계층에서는 저수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 바꿔 던져야 한다.(= 예외 번역) ex) 예외 번역try { ... // 저수준 추상화를 이용한다.} catch (LowerLevelException e) { // 추상화 수준에 맞게 번역한다. throw n..
## 예외는 진짜 예외 상황에만 사용하라 ### 예외가 아닌 상황에 예외를 사용했을 때try { int i = 0; while(true) { range[i++].climb(); }} catch (ArrayIndexOutOfBoundsException e) {}위 코드의 의도는 일반적인 반복문에서 반복문도 매 반복마다 배열의 경계를 넘는지 검사하고, JVM도 배열에 접근할 때마다 경계를 넘는지 검사하는데, 그 중복을 없애서 성능 최적화를 하려던 의도이다.### 잘못된 이유JVM 구현자 입장에서는 위 같은 코드가 빠르게 돌아갈지에 대해서는 전혀 고려하지 않을 것이다.예외는 예외를 처리하는데 쓰라는 구현자의 의도와 다르게 코드를 작성했기 때문이다.예외를 로직에 이용하면 안된다.코드를 try-catc..
## 일반적으로 통용되는 명명 규칙을 따르라 자바 언어의 명명 규칙철자와 문법 2가지로 나뉜다.## 철자 규칙패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다룬다.특별한 이유가 없는 한 반드시 따라야 다른 개발자들의 오해로 인한 실수가 생기지 않는다. ### 패키지 명명법.으로 구분하여 계층적으로 이름을 짓는다.보통 인터넷 도메인 이름을 역순으로 사용한다.ex) com.google표준 라이브러리 및 선택적 패키지는 java와 javax로 시작한다.이름은 보통 8자 이하의 짧은 단어로 한다.utilities -> util약어라면, abstract window toolkit -> awt와 같이 가능하다.### 클래스와 인터페이스 명명법열거타입과 애너테이션도 클래스 혹은 인터페이스로 본다...
## 최적화는 신중히 하라 ### 최적화 격언 세개-(맹목적인 어리석음을 포함해) 그 어떤 핑계보다 효율성이라는 이름 아래 행해진 컴퓨팅 죄악이 더 많다(심지어 효율을 높이지도 못하면서).- 윌리엄 울프- (전체의 97% 정도인) 자그마한 효율성은 모두 잊자. 섣부른 최적화가 만악의 근원이다. - 도널드 크누스 - 최적화를 할 때는 다음 두 규칙을 따르라. 첫 번째, 하지 마라. 두 번째, (전문가 한정) 아직 하지 마라. 다시 말해, 완전히 명백하고 최적화되지 않은 해법 을 찾을 때까지는 하지 마라. - M. A. 잭슨 ### 빠른 프로그램보다는 좋은 프로그램을 작성하라.- 성능 때문에 견고한 구조를 희생하지 말자.- 좋은 프로그램이지만 원하는 성능이 나오지 않는다면 그 아키텍처 자체가 최적화할 수 ..
## 네이티브 메서드는 신중히 사용하라 ### 네이티브 메서드란?C, C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드이다.자바 네이티브 인터페이스(JNI)라는 기술에 의해 호출된다.public class NativeExample { // 네이티브 메서드 선언 public native void sayHello(); static { // 네이티브 라이브러리 로드 System.loadLibrary("native-lib"); }} #include #include #include "NativeExample.h"JNIEXPORT void JNICALL Java_NativeExample_sayHello(JNIEnv *env, jobject obj) { prin..