본문 바로가기
프로그래밍/Java

[Java] 자바에서 줄바꿈, 개행의 규칙

by 사바라다 2020. 6. 26.

개발은 회사에 들어가면 혼자할 수 도 있지만 협업하는 경우가 훨씬 많습니다. 동일한 시간에 혼자서 만들 수 있는 프로젝트에는 한계가 있기 때문입니다. 무궁무진하게 쉴새없이 좋은 기술들이 나오고 있는 현재, 그리고 계속해서 바뀌는 요구사항. 모든 것을 만족시키려면 협업이 중요합니다.

여러명이서 만들지만 혼자서 만든것과 같은 결과물이 나온다면 그것은 더 없이 좋은 결과물이라고 생각합니다. 그러기 위해서는 코딩의 습관 등이 프로젝트에 일관적일 필요가 있습니다. 이럴 때 이용할 수 있는 것이 Coding Convention입니다.

오늘은 Coding Convention 중 Oracle docs에 나와있는 Coding Convention을 보면서 스스로 자신의 코딩 스타일에 대해서 되돌아보는 시간을 가지고자 합니다.

여러 스타일이 있지만 오늘은 한 줄의 길이와 개행 규칙에 대해서 이야기해보고자합니다.

Line Length (한 줄의 길)

1줄의 길이는 80자 이상은 피하는게 좋습니다. 1줄의 80자 이상이 되면 터미널이나 IDE를 통해서 한눈에 들어오기 어렵기 때문입니다. 하지만 코드의 길이가 본의 아니게 80자가 넘는 경우가 허다합니다. 변수나 메서드. 클래스의 역할을 명확하게 하기 위해서 명명을 하게 되면 길이가 길어지게 되며 금방 80자를 넘게됩니다.

Wrapping Lines (개행 규칙)

80자 안의 단일 라인으로 처리할 수 없다면 여러줄로 만들어야합니다. 그 일반적인 원칙은 아래와 같습니다.

  1. 컴마(,)의 뒤 엔터
  2. 사칙연산 ( +, -, *, /) 또는 논리연산(&&, ||)의 앞 엔터
  3. 묶음 단위가 있다면 그 묶음 단위가 끝난 뒤 엔터
  4. 2 번째 라인의 시작은 같은 레벨의 표현과 동일 선상에서 시작
  5. 만약 위의 룰을 따랐는데 명확하지 않다면 들여쓰기를 8 space를 진행

예제를 통해서 일반적인 원칙에 대해서 좀 더 살펴보겠습니다. 오늘은 예제안에 코드를 넣어 각각 설명하도록 하겠습니다. ( 예제또한 oracle 문서에서 가져왔습니다. )

/*
 * 동일 레벨로 파라미터가 존재할 때는 , 뒤에서 엔터를 칩니다.
 */
someMethod(longExpression1, longExpression2, longExpression3, // 여기까지 65자
        longExpression4, longExpression5); 

 /*
  * 함수안에 함수를 넣어 길이가 길어진다면 그 함수를 개행한 수 길이를 맞춥니다.
  */
int integer = someMethod1(longExpression1, 
                        someMethod2(longExpression2, 
                                longExpression3));
/*
 * 사칙연산 또는 논리연산을 이용할 때는 연산 앞에서 엔터를 칩니다.
 * 또한 연산 그룹이 존재한다면 해당 그룹의 중간에서 엔터를 치는것은 피합니다.
 */
longName1 = longName2 * (longName3 + longName4 - longName5)
           + 4 * longname6; // PREFER

longName1 = longName2 * (longName3 + longName4
                       - longName5) + 4 * longname6; // AVOID
/*
 * 같은 레벨(같은 파라미터)이라면 개행된 라인의 첫 시작은 같은 레벨의 처음으로 
 * 맞춰주는것이 좋습니다.
 */
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
           Object andStillAnother) {
    ...
}

/*
 * 아래의 경우 이미 메서드까지 해서 라인이 많이 길어졌습니다. 
 * 이럴 경우 개행을 같은 레벨로 맞추면 이미 많이 길어져있기때문에 불편합니다.
 * 이럴 경우 개행한 후 8번 띄우고 이어쓰는걸 추천합니다.
 */
private static synchronized horkingLongMethodName(int anArg,
        Object anotherArg, String yetAnotherArg,
        Object andStillAnother) {
    ...
}
/*
 * 아래와 같이 개행된 조건을 바로 쓰면 아래 나올 실제 본문의 가독성이 떨어질 
 * 수 있습니다.
 */
if ((condition1 && condition2)
    || (condition3 && condition4)
    ||!(condition5 && condition6)) { //BAD WRAPS
    doSomethingAboutIt();            // 실제 본문 영역과 조건 영역의 오해 발생 가능
} 

/*
 * 따라서 아래와 같이 개행 된 조건의 경우 4 스페이스 정도로 들여쓰기 하는 것이 좋습니다.
 */
if ((condition1 && condition2)
        || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomethingAboutIt();
} 
/*
 * 3항 연산자는 아래와 같이 사용할 수 있습니다.
 */
alpha = (aLongBooleanExpression) ? beta : gamma;  

alpha = (aLongBooleanExpression) ? beta
                                 : gamma;  

alpha = (aLongBooleanExpression)
        ? beta 
        : gamma;

마무리

오늘은 이렇게 oracle에서 제공하는 java 코딩의 컨벤션 중 1줄의 길이, 그리고 개행에 대해서 알아보는 시간을 가졌습니다. 내가 쓴 코드는 누구든 알아보기 쉽게 하기위해서 우리모두 노력합시다.

감사합니다.

참조

https://www.oracle.com/java/technologies/javase/codeconventions-indentation.html

댓글