본문 바로가기
Java/Effective Java

[이펙티브 자바] - 일반적인 프로그래밍 원칙

by bloodFinger 2020. 12. 21.

블로그의 내용은 '이펙티브 자바'를 참고하였습니다.

책의 내용정리와 저의 생각을 포스팅 합니다. 

 

 

 

  • 아이템 57. 지역변수의 범위를 최소화하라
  • 아이템 58. 전통적인 for문 보다는 for-each 문을 사용해라
  • 아이템 59. 라이브러리를 익히고 사용하라.
  • 아이템 60. 정확한 답이 필요하다면 float와 double은 피하라.
  • 아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용해라.
  • 아이템 62. 다른 타입이 적절하다면 문자열 사용을 피하라.
  • 아이템 63. 문자열 연결은 느리니 주의하라
  • 아이템 64. 객체는 인터페이스를 사용해 참조하라
  • 아이템 65. 리플렉션보다는 인터페이스를 사용하라
  • 아이템 66. 네이티브 메서드는 신중히 사용하라.
  • 아이템 67. 최적화는 신중히 하라.
  • 아이템 68. 일반적으로 통용되는 명명 규칙을 따르라. 

 

 


아이템 57.지역변수의 범위를 최소화하라

  • 지역 변수의 밤위를 줄이는 가장 강력한 방법은 가장 처음 쓰일때 선언하기 이다.
  • 거의 모든 지역변수는 선언과 동시에 초기화를 해야 한다.
  • 메서드를 작게 유지하고 한가지 기능에 집중하는 것이다.

아이템 58. 전통적인 for문 보다는 for-each문ㄴ을 사용해라

반복자와 인덱스 변수는 모두 코드를 지저분하게 할뿐 우리에게 필요한건 원소들뿐이다.

 

for each문을 사용할 수 없는 상황

- 컬렉션을 순회하면서 선택된 원소를 제거해야 한다면 반복자의 remove 메서드를 호출해야한다.

 ps) 자바8 부터는 Collection의 removeIf 메서드를 사용해서 컬렉션을 명시적으로 순회하는 일을 피할 수 있다.

 

결론은 가능한 모든 곳에서 for문 이 아닌 명료하고 유연하고 버그 예방과 성능 저하없는 for-each문을 사용하자.

 

아이템 59. 라이브러리를 익히고 사용하라.

  • 표준 라이브러리를 사용하면 그 코드를 작성한 전문가의 지식과 여러분보다 앞서 사용한 다른 프로그래머들의 경험을 활용할 수 있다.
  • 핵심적인 일과 크게 관련 없는 문제를 해경하느라 시간을 허비하지 않아도 된다는것이다.
  • 따로 노력하지 않아도 성능이 지속적으로 개선된다는 점이다.
  • 메이저 릴리즈마다 주목할 만한 수많은 기능이 라리브러리에 추가된다.

자바 프로그래머라면 java.lang , util , io 그 하위 패키지들에는 익숙해져라!

 

 

아이템 60. 정확한 답이 필요하다면 float와 double은 피해라.

float 와 double 타입은 과학과 공학 계산용으로 설계되었다. 

이진 부동소수점 연산에 쓰이며 , 넓은 범위의 수를 빠르게 정밀한 '근사치'로 계산하도록 세심하게 설계되었다.

float과 double 타입은 특히 금융 관련 계산과 맞지 않는다.

0.1 , 10의 음의 거든제곱수를 표현할 수 없기 때문이다.

 

금융계산에서는 계산시 부정확한 값이 사용되는걸 막기 위해 BigDecimal , int , long 을 사용해야 한다.

BigDecimal의 아쉬운 점은 기본타입보다 쓰기 불편하고 훨씬 느리다..

 

 

아이템 61. 박싱된 기본 타입보다는 기본 타입을 사용하라.

기본타입과 박싱된 기본타입의 주된 차이는 크게 3가지 이다.

  • 기본타입은 값만 가지고 있으나 , 박싱된 기본타입은 값에 더해 식별성(identity)이란 속성을 갖는다.
  • 기본타입의 값은 언제나 유효하나 , 박싱된 기본 타입은 유효하지 않은 값, 즉 nulla을 가질 수 있다.
  • 기본 타입이 박싱된 기본 타입보다 시간과 메모리 사용면에서 더 효율적이다.

아이템 62. 다른 타입이 적절하다면 문자열 사용을 피해라.

기본타입이든 참조타입이든 적절한 값 타입이 있다면 그것을 사용하고, 없다면 새로 하나 작성하라.

당연한 조언 같겠지만, 지켜지지 않는 경우가 많다.

1. 문자열은 열거 타입을 대신하기에 적합하지 않다.

2. 문자열은 혼합 타입을 대신하기에 적합하지 않다.

 ex) String compoundKey = className + "#" + i.next();

3. 문자열은 권한(capacity)을 표현하기 적합하지 않다.

 

결론은 문자열을 잘못 하용하면 번거롭고, 덜 유연하고, 느리고 , 오류 가능성도 크다.

 

아이템 63. 문자열 연결은 느리니 주의하라.

문자열 연결 연산자로 문자열 n개를 잇는 시간은 n제곱에 비례한다.

문자열은 불변(immutable)이라서 두 문자열을 연결할 경우 양쪽의 내용을 모두 복사해야 하므로 성능 저하는 피할 수 없는 결과이다.

 

성능을 포기하고 싶지 않다면 String 대신 StringBuilder를 사용하자.

 

아이템 64. 객체는 인터페이스를 사용해 참조하라

적합한 인터페이스만 있다면 매개변수뿐 아니라 반환값 , 변수 , 필드를 전부 인터페이스 타입으로 선언하라.

//나쁜 예
LinkedHashSet<Son> sonSet = new LinkedHashSet<>();

//좋은 예
Set<Son> sonSet = new LinkedHashSet<>();

나중에 구현 클래스를 교체하고자 한다면 그저 새 클래스의 생성자(혹은 다른 정적 팩토리)를 호출해주기만 하면 된다.

 

주의할점!!

원래의 클래스가 인터페이스의 일반 규약 이외의 특별한 기능을 제공하며 , 주변 코드가 이 기능에 기대어 동작한다면 새로운 클래스도 반드시 같은 기능을 제공해야 한다. 

 

String , BigInteger 같은 클래스들은 당연히 클래스로 참조해야 한다.

적합한 인터페이스가 없는 두번째 부류는 클래스 기반으로 작성된 프레임워크가 제공하는 객체들이다.

이러한 경우 특정 구현 클래스보다는 기반 클래스(부모)를 사용해 참조하는게 좋다. OutputStream 등 java.io 패키지의 여러 클래스가 이 부류에 속한다.

 

즉, 적합한 인터페이스가 없다면 클래스의 계층구조 중 필요한 기능을 만족하는 가장 덜 구체적인(상위의) 클래스를 타입으로 사용하자.

 

아이템 65. 리플렉션보다는 인터페이스를 사용하라.

 

아이템 66. 네이티브 메서드는 신중히 사용하라.

네이티브 메서드의 주요 쓰임은 3가지 이다.

  1. 레지스트리 같은 플랫폼 특화기능을 사용한다.
  2. 네이티브 코드로 작성된 기존 라이브러리를 사용한 다.
  3. 성능 개선을 목적으로 성능에 결정적인 영향을 주는 영역만 따로 네이티브 언어로 작성한다.

성능을 개선할 목적으로 네이티브 메서드를 사용하는것은 거의 권장하지 않는다.

예컨데 java.math사 처음 추가된 자바1.1 시절 BigInteger는 C로 작성된 고성능 라이브러리에 의지했다. 그러다 자바3 때 순수 자바로 다시 구현되면서 세심히 튜닝한 결과 , 원래의 네이티브 구현보다도 더 빨라졌다.