본문 바로가기

Java/이펙티브 자바

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

지역변수의 범위를 최소화하라

항상 사용할때 지역변수를 선언하자

지역변수의 범위를 최소화 할 수 있다.

그리고 지역변수는 선언과 함께 초기화 해줘야 헷갈리지 않는다.

하지만, 지역변수를 초기화 할 수 없다면, 초기화 가능 할때 해주면된다.

 

try -catch 문은 예외다.

try 블록 밖에서도 변수를 사용해야 하면 지역변수 선언은 try 문장 밖에서 하고

초기화는  try-catch 문 안에서 하면 된다.

 

반복문은 while 보다 for 문을 권장한다.

for문이 지역변수의 범위를 더 최소화 할 수 있다.

 

전통적인 for 문보다는 for-each 문을 사용하라

단순히 반복 실행을 위해 루프 변수가 필요해진다.

불필요하고 잘못사용할 경우 오류가 발생할수있다.

 

foreach를 권장한다.

라이브러리를 익히고 사용하라

표준 라이브러리를 사용하면

시간 소비를 줄일 수 있고

성능이 지속해서 개선이된다.

기능이 점점 많아지며, 유지보수도 좋다.

 

 

정확한 답이 필요하다면 float와 double은 피하라

float 과 double 은 정밀한 근사치로 계산하도록 설계되어있다.

따라서 0.1 이나 10의 음의 거듭 제곱들을 표현하기 어렵다.

 

정확한 계산이 필요할 땐 BigDecimal, int 또는 long을 사용하면 된다.

 

하지만, BigDecimal 은 성능이 훨씬 느리다.

 

 

박싱된 기본 타입보다는 기본 타입을 사용하라

Integer, Double, Boolean 같은 박싱된 primitive 타입 보다는 

일반 primitive 타입을 사용하는게 좋다.

자바에서는 오토 박싱과 오토 언박싱이 있기때문에 크게 구분하지 않고도 사용할 수 는 있지만,

차이가 있다.

 

박싱된 primitive 타입은 두 인스턴스가 값이 같더라도 다르다고 식별을 한다.

그리고 박싱된 primitive 타입은 null을 가질 수 있다.

 

기본 타입이 시간, 메모리 사용면에서 더 효율적이다.

 

 

박싱된 primitive 타입은 언제 사용할까?

컬렉션의 원소 키 값에 사용된다 키 값으로 primitive 타입을 쓸 수 없기 때문에

다른 타입이 적절하다면 문자열 사용을 피하라

정말로 String 인 것만 쓰는게 좋다.

문자열은 잘못사용하면 느리고 오류 가능성도 크다.

 

문자열 연결은 느리니 주의하라

String 은 불변이다.

즉, 할당된 메모리 공간이 변경되지 않는다.

만약 문자열에 + 로 문자열을 추가하면 실제로 추가되는게 아니라

문자열 객체를 만들고 그 객체를 참조한다.

원래 문자열은 참조가 사라지면서 GC 대상이 된다.

즉.. String 연산은 시간과 자원을 쓴다.

 

대신 StringBuilder 의 append 를 사용해라

 

* StringBuilder 와 StringBuffer 의 차이점?

StringBuffer 가 동기화를 보장한다.

 

 

 

String 최적화

JDK 1.5 부터는 String 연산을 StringBuilder 로 변경해서 사용을 한다.

하지만, 반복문에서 계속 String  + 연산을 하게 되면

StringBuilder 를 계속 만들게 되어서 컴파일 하는 성능이 느려진다.

이런 경우엔 StringBuilder 를 쓰는게 좋다

 

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

선언을 인터페이스로 하는게 좋다

 

 

인터페이스 타입을 사용하면, 구현 클래스를 교체하기 유연해진다.

하지만, 인터페이스의 특별한 기능이 제공된다면 원하는 값과 다르게 동작할 수 있으니 주의하자

 

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

리플렉션은 강력한 기능이지만, 타입 검사를 안하니 

런타임에 오류가 발생할 수 도  있다.

또 코드가 지저분해지고 읽기 어렵우며 성능이 떨어진다.

 

리플렉션은 런타임에 존재하지 않는 다른 클래스, 메서드, 필드 를 다룰 떄 적합하다.

버전이 여러개 존재하는 외부 패키지를 다룰 때 사용된다.

일부 버전은 컴파일하고 다른 버전들은 리플렉션으로 접근하는 방식

물론, 새로운 클래스나 메서드가 런타임에 없을 수 도있는걸 감안해야한다.

 

 

네이티브 메서드는 신중히 사용하라

native 메서드는 네이티브 언어(C, C++) 로 작성된 메서드

native 를 호출하는걸 JNI 라고 한다.

 

하지만 native 메서드는 성능적으로는 권장하지 않는다.

어쩔수 없이 사용해야 한다면 최소한만 사용하고 철저히 테스트 해야한다.

 

최적화는 신중히 하라

- 빠른 프로그램 보단 안전한 프로그램이어야한다.

- 성능에 신경쓰며 설계 해라

- api 설계도 성능을 고려해야한다 

   컴포지션으로 해결될걸 상속을 쓴다던지 public 메서드에서 불필요한 방어적 복사를 한다던지 

   위 문제들은 성능에 문제를 일으킬수있다.

- 프로파일링 도구로 성능을 측정하라

 

일반적으로 통용되는 명명 규칙을 따르라

표준 명명 규칙을 따르자