Java/이펙티브 자바

    이펙티브 자바, 쉽게 정리하기 - item 72. 표준 예외를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 72. 표준 예외를 사용하라 표준 예외를 사용해야 하는 이유 표준이기 때문에 다른 개발자가 내 코드에서 예외의 의미를 이해하기 쉬워진다. 클래스를 적게 만들어 성능상의 이득도 있다. 자바 라이브러리에서 충분한 수의 예외를 제공해줘서 일반적인 경우 표준 예외로 전부 처리가 가능하다. 직렬화에도 용이하다. 표준 예외 중 자주 쓰이는 것들 IllegalArgumentException 이름 그대로 잘못된 인수를 넘겼을 때 던져주는 예외이다. ex) 사람의 나이 설정에 음수를 넘겼을 때 관례적으로 null은 NullPointerException을 이용한다. IllegalStateException 객체의 상태가 메서드 수행에 적합하지 않을 때 객체 초기화 자체가 제대로 되..

    이펙티브 자바, 쉽게 정리하기 - item 71. 필요 없는 검사 예외(checked error) 사용은 피하라

    이펙티브 자바, 쉽게 정리하기 - item 71. 필요 없는 검사 예외(checked error) 사용은 피하라 검사 예외의 단점 try-catch 혹은 throws 를 강제한다. 이 과정에서 많은 개발자들이 귀찮다는 이유로 잘못된 예외 처리 로직을 작성하거나 예외처리 로직에서 아무 행위도 하지 않기도 한다. 검사 예외가 발생하는 메서드는 스트림 안에서 해당 메서드를 직접 사용할 수 없다. 단, 프로그래머가 이 검사 예외로 인해 의미있는 조치를 취할 수 있다면 괜찮은 조치일 수도 있다. 예외 상황에 대처하지 못하는 경우의 예 try { // ... } catch (TheCheckedException e) { throw new AssertionError(); // 일어날 수 없다! } try { // ....

    이펙티브 자바, 쉽게 정리하기 - item 70. 복구할 수 있는 상황에는 검사 예외를 프로그래밍 오류에는 런타임(비검사) 예외를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 70. 복구할 수 있는 상황에는 검사 예외를 프로그래밍 오류에는 런타임(비검사) 예외를 사용하라 예외의 4가지 종류 예외는 throwable 타입이라고 한다. 예외는 검사, 비검사 예외가 있으며 하위 예외로 런타임 예외와 에러가 있고 각각의 목적이 있다. 검사 예외 (Checked Exception) 비검사 예외 (Unchecked Exception) 런타임 예외 (Runtime Exception) 에러 (Error) 검사 예외와 비검사 예외는 예외 처리를 강제하냐 아니냐의 차이가 있다. 예외별 간단 사용 지침 검사 예외: 호출하는 쪽에서 복구하리라 여겨지는 상황에 사용한다. catch 로 복구하거나 밖으로 퍼트려(throws) 복구할 가능성이 있다. 복구할 가..

    이펙티브 자바, 쉽게 정리하기 - item 69. 예외는 진짜 예외 상황에만 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 69. 예외는 진짜 예외 상황에만 사용하라 예외가 아닌 상황에 예외를 사용했을 때 try { int i = 0; while(true) { range[i++].climb(); } } catch (ArrayIndexOutOfBoundsException e) { } 위 코드의 의도는 일반적인 반복문에서 반복문도 매 반복마다 배열의 경계를 넘는지 검사하고, JVM도 배열에 접근할 때마다 경계를 넘는지 검사하는데, 그 중복을 없애서 성능 최적화를 하려던 의도이다. 결과적으로는 잘못된 추론을 근거로 성능을 높여보려 한 것이 된다. 위 추론이 잘못된 이유 JVM 구현자 입장에서는 위 같은 코드가 빠르게 돌아갈지에 대해서는 전혀 고려하지 않을 것이다. 예외는 예외를 처리하는데..

    이펙티브 자바, 쉽게 정리하기 - item 68. 일반적으로 통용되는 명명 규칙을 따르라

    이펙티브 자바, 쉽게 정리하기 - item 68. 일반적으로 통용되는 명명 규칙을 따르라 자바 언어의 명명 규칙 철자와 문법 2가지로 나뉜다. 철자 규칙 패키지, 클래스, 인터페이스, 메서드, 필드, 타입 변수의 이름을 다룬다. 특별한 이유가 없는 한 반드시 따라야 다른 개발자들의 오해로 인한 실수가 생기지 않는다. 패키지 명명법 .으로 구분하여 계층적으로 이름을 짓는다. 보통 인터넷 도메인 이름을 역순으로 사용한다. ex) com.google 표준 라이브러리 및 선택적 패키지는 java와 javax로 시작한다. 이름은 보통 8자 이하의 짧은 단어로 한다. utilities -> util 약어라면, abstract window toolkit -> awt와 같이 가능하다. 클래스와 인터페이스 명명법 열거타..

    이펙티브 자바, 쉽게 정리하기 - item 67. 최적화는 신중히 하라

    이펙티브 자바, 쉽게 정리하기 - item 67. 최적화는 신중히 하라 최적화에 대한 생각 최적화는 보통 해로운 결과로 이어진다. 특히나 견고한 구조를 해치는 최적화는 하지말자. 빠른 프로그램보다는 좋은 프로그램을 작성하자. 좋은 프로그램은 개별 구성요소의 내부를 독립적으로 설계 가능한 것이다. 시스템의 나머지에 변화를 주지 않고도 내가 원하는 부분에 변화를 줄 수 있는 것이다. 설계를 이용해 성능 올리는 방법 성능을 제한하는 설계를 피하라 설계적인 요소는 완성 후 변경하기가 가장 어렵다. API, 네트워크 프로토콜, 영구 저장용 데이터 포맷 등이 대표적이다. 완성 후 변경이 어렵거나 불가능할 수도 있고, 시스템 성능도 크게 제한할 수 있다. API를 설계할 때 성능에 주는 영향을 고려하라 public ..

    이펙티브 자바, 쉽게 정리하기 - item 66. 네이티브 메서드는 신중히 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 66. 네이티브 메서드는 신중히 사용하라 네이티브 메서드란? C, C++ 같은 네이티브 프로그래밍 언어로 작성한 메서드이다. 자바 네이티브 인터페이스(JNI)라는 기술에 의해 호출된다. 네이티브 메서드의 쓰임 레지스트리와 같이 플랫폼 특화 기능을 사용한다. 네이티브 코드로 작성된 기존의 라이브러리를 활용한다. 성능 개선 목적으로 성능에 중요한 부분만 네이티브 메서드를 쓴다. 다만 성능을 개선할 목적으로 네이티브 메서드를 사용하는 것조차 거의 권장하지 않는다. 네이티브 메서드를 쓴다면? 성능 개선 목적으로 쓰지말자. JVM은 빠른 속도로 발전해왔고, 현재는 특수한 경우가 아니면 네이티브 메서드가 필요 없을 정도로 많이 빨라졌다. 단, 다중 정밀 연산 라이브러리(G..

    이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 65. 리플렉션보다는 인터페이스를 사용하라 리플렉션이란? 자바 리플렉션 (Reflection) 이란? 포스팅 참고 리플렉션의 기능 특정 클래스의 생성자, 메서드, 필드 정보를 가져올 수 있다. 추가적으로 멤버 이름, 필드 타입, 메서드 시그니쳐 등을 가져올 수 있다. 실제 생성자, 메서드, 필드를 조작할 수도 있다. Method.invoke() 는 메서드를 호출할 수 있게 해준다. 리플렉션을 이용하여 컴파일 당시 존재하지 않던 클래스도 이용 가능하다. 리플렉션의 단점 컴파일 타입 검사의 이점을 누릴 수 없다. 런타임에야 오류를 알게될 것이다. 코드가 지저분해진다. 성능이 떨어진다. 리플렉션을 통한 메서드 호출은 상당히 느리다. 일반적인 코드에서는 리플렉션이 필요..

    이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라

    이펙티브 자바, 쉽게 정리하기 - item 64. 객체는 인터페이스를 사용해 참조하라 웬만하면 유연함을 위해 인터페이스로 연결하자 매개변수, 반환값, 변수, 필드가 대상이 될 수 있다. 인터페이스를 타입으로 사용하면 프로그램이 유연해진다. Map 인터페이스를 사용한다고 가정했을 때, HashMap 도 가능하고, 성능을 위해 EnumMap 혹은 순서를 위해 LinkedHashMap 등을 유연하게 사용할 수 있다. 왜냐하면 구현체들은 다 Map 인터페이스를 구현한 것이기 때문이다. Set sonSet = new LinkedHashSet(); // O LinkedHashSet sonSet = new LinkedHashSet(); // X 그러나 인터페이스가 항상 정답은 아니다. 클래스를 써야 하는 경우 적합한..

    이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라

    이펙티브 자바, 쉽게 정리하기 - item 63. 문자열 연결은 느리니 주의하라 String concatenation + 이용하기 "a" + "b" 와 같은 방식으로 간단히 쓸 수 있지만, 성능저하가 있다. String 객체는 실제로 불변이기 때문에 새로운 객체를 만들어 더해야 한다. &#39;String 타입의 변수는 잘 바뀌는데 이게 왜 불변이지?&#39; 싶다면 스트링 풀 쉽게 이해하기 포스팅 을 참고하면 좋다. n 개의 문자열을 잇는다면 n^2 에 비례하는 시간이 걸린다. @Test public void stringPlusTest() { String result = ""; for (int i = 0; i < 10000; i++) { for (String string : strings) { resu..

    이펙티브 자바, 쉽게 정리하기 - item 62. 다른 타입이 적절하다면 문자열 사용을 피하라

    이펙티브 자바, 쉽게 정리하기 - item 62. 다른 타입이 적절하다면 문자열 사용을 피하라 문자열을 잘못쓰는 사례들 데이터를 입력받을 때 무작정 문자열로 입력받는 사람이 있다. 숫자면 숫자, 예/아니오라면 boolean 과 같은 명확한 타입으로 받는게 더 좋다. 열거 타입을 문자열로 대신하는 경우도 있다. 혼합 타입을 문자열로 대신하는 경우도 있다. 권한을 문자열로 표기하는 경우도 있다. 혼합 타입을 남용하는 예 String compoundKey = className + "#" + i.next(); 가운데 # 을 기준으로 파싱하려고 하는 의도가 살짝 보인다. # 이 만약 className 에서 이용되거나 i.next() 에서 이용되면 문제가 일어난다. 문자열 파싱이라는 추가적인 성능 악영향까지 있다...

    이펙티브 자바, 쉽게 정리하기 - item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라

    이펙티브 자바, 쉽게 정리하기 - item 61. 박싱된 기본 타입보다는 기본 타입을 사용하라 기본 타입과 박싱된 기본 타입의 차이 기본 타입은 값만 가지고 있으나, 박싱된 기본 타입은 식별성(identity)이라는 속성도 갖는다. 기본 타입의 값은 언제나 유효하나, 박싱된 기본 타입은 null을 가질 수 있다. 기본 타입이 박싱된 기본 타입보다 메모리 면에서 우수하다. 문제가 생기는 코드 살펴보기 의도치않은 식별성 검사 public class Item61Test { Comparator naturalOrder = (i, j) -> (i < j) ? -1 : (i == j ? 0 : 1); @Test public void naturalOrderTest() { int compare = naturalOrder..

반응형