이 글을 자바 코딩 컨벤션을 익히기 위한 글로 공식문서를 번역한 것을 정리한 것입니다. 최소한의 예시만 있기 때문에 자세히 알고 싶다면 공식 문서를 참고하기 바랍니다.
1. 개요
코딩 규칙은 여러가지 이유에서 프로그래밍에 있어서 중요하다.
- 소프트웨어를 개발하는 일련의 모든 과정에 들어가는 비용 중 80%가 유지보수에 쓰여진다.
- 소프트웨어의 유지보수를 그 소프트웨어를 직접 개발한 개발자가 담당하는 경우는 거의 보기 힘들다.
- 코딩 규칙을 지키면 다른 개발자가 그 소스 코드를 처음 보았을 때, 더 빠른 시간 안에 이해할 수 있도록 도와주기 때문에, 소프트웨어의 가독성이 높아진다.
- 개발자가 자신의 소스 코드를 제품으로 팔려고 한다면, 자신이 작성한 다른 소스 코드들과 잘 어울리도록 패키지(Package)를 적절하게 구성할 필요가 있다.
2. 파일 이름
- README : 특정 디렉토리의 내용을 요약하는 파일 이름으로 사용
- GNUmakefile : make파일 이름으로 사용, 소프트웨어를 빌드할 때는 gnumake 명령어를 사용
3. 파일 구조
- 파일은 빈 줄이나 다른 구역임을 나타내주는 주석으로 나누어지는 여러 구역 (section)들로 구성되어 있다.
- 2000 라인을 넘는 파일은 이해하기가 쉽지 않기 때문에 될 수 있으면 피해야 한다.
- 자바 소스 파일
- 각각의 자바 소스 파일은 하나의 public 클래스 또는 인터페이스를 가진다. Private 클래스들과 인터페이스들이 public 클래스와 연결 되어 있을 때, public 클래스와 같은 파일에 private 클래스들과 인터페이스를 넣을 수 있다. Public 클래스는 파일에서 첫번째 클래스 또는 인터페이스이여야 한다.
- 자바 소스 파일은 다음과 같은 순서를 가진다.
- 시작 주석
- Package 문과 Import 문
- Class 와 Interface 선언
/* * Class name * Version information * Date * CopyRight */
- Package 문과 Import 문
- 대부분의 자바 소스 파일에서 주석이 아닌 첫번째 줄은 package 문이다. 그 후에, import 문이 뒤따라 나온다.
package java.test import java.test.test
- 주의 : Package는 한번만 선언되어야 하고, package 이름의 첫번째 부분은 모두 소문자 ASCII 문자를 사용해야 하고, 첫번째 레벨의 도메인 이름들(com, edu, gov, mil, net, org)중에 하나이거나 1981년 ISO Standard 3166에서 정의된 영어 두 문자로 표현되는 나라 구별 코드 중에하나이여햐 한다.
- 대부분의 자바 소스 파일에서 주석이 아닌 첫번째 줄은 package 문이다. 그 후에, import 문이 뒤따라 나온다.
- Class와 Interface 선언
- 아래는 Class 또는 interface 선언의 일부분들을 나타나는 순서에 따라 보여준다.
- 클래스, 인터페이스 문서화 주석
- 클래스, 인터페이스
- 필요한 경우 클래스, 인터페이스 구현 주석
- 클래스 변수
- 일반 변수
- 생성자
- 매서드
4. 들여쓰기
- 4개의 빈칸 들여쓰기 단위로 사용한다. 들여쓰기의 정확한 구현은 정해져 있지 않다. 탭은 4개의 빈칸이 아니라, 8개의 빈칸으로 설정하는 것이 좋다.
- 한 줄의 길이
- 한 줄에 80자 이상 쓰는 것은 대부분의 터미널(terminal)과 툴에서 다룰 수 없기 때문에 피해야 한다.
- 줄 나누기
- 하나의 식이 한줄에 들어가지 않을 때에는, 다음과 같은 일반적인 원칙들을 따라서 두 줄로 나눈다.
- 콤마 후에 두 줄로 나눈다.
- 연산자 앞에서 두줄로 나눈다.
- 레벨이 낮은 원칙 보다는 레벨이 높은 원칙에 따라 두 줄로 나눈다.
- 앞줄과 같은 레벵의 식이 시작되는 새로운 줄은 앞줄과 들여쓰기를 일치시킨다.
- 만약 위의 원칙들이 코드를 더 복잡하게 하거나 오른쪽 끝을 넘어간다면, 대신에 8개의 빈칸을 사용해 들여쓴다.
5. 주석
- 자바 프로그램은 두 가지 종류의 주석을 지원한다. /* ... */ 와 // 이다. 이때 주석은 코드 자체만 가지고는 알 수 없는 추가적인 정보만을 포함하고 있는 것이 좋다. 즉 중요하거나 코드만으로는 명확하지 않은 프로그램 설계에 대한 추가 설명을 포함하는 것이 적절하다.
- 주석을 별표 또는 다른 문자를 사용하여 그린 큰 사각현에 넣은 방법은 피하도록 하자.
- 주석은 폼 피드나 백스페이스와 같은 특수 문자를 포함해서는 안된다.
- 블록 주석
- 블록 주석은 파일, 메서드, 자료구조, 알고리즘에 대한 설명을 제공할 때 사용된다. 블록 주석은 각각의 파일이 시작될 때와 메서드 전에 사용된다. 또한 메서드 안에서와 같이 다른 장소레서도 사용될 수 있다. 메서드 안에 존재하는 블록 주석은 주석이 설명하는 코드와 같은 단위에 들여쓰기를 해야 한다.
- 한 줄 주석
- 짧은 주석은 뒤따라 오는 코드와 같은 동일한 들여쓰기를 하는 한 줄로 작성할 수 있다. 만약 주석이 한 줄에 다 들어가지 않는다면, 블록 주석 형식을 따라야한다. 한줄 주석은 빈 줄로 시작되어야한다.
- 꼬리 주석
- 아주 짧은 주석이 필요한 경우 주석이 설명하는 코드와 같은 줄에 작성한다. 하지만 실제 코드와는 구분 될 수 있도록 충분히 멀리 떨어뜨려야 한다.
- 줄 끝 주석
- 주석 기호 //는 한 줄 모두를 주석 처리하거나 한 줄의 일부분을 주석 처리해야 할 때 사용할 수 있다. 긴 내용을 주석에 포함하기 위해서 연속되는 여러 중에 이 주석을 사용하는 것은 안되지만, 어떤 코드의 일부분을 주석 처리하기 위해서 여러 줄에 연속해서 사용하는 것은 허락된다.
- 문서화 주석
- 문서화 주석은 자바 클래스, 인터페이스, 생성자, 메서드 그리고 필드들을 설명한다. 각각의 문서화 주석은 주석 경계 기호인 /** ... */ 안으로 들어간다. 그리고, 각각의 문서화 주석은 클래스, 인터페이스 그리고 멤버 당 하나씩 가진다. 문서화 주석은 선언 바로 전에 나와야 한다.
6. 선언
- 한 줄당 선언문의 수
- 한 줄에 하나의 선언문을 쓰는 것이 주석문 쓰는 것을 쉽게 해주기 때문에 한 줄에 하나의 선언문을 쓰는 것이 좋다.
- 초기화
- 지역 변수의 경우, 지역 변수를 선언할 때 초기화 하는 것이 좋다. 변수의 초기화 값이 다흔 계산에 의해서 결정되는 경우라면, 변수를 선언할 때 초기화 하지 않아도 좋다.
- 배치
- 선언은 블록의 시작에 위치해야 한다. ( 보통 블록은 중괄호 ) 변수를 처음 사용할 때까지 변수의 선언을 미루지 말아라, 이러한 경우 부주의한 프로그래머들을 혼돈에 빠뜨릴 수 있고, 영역내에서 코드를 이동해야 하는 경우에 문제를 야기시킬 수 있다.
- 클래스와 인터페이스의 선언
- 자바 클래스와 인터페이스를 선언할 때, 다음과 같은 원칙을 따르도록 하자.
- 메서드 이름과 그 메서드의 파라미터 리스트의 시작인 괄호 사이에는 빈 공간이 없어야 한다.
- 여는 중괄호는 클래스/인터페이스/메서드 선언과 동일한 줄의 끝에 사용하자.
- 닫는 중괄호는 null 문인 경우를 제외하고는, 여는 문장과 동일한 들여쓰기를 하는 새로운 줄에서 사용하자.
7. 문(Statements)
간단한 문
- 각각의 줄에는 최대한 하나의 문만 사용하도록 한다.
복합문
- 복합문은 중괄호로 둘러싸여진 문들의 리스트를 포함하는 문이다.
- 둘러 싸여진 문들은 복합문보다 한 단계 더 들여쓰기를 한다.
- 여는 중괄호는 복합문을 시작하는 줄의 마지막에 위치해야 한다. 닫는 중괄호는 새로운 줄에 써야 하고, 복합문의 시작과 같은 들여쓰기를 한다.
- 중괄호들이 if-else 문이나 for 문 같은 제어 구조의 일부분으로 사용되어질 때에는 이러한 중괄호들이 모든 문들을 둘러싸는데 사용되어져야 한다. 이렇게 사용하는 것이 중괄호를 닫는 것을 잊어버리는 것 때문에 발생하는 버그를 만들지 않고, 문을 추가하는 것에 큰 도움을 준다.
return 문
- 값을 반환하는 return 문은 특별한 방법으로 더 확실한 return 값을 표현하는 경우를 제외하고는 괄호를 사용하지 않는 것이 좋다.
if, if-else, if else-if else 문
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else {
statements;
}
for 문
for (initialization; condition; update) {
statements;
}
while 문
while (condition) {
statements;
}
do - while 문
do {
statements;
} while (condition);
switch 문
switch (condition){
case ABC;
statements;
case DFS;
statements;
case XYZ;
statements;
break;
default;
statements;
break;
}
try-catch 문
try{
statements;
} catch (ExceptionClass e){
statements;
}
try{
statements;
} catch (ExceptonClass e){
statements;
} finally {
statements;
}
8. 빈 공간
- 한 줄 띄우기
- 한 줄을 띄우고 코드를 작성하면, 논리적으로 관계가 있는 코드들을 쉽게 구분할 수 있기 때문에 코드의 가독성을 향상시킨다.
- 다음과 같은 경우에는 두 줄을 띄어서 코드를 작성한다.
- 소스 파일의 섹션들 사이에서
- 클래스와 인터페이스의 정의 사이에서
- 다음과 같은 경우에는 한 줄을 띄어서 코드를 작성한다.
- 메서드들 사이에서
- 메서드 안에서의 지역 변수와 그 메서드의 첫 번째 문장 사이에서
- 블록 주석 또는 한 줄 주석 이전에
- 가독성을 향상시키기 위한 메서드 내부의 논리적인 섹션들 사이에
- 공백
- 공백을 다음과 같은 경우에 사용된다.
- 괄호와 함께 나타나는 키워드는 공백으로 나누어야 한다.
- 메서드 이름과 메서드의 여는 괄호 사이에 공백이 사용되어서는 안된다. 이렇게 하는 것은 메서드 호출과 키워드를 구별하는데 도움을 준다.
- .을 제외한 모든 이항 연산자는 연산수들과는 공백으로 분리되어져야한다. 공백은 단항 연산자의 경우에는 사용해서는 안 된다.
9. 명명 규칙 ( Naming Convention)
- 명명 규칙, 즉 이름을 정하는 규칙은 프로그램을 더 읽기 쉽게 만들어 줌으로써 더 이해하기 쉽게 만들어 준다. 또한 식별자를 통해서 기능에 대한 정보도 얻을 수 있다.
- 카멜 스타일을 사용한다.
- 패키지
- 패키지의 이름은 최상위 레벨은 항상 ASCII 문자에 포함되어 있는 소문자로 쓰고, 가장 높은 레벨의 도메인 이름 중 하나이어야 한다.
- 패캐지 이름의 나머지 부분은 조직 내부의 명명 규칙을 따르면 된다. 이러한 규칙을 따라 만들어진 이름은 디렉토리 구조에서 디렉토리 이름으로도 사용된다.
- 클래스
- 클래스 이름은 명사이어야 하며, 복합 단어일 경우 각 단어의 첫 글자는 대문자이어야 한다. 클래스 이름은 간단하고 명시적이 되도록 작성한다. 완전한 단어를 사용하고 두 문자어와 약어는 피하도록 하자
- 인터페이스
- 인터페이스 이름도 클래스 이름과 같은 대문자 사용 규칙을 적용해야 한다.
- 메서드
- 메서드의 이름은 동사이어야 하며, 복합 단어일 경우 첫 단어는 소문자로 시작하고 그 이후에 나오는 단어의 첫 문자는 대문자로 사용해야 한다.
- 변수
- 변수 이름의 첫 번째 문자는 소문자로 시작하고, 각각의 내부 단어의 첫 번째 문자는 대문자로 시작해야 한다. 변수 이름이 언더바 또는 달러 표시 문자로 시작하는 것이 허용되기는 하지만, 이 문자들로 시작하지 않도록 주의하다. 변수 이믈은 짧지만 의미 있어야 한다. 변수 이름의 선택은 그 변수의 사용 의도를 알아낼 수 있도록 의미적이어야 한다. 한 문자로만 이루어진 변수 이름은 임시적으로만 사용하고 버릴 변수일 경우를 제외하고는 피해야 한다.
- 상수
- 클래스 상수로 선언된 변수들과 ANSI 상수들의 이름은 모두 대문자로 쓰고 각각의 단어는 언더바로 분리해야 한다.
10. 좋은 프로그래밍 습관
- 인스턴스 변수와 클래스 변수를 외부에 노출하지 말고 대신 접근을 제공
- 인스턴스 변수 또는 클래스 변수를 합당한 이유없이 public 으로 선언하지 말아라. 인스턴스 변수들은 명시적으로 선언될 필요가 없는 경우도 많다.
- 인스턴스 변수가 public 으로 선언되는 것이 적절한 경우는 클래스 자체가 어떤 동작을 가지지 않는 데이터 구조일 경우이다.
- 클래스 변수와 클래스 메서드는 클래스 이름을 사용하여 호출
- 클래스 변수 또는 클래스 메서드를 호출하기 위해서 객체를 사용하는 것은 피해야 한다. 대신에 클래스 이름을 사용해라.
- 숫자는 바로 사용하지 말고 선언해서 변수 이름으로 접근
- 숫자 상수는 카운트 값으로 for 루프에 나타나는 -1, 0, 1을 제외하고는 숫자 자체를 코드에 사용하지 말아라.
- 변수에 값을 할당할 때 주의할 것들
- 하나의 문에서 같은 값을 여러 개의 변수들에 할당하지 말아라. 이렇게 하면 읽기가 어렵게 된다.
원문 : Code Conventions for JavaTM Programming Language, Revised April 20, 1999
'💻Computer Science > 📕개발 언어 (Language)' 카테고리의 다른 글
[C][Ch.2] C언어 기초 (2) | 2021.07.22 |
---|---|
[C][Ch.1] C언어란 무엇인가 ? (2) | 2021.07.14 |
[C++] STL : Vector 사용법과 함수 (0) | 2021.03.27 |
[C++] STL이란 무엇인가? (0) | 2021.03.27 |
[ETC] 메모리 구조 (0) | 2021.03.25 |