01. 지역변수의 범위를 최소화하라
선언과 동시에 초기화하기
public void test(){
int size = 30, start = 1, end = 10000, plust = 3;
FileOutPutStream fos = null;
try{
}catch(Exception e{
}
}
메서드를 작게 유지하고 한 가지 기능에 집중하기
public void order(){
1. 카드정보 확인
2. 업체정보 확인
3. 주문 가능여부 확인
}
public boolean isAvailablePayment(){}
public boolean isOrderAble(){}
02. 전통적인 for문 보다는 for-each를 사용하라
전통적인 for문
List<String> stringList = new ArrayList<>();
for(int i = 0; i < stringList.size(); i++){
String s = i.next();
if(s.equals("test")){
i.remove();
}
}
stringList.removeIf(s -> s.equals("test"));
파괴적인 필터링
* 순회하면서 선택된 원소를 제거해야한다면 반복자의 remove를 호출해야함
* 자바8 부터는 collection의 removeIf를 사용
변형 : 원소의 값 일부 혹은 전체를 교체해야 한다면 리스트의 반복자나 배열의 인덱스 사용 필요
문자열 연결 느리니 주의
문자열 n개를 잇는 시간은 n 제곱
성능을 포기하고 싶지 않다면 StringBuilder 사용
Lombok의 @ToString은 + 사용
03. 객체는 인터페이스를 사용해 참조하라
Interface better than Class
Interface | Class |
---|
유연(Flexible하다 | 형태가 고정적이다. |
어떤 구현체일지 알 수 없다. | 클래스가 명확하기 때문에 내부가 어떻게 이루어져 있는 지 알 수 있다. |
적합한 Interface가 없는 경우
* String, BigInteger와 같은 값을 나타내는 Class
* Class 기반으로 작성된 framework가 제공하는 객체들 EX).OutPutStream
Interface에 없는 특별한 메서드를 제공하는 클래스들
Ex). PriorityQueue는 Queue에 없는 Comparator 메서드를 제공
04. 리플렉션보다는 인터페이스를 사용하라
Reflection이란
실행중인 Java 프로그램이 자체적으로 검사하거나, 수정할 수 있는 기능
예를 들어 Class가 모든 member의 이름을 가져와 출력할 수 있다.
즉 Class의 Structure를 개발자가 확인할 수 있고 값을 가져오거나 메서드를 호출할 수 있음
(Spring, Hibernate, Jackson등)
단점
- 컴파일타임 타입 검사가 주는 이점을 누릴 수 없음
- 코드가 지저분해지고 장황해지며 성능이 떨어짐
리플렉션을 사용할 때에는 인스턴스 생성에만 쓰고, 인스턴스는 인터페이스나, 상위 클래스를 참조해 사용
최적화는 신중히 하라
빠른 프로그램 보다는 좋은 프로그램을 작성
구현의 문제는 최적화로 해결할 수 있지만, 최적화를 위해 아키텍쳐를 손장시키면 돌이킬 수 없다.
성능을 제한하는 설계를 피하라
05. 일반적으로 통용되는 명명 규칙을 따르라
Package 명명 규칙
* 외부에서 사용된다면 인터넷 도메인 역순 (ex. com.google)
* 각 요소는 8글자 이하의 짧은 단어 사용 (ex. GlobalPositioningSystem -> gps등)
* 필요할 경우 계층을 나누어서 (ex. deliveryDriver -> delivery.driver
Class & interface 명명 규칙
* 하나 이상의 단어 (passenger, delivertDriver)
* 널리 통용되는 줄임말을 제외하면 줄여 쓰지 않는다.
* 약자의 경우 첫글자 대문자 or 전체를 대문자 (보통은 첫문자 대글자)
Method & Field의 명명 규칙
* 첫 글자는 소문자
* 상수 필드는 전체 대문자 (static final)
* 지역변수는 약어를 조금 더 적극적으로 사용해도 무방
문법 규칙
* 단순명사 or 명사구
* 객체를 생성할 수 있는 클래스의 이름을 복수로 (PatternUtils)
* Interface는 able or ible로 끝나는 형용사
* 동작을 수행하는 메서드는 동사나 (목적어를 포함한 동사구) (ex. append, add)
* 반환타입이 Boolean, void가 아니거나,
해당 인스턴스의 속성을 반환한다면 get ~을 보통 사용 (필수는 아님)
* 객체의 타입을 바꾼다면 to ~ (toArray, toList, toString)