for(int item: array) {
System.out.print(item);
}
int[] array1 = new int[] {1, 2, 3, 4};
int[] array2 = new int[] {5, 6, 7, 8};
// 새로운 배열 생성
int[] combinedArray = new int[array1.length + array2.length];
// array1 복사
System.arraycopy(array1, 0, combinedArray, 0, array1.length);
// array2 복사
System.arraycopy(array2, 0, combinedArray, array1.length, array2.length);
List<Integer> combinedList = new ArrayList<>();
combinedList.addAll(list1);
combinedList.addAll(list2);
Map<String, Integer> combinedMap = new HashMap<>();
combinedMap.putAll(map1);
combinedMap.putAll(map2);
Collections.sort(list);
void initialize() {
if (!isInitialized()) {
// 적절한 초기화 로직
}
}
void initialize() {
if (isInitialized()) {
return;
}
// 적절한 초기화 로직
}
void compute() {
Server server = getServer();
if (server != null) {
Client client = server.getClient();
if (client != null) {
Request request = client.getRequest();
if (request != null) {
// 실제 처리할 로직
}
}
}
}
void compute() {
Server server = getServer();
if (server == null) return;
Client client = server.getClient();
if (client == null) return;
Request request = client.getRequest();
if (request == null) return;
// 실제 처리할 로직
}
일반적으로 개발할 시 긍정적 (유효한) 상황을 염두하고 개발을 진행하게 된다. 그래서 계속적으로 유효성 체크 로직이 포함할 시에는 마치 계층 (hierarchy) 구조로 보인다. - 기존
하지만 이를 역으로 부정적 (유효하지 않는 상황) 상황을 염두하고 분기처리하면 선형 (linear) 구조를 취합니다. - 개선
고로 더 나은 가독성과 구조를 제공하는 것이다.
일반적으로는 유효하지 않은 상황으로 분기되면 예외를 발생시킨다.
for (int item: array) {
if (item == 0) continue;
// 실제 처리할 로직
}
continue 를 이용하면 유사하게 처리가 가능하다
if (10 <= length)
// 아래가 더 낫다
if (length >= 10)
좌변에 유동적인 값이나 표현을 넣고, 우변에 상수와 같은 고정값 표현을 넣어야지 가독성이 좋다
if (hasAccount()) {
// 간단하고 긍정적인 내용
}
else {
// 상대적으로 복잡한 내용
}
삼항연산자는 코드 한 라인으로 적절한 가독성을 확보할 수 있을 때 사용하며, 만약 한 라인으로 처리하기 복잡할 경우에는 if / else를 쓰는 것이 훨씬 유리하다
삼항 연산자가 유리한 경우
String timeType = hour < 12 ? "AM" : "PM";
if / else 가 유리한 경우
String timeTypeKor, timeTypeEng;
if (hour < 12) {
timeTypeKor = "오전";
timeTypeEng = "AM";
}
else {
timeTypeKor = "오후";
timeTypeEng = "PM";
}
기존 코드
if (request.user.id != document.ownerId) {
return;
}
개선된 코드
private boolean isOwner(Request request, Document document) {
return request.user.id == document.ownerId;
}
final boolean isOwner = this.isOwner(request, document);
if (!isOwner) {
return;
}
재사용 되거나, 혹여 재사용되지 않더라도 조건 내의 복잡한 내용을 메소드로 표현하게 되면 더 나은 가독성을 얻을 수 있다
기존 코드
// begin이나 end가 range에 포함되는지
private void overlaps(Range range) {
return (begin >= range.begin && begin < range.end) ||
(end > range.begin && end <= range.end) ||
(begin <= range.begin && end >= range.end);
}
개선된 코드
private void overlaps(Range range) {
if (range.end <= begin) return false;
if (range.begin >= end) return false;
return true;