본문 바로가기

전체 글

item 73) 추상화 수준에 맞는 예외를 던지라 상위계층에서는 저 수준 예외를 잡아 자신의 추상화 수준에 맞는 예외로 던져야 한다.(예외 번역) - 메서드가 저수준 예외를 처리 하지않고 바깥으로 전파 해버릴 경우 수행하려는 일과 전혀 상관없는 예외가 발생할수 있음 - 예외로 내부 구현방식을 드러내고, 윗레벨 API를 오염시켜버림 - 예외 전파보다는 예외 번역을 사용하라 try { // 저수준 추상화를 이용 } catch (LowerLevelException e) { throw new HigherLevelException(); } //AbstractSequentialList public E get(int index) { ListIterator i = listIterator(index); try { return i.next(); } catch (NoSuc.. 더보기
item74) 메서드가 던지는 모든 예외를 문서화해라 메서드가 던지는 예외를 문서화하는데 충분한 시간을 쏟아야한다. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 JavaDoc의 @throws 태그를 활용하여 정확히 문서화하라. - Exception이나 Throwable 같은 공통 상위 클래스가 아니라 구체적인 예외 클래스로 남겨놓을것 - 각 예외에 대처할 힌트도 못 줄뿐더러 다른 예외들까지 포함시켜버려 API 사용성을 떨어뜨린다. - 단, main 함수는 JVM만이 호출하므로 Exception을 던져도 괜찮다. - public 메서드에 대해서는 비검사 예외도 문서화 하는 것이 좋다. 자신이 일어난 예외상황을 무엇인지 설명해주면 프로그래머가 해당 오류가 나지 않도록 코드를 고칠수 있다. 비검사 예외와 검사예외를 구분하는 것이 좋다. - 메.. 더보기
item 72) 표준 예외를 사용하라. 자바 라이브러리는 대부분 API에서 사용하기 좋은 예외를 제공한다. - 코드 재사용 측면에서 좋다. 예외도 마찬가지. - 내 API를 다른 사랑미 사용하기 더 쉽다.(이미 익숙한 규약을 따르기 때문) - 예외 클래스가 적을 수록 메모리 사용량도 줄어든다. 주로 사용하는 예외들 - 가능하다면 더 특수한 예외를 따로 구분해서 사용하라 IllegalArgumentException - 인수로 부적절한 값을 넘길때 발생하는 예외 ex ) 반복횟수에 음수를 건넨 경우 IllegalStateException - 대상 객체의 상태가 메서드를 수행하는데 적합하지 않은 경우 ex) 초기화 되지 않은 객체를 사용하여 한 경우 NullPointerException - Null 값을 허용하지않은 메서드에 null를 건넨 경우 .. 더보기
item 71) 필요 없는 검사 예외 사용은 피하라 1. Error vs Exception 2. unchecked vs checked 2-1 Unchecked Exception - RunTimeException 을 상속 받은 Exception - throw문이나 try catch 문으로 처리 해주지않아도됨. - RunTime 시점에서 발생하며, 예외 발생시 트랜잭션 롤백함 - NullPointerException, OutOfBoundsException 2-2 Checked Exception - RunTimeException을 상속 하지 않은 Exception 클래스들 - 명시적으로 Throw나 try-catch 문으로 처리해줘야 하고 처리하지 않으면 컴파이 ㄹ에러 발생 - 컴파일 시점에서 체크하며, 예외 발생시 트랜잭션 롤백하지 않음 - IOExcepti.. 더보기
item 62) 다른 타입이 적절하다면 문자열 사용을 피하라 문자열은 텍스트를 표현하도록 설계되었고, 자바에서도 잘 지원해줘서 다른 용도로 쓰이는 경우가 있음 1) 문자열은 다른 값 타입을 대신하기에 적합하지 않음 - 파일, 네트워크, 키보드 등으로부터 입력을 받을때 주로 문자열 타입으로 받는다. 그후에 타입을 명시적으로 변환한다. => 타입을 명시적으로 변환하는 것은 좋은 프로그래밍 코드가 아님.(ClassTypeException 및 변환 코드로 기존 코드가 더러워진다.) - 적절한 타입이 있다면 그 타입을을 사용하고 만약 없다면 새로운 타입을 작성하라. 2) 열거타입을 대신하기 어렵다. - 상수를 열거할떄는 열거타입을 사용하자.(변수의 범위를 제한할수 있다.) 3) 혼합타입을 대신하기 어렵다. - 여러 요소가 혼합된 데이터를 하나의 문자열로 표현하는 것은 좋지.. 더보기
item 61) 박싱된 기본 타입보다 기본 타입을 사용하라 자바 데이터 타입 : 1) 기본 타입 int, double, boolean ...) 2) 참조타입(String, List , 사용자 정의 클래스 ...) - 각각의 기본 타입마다 대응하는 참조 타입을 가지고 있으며 이를 박싱된 기본 타입이라고 한다. int -> Integer, double -> Double, boolean -> Boolean - 오토 박싱, 오토 언박싱으로 두 타입을 구분하지 않고 사용할수 있다. ex) Integer a = 42; (42가 오토박싱된다. 기본 타입 vs 박싱 타입 - 기본타입은 값만 가지고 있으나, 박싱된 기본타입은 식별성을 가지고 있다. 값이 같더라도 다르다고 판별할수 있다. (Object의 하위 클래스다.) - 박싱된 기본타입은 null 값을 가질수 있다. - 기본.. 더보기
item 58) 전통적인 for문보다는 For-each 문을 사용하라 우리의 주관심사는 배열, 컬렉션의 원소이지 반복자(Iterator)나 인덱스 변수가 아님(이를 접근하는 for문은 코드를 지저분하게 한다.) 잘못된 인덱싱을 할 가능성도 있음 컬렉션이나 배열이냐에 따라 코드 형태가 달라진다. 향상된 for문 : for-each (enhanced for statement) Iterator 인터페이스를 구현한 객체에서 사용가능함 (Collections, Array 등) 반복자와 인덱스 코드가 없음(오류 가능성 감소) 하나의 관용어구로 컬렉션, 배열을 모두 처리 가능 컬렉션을 중첩해서 사용할때 저지르는 실수 방지 enum Suit { CLUB, DIAMOND, HEART, SPADE} enum Rank { ACE, DEUCE, THREE, FOUR, FIVE, SIX, SEV.. 더보기
item 57) 지역변수의 범위를 최소화하라 지역변수의 유효범위를 최소로 줄이면 코드 가독성과 유지보수성 증가 , 오류 가능성 낮아짐(오류의 전파 범위가 작아짐) 모든 지역변수는 선언과 동시에 초기화 하라 가장 처음쓰일때 선언하기 생각없이 지역변수를 선언하다보면 변수가 실제 쓰이는 범위보다 앞서거나 다 쓴뒤에도 여전히 살아있기 쉬움 지역변수의 벙뮈는 선언지점부터 그 블록이 끝날떄까지 거의 모든 변수는 선언과 동시에 초기화해야한다.(초기화에 필요한 정보가 충분하지 않다면 선언을 미뤄야함, try-catch 는 예외) Connection conn = null; PreparedStatement stmt = null; ResultSet rs = null; //... try { // DB에 연결함 conn = DriverManager.getConnectio.. 더보기