[Java] Java Coding Style

원알렉스·2020년 5월 17일
1

Java

목록 보기
7/7
post-thumbnail

향상된 for 문

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 / else 블록의 순서

  • 가능하면 if 문에는 긍정의 조건을 넣어야지 가독성이 높다
  • 두 블록 중 간단한 로직을 먼저 if 문에 둔다
  • 단, 계층적 구조로 중첩될 경우, 부정의 조건을 if 문에 넣어서 계층 구조를 없애는 것이 더 우선시 된다
if (hasAccount()) {
	// 간단하고 긍정적인 내용
}
else {
	// 상대적으로 복잡한 내용
}    

삼항 연산자

  • 간단한 구문일 경우: 삼항연산자
  • 복잡한 구문일 경우: if / 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;       
profile
Alex's Develog 🤔

0개의 댓글