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

Java Code Conventions

by 조엘 2020. 11. 24.

우아한테크코스 1차에 합격했다! 이제 3주 동안의 프리코스를 거칠 텐데, 그전에 자바 코드 컨벤션을 공부해보도록 한다. 몸이 너무 안 좋아서 글을 읽는 게 도저히 안 되더라ㅜㅜㅜ 이미 잘 정리해주신 선배님들의 글을 참조하면서, 블로그에 포스팅하며 공부하기로 해본다. 

 

미리 얘기하지만, 거의 베끼다시피 한 포스팅이다. 개인 공부를 위해 남긴다! 

 

참조한 포스팅 :  myeonguni.tistory.com/1596

 

[코딩규칙] 자바 코딩 규칙(Java Code Conventions)

[코딩 규칙] 자바코딩 규칙(Java Code Conventions) 자바 프로그래밍 언어 코딩 규칙 원문 : Oracle / Code Conventions for JavaTM Programming Language / 1999-4-20 번역 : Kwangshin's Positive Blog, Java Co..

myeonguni.tistory.com

 

 

<자바 파일 구조>

    - 파일은 주석을 통해 다른 구역으로 나누어진다. 

    - 2,000 라인을 넘기는 파일은 피하자. 

 

 

<자바 소스 파일>

    - 각각의 자바 소스 파일은 public 클래스/인터페이스를 가짐

    - public 클래스는 파일에서 첫 번째 클래스/인터페이스 여야 한다. 

    - 자바 소스 파일은 다음과 같은 순서를 가진다. 

        * 시작 주석

        * Package문과 Import문

        * Class와 Interface 선언

/*
 * 클래스 이름
 *
 * 버전 정보
 * 
 * 날짜
 * 
 * 저작권 주의
 */
 
package java.awt;

import java.awt.peer.CanvasPeer;

 

 

<들여 쓰기>

    - 4개의 space를 들여 쓰기 단위로 사용한다. 

    - 8개의 space를 Tab으로 설정하자. 

 

 

<한 줄의 길이> 

    - 한 줄에 80자 이상 쓰지 말 것!

 

 

<줄 나누기>

    - 한 줄에 하나의 식이 들어갈 수 없다면, 다음 원칙을 통해 두 줄로 나눈다. 

        * 콤마 후에 두 줄로 나누기

        * 연산자 앞에서 두 줄로 나누기

        * 레벨이 높은 원칙에 따라 두 줄로 나누기

        * 앞줄과 같은 레벨의 식이 시작되는 새로운 줄은 앞줄과 들여 쓰기를 일치시킨다. 

        * 코드가 오른쪽 끝을 넘어간다면, 8개의 빈칸을 사용해 들여 쓴다. 

//연습하기 (출처:https://myeonguni.tistory.com/1596)
private static synchronized hrokingLongMethodName(int anArg,
        Object anotherArg, String yetAnotherArg,
        Object andStillAnother) {
        ...
}

        * 메소드 본문과 구분하기 위한 들여 쓰기는 8칸을 원칙으로 한다. 

//연습하기 (출처: https://myeonguni.tistory.com/1596)
if((condition1 && condition2) || (condition3 && condition4)
        ||!(condition5 && condition6)) {
    doSomething();
}

 

 

<주석>

    - 자바 프로그램은 2가지 종류의 주석을 갖는다. 

    - 주석은 프로그램을 읽는 것과 이해하는 것에 관계된 정보만을 포함해야 한다.

   

    구현 주석

        * /*...*/ 와 // 에 의해 경계가 정해지는 C++과 동일

        * 각각의 구현에 대한 추가적인 설명이 필요할 때 쓰인다. 

 

    문서화 주석

        * /**...*/에 의해 경계가 결정됨. 

        * 소스 코드가 없는 개발자들도 읽고 이해할 수 있게, 코드의 specification을 포함한다. 

 

 

<구현 주석>

    - 구현 주석은 4가지로 나눌 수 있다. 

 

    블록 주석

        * 파일, 메서드, 자료구조, 알고리즘에 대한 설명 제공할 때 사용한다. 

        * 주석이 설명하는 코드와 같은 단위로 들여 쓸 것!

/*
 * 여기에 블록 주석을 작성하기
 */

    한 줄 주석

        * 주석이 충분히 짧다면 한 줄에 넣자. 

        * 이 경우에도 주석이 설명하는 코드와 같은 단위로 들여쓰자. 

if (condition){
    /* 이 조건을 만족하면 실행된다. */
    ...
}

    꼬리 주석

        * 아주 짧은 주석이 필요하다면 코드와 같은 줄에 넣자

        * 대신 멀찌감치 넣어 실제 코드와 구분을 꼭 시켜주자. 

if (a==2) {
    return TRUE;            /* 특별한 경우 */
} else {
    return FALSE;           /* 그 외의 경우 */
}

    줄 끝 주석

        * //는 한 줄 모두를 주석 처리하거나, 한 줄의 일부분을 주석 처리해야 할 때 사용 가능

        * 어떤 코드의 일부분을 주석 처리할 때, 여러 줄에 걸쳐서 사용하는 경우도 있다. 

//출처: https://myeonguni.tistory.com/1596
if (foo > 1) {
    // double-flip 실행한다. 
    ...
}
else {
    return false;            //프로그램을 종료하는 flag
}
//if (bar > 1) {
//
//    // double-flip 실행한다. 
//    ....
//}
//else {
//    return false;
//}

 

 

<문서화 주석>

    - 문서화 주석은 다음 5가지를 설명한다. 

        * 자바 클래스

        * 인터페이스

        * 생성자

        * 메서드

        * 필드

    - 각각의 문서화 주석은 /**...*/ 안으로 들어간다. 

    - 문서화 주석은 선언 바로 전에 나와야 한다. 

/**
 * Example 클래스는 ...
 */
public class Example { ...

 

 

<한 줄 당 선언문의 수>

    - 한 줄에 하나의 선언문을 쓰도록 한다. 

    - 한 줄에 변수 하나를 할당해 주도록 한다. 

 

 

<클래스와 인터페이스의 선언>

    - 자바 클래스와 인터페이스 선언 시, 다음 3가지 원칙을 따르도록 한다. 

        * 메서드 이름과 그 메서드의 파라미터 리스트의 시작인 "(" 사이에 공백 두지 않는다. 

        * 여는 중괄호 "{"는 클래스/인터페이스/메서드 선언과 동일한 줄의 끝에 사용한다. 

        * 닫는 중괄호 "}"는 여는 문장의 들여 쓰기 만큼 들였어 새로운 줄에 작성한다. 

        * 메서드들을 구분하기 위해서 각 메서드들 사이에는 한 줄을 비우도록 한다. 

//출처: https://myeonguni.tistory.com/1596
class Sample extends Object {
    int ivar1;
    int ivar2;
    
    Sample(int i, int j) {
        ivar1 = i;
        ivar2 = j;
    }
    
    int emptyMethod() {}
    ....
}

 

 

<복합문>

    - 복합문은 중괄호 "{ statements }"로 둘러싸인 문들의 리스트를 포함하는 문이다. 다음과 같은 원칙을 따른다. 

        * 둘러싸인 문들은 복합문보다 한 단계 더 들여 쓰기를 한다. 

        * 여는 중괄호 "{"는 복합문을 시작하는 줄의 마지막에 위치해야 한다. 

        * 닫는 중괄호 "}"는 새로운 줄에 써야 하며, 복합문 시작 줄 만큼 들여 쓰기를 해야 한다. 

        * if-else, for 문 같은 제어 구조의 일부분으로 사용할 때에도, 단 하나의 문일 경우에도 중괄호를 사용한다. 

 

 

<if-else문>

    - if-else문은 다음과 같이 사용한다. 

if (condition) {
    statements;
} else if (condition) {
    statements;
} else {
    statements;
}

 

 

<for문>

    - for문은 다음과 같이 사용한다. 

for (initialization; condition; update) {
    statements;
}

 

 

<while문, do-while문>

    - while문, do-while문은 다음과 같이 사용한다. 

while (condition) {
    statements;
}

do {
    statements;
} while (condition);

 

 

<switch문>

    - switch문은 다음과 같이 사용한다. 

    - 모든 switch문은 default case를 포함하도록 한다. 

switch (condition) {
case ABC:
    statements;

case DEF:
    statements;
    break;

case XYZ:
    statements;
    break;

default:
    statements;
    break;
}

 

 

<try-catch문>

    - try-catch문은 다음과 같이 사용한다. 

    - try블록이 성공적으로 완료되든, 중간에 에러가 발생하든 상관없이 실행되어야 할 부분은 finally로 작성

try {
    statements;
} catch (ExceptionClass e) {
    statements;
} finally {
    statements;
}

 

 

<한 줄 띄우기>

    - 한 줄 띄우고 코드 작성해서 코드의 가독성을 높인다. 

    - 다음의 경우 한 줄 띄도록 한다. 

        * 메서드들 사이에서

        * 메서드 안의 지역 변수와 그 메서드의 첫 문장 사이에서 

        * 블록 주석 또는 한 줄 주석 이전에

        * 가독성을 향상하기 위한 메서드 내부의 논리적인 섹션들 사이에

   

    - 다음의 경우 두 줄 띄도록 한다. 

        * 소스 파일의 섹션들 사이에서

        * 클래스와 인터페이스 정의 사이에서 

 

 

<명명 규칙>

    - 프로그램을 더 읽기 쉽게 만들어준다. 이름으로 어떤 기능을 하는지 정보를 얻게 해 준다. 

        * Packages

        * Classes

        * Interfaces

        * Methods

        * Variables

        * Constants

 

 

<Packages 명명 규칙>

    - 아스키 소문자로 쓴다. 

    - 조직 내부의 명명 규칙을 따른다. (디렉토리 구조에서 디렉토리 이름으로도 사용됨)

    - ex) com.sun.eng / com.apple.quicktime.v2

 

 

<Classes 명명 규칙>

    - 명사여야 한다. 첫 글자는 대문자로!

    - 간단하고 명시적으로 작성한다. 

    - 약어는 피하도록 한다. 

    - ex) class Raster;

 

 

<Interfaces 명명 규칙>

    - 인터페이스 이름도 클래스와 같은 규칙을 적용한다. 

    - ex) interface RasterDelegate;

 

 

<Methods 명명 규칙>

    - 동사여야 한다. 첫 글자는 소문자로!

    - 복합 단어의 경우, 첫 단어는 소문자로 시작하고 그 이후 단어의 첫 문자는 대문자를 쓴다. 

    - ex) run(); / runFast();

 

 

<Variables 명명 규칙>

    - 변수 이름의 첫 문자는 소문자로, 각각 내부 단어의 첫 문자는 대문자로 한다. 

    - 짧지만 의미가 있어야 한다. 

    - 임시 변수의 경우 integer: i, j, k, m, n / character: c, d, e를 사용한다. 

    - ex) int i; / char c; / float myWidth;

 

 

<Constant 명명 규칙>

    - 클래스 상수로 선언된 변수들과 ANSI 상수들의 이름은 모두 대문자로 쓰고, 각각의 단어는 "_"로 분리한다. 

    - ex) static final int MIN_WIDTH = 4;

 

 

<그 외 신경 쓸 것들>

    - 괄호: 복합 연산자에서는 자유롭게 괄호를 사용하자

    - 반환 값: 프로그램의 구조와 목적을 일치시키자

//올바른 괄호 사용법
if ((a == b) && (c == d)) 

//올바르지 않은 반환값 사용법
if (booleanExpression) {
    return true;
} else {
    return false;
}

//올바른 반환값 사용법
return booleanExpression;

 

 

<코드 예제>

    - public class를 가지는 소스 파일을 어떻게 수정하는지 보여준다. 

    - 출처: myeonguni.tistory.com/1596

 

/*
 * @{#}CodeConvention.java        0.82 2020/11/24
 *
 * [출처: https://myeonguni.tistory.com/1596]
 * Copyright (c) 2016 Myeongun Ryu.
 * ComputerScience, ProgrammingLanguage, Java, Seould, KOREA
 * All rights reserved. 
 *
 * This software is the confidential and proprietary information of Myeongun
 * Ryu ("Confidential Information"). You shall not
 * disclose such Confidential Information and shall use it only in 
 * accordance with the terms of the license agreement you entered into 
 * with Myeongun Ryu.
 */

package myeonguni.codeconvetion;

import myeonguni.*;

/**
 * 클래스에 대한 설명을 여기에 작성한다. 
 * 
 * @version          1.00 2016년 11월 17일
 * @author           류명운
 */
public class CodeConvetion extends Convention {
    /* 클래스의 구현 주석을 여기에 작성한다. */
    
    /** 클래스 변수 classVar1에 대한 설명을 여기에 작성한다. (문서 주석) */
    public static int classVar1;
    
    /**
     * 클래스 변수 classVar2에 대한 설명이 (문서 주석이)
     * 한 줄 이상일 경우 이렇게 작성한다. (접근 제어자가 private일 경우 나오지 않는다.)
     */
    private static Object classVar2;
    
    /** 인스턴스 변수 instanceVar1에 대한 설명을 여기에 작성한다. (문서 주석) */
    public Object instanceVar1;
    
    /** 인스턴스 변수 instanceVar2에 대한 설명을 여기에 작성한다. (문서 주석) */
    protected int instanceVar2;
    
    /** 인스턴스 변수 instanceVar3에 대한 설명을 여기에 작성한다. (문서 주석) 접근 제어자가 private일 경우 나오지는 않음. */
    private Object[] instanceVar3;
    
    /**
     * ... 생성자 CodeConvetion()에 대한 설명을 여기에 작성한다. (문서 주석) ...
     */
    public CodeConvention() {
        // ... 여기에 실제 코드를 작성한다. ...
    }
    
    /**
     * ... 메서드 doSomething()에 대한 설명을 여기에 작성한다. (문서 주석)...
     */
     public void doSomething() {
        // ... 여기에 실제 코드를 작성한다. ...
     }
     
     /**
      * ... 메서드 doSomethingElse()에 대한 설명을 여기에 작성한다. (문서 주석) ...
      * @param someParam 파라미터에 대한 설명
      * @return String 리턴값에 대한 설명
      * @exception exception 예외사항에 대한 설명
      */
     public String doSomethingElse(Object someParam) {
        // ... 여기에 설계 코드를 작성한다. ...
     }
 }
     

 

자바로 프로그래밍 경험이 거의 없다시피 한지라 걱정이 되지만, 열심히 해서 좋은 성과 내보리라 다짐한다. 

우아한테크코스 한 번 가보도록 하겠습니다. 나 자신 파이팅 🤞

반응형

'프로그래밍 언어 > Java' 카테고리의 다른 글

저는 GC가 처음이라니까요?  (0) 2021.10.02
저는 어노테이션이 처음이라니까요?  (2) 2021.06.11
Reflection API  (4) 2021.06.09
저는 JVM이 처음이라니까요?  (6) 2021.05.28
HashMap/HashSet의 원리  (4) 2021.03.13

댓글