티스토리 뷰
코드 컨벤션의 개념과 java 코드 컨벤션에 대해 다룹니다.
코드 컨벤션 (Code Conventions)
코딩 컨벤션(Coding Convention)이라고도 불리며, 읽고 관리하기 쉬운 코드를 작성하기 위한 일종의 코딩 스타일 규약을 말합니다.
필요성
혼자 개발을 하는 상황이라면 코드 컨벤션의 필요성이 적다고 느껴질 수도 있습니다. 하지만 여러 명의 개발자가 하나의 프로젝트에 투입이 되는 상황에서 각자의 스타일대로 코딩을 한다면, 다른 사람의 코드를 이해하거나 오류를 찾는데에 불필요한 시간이 소요되는 문제가 발생합니다.
이는 사전에 코드 스타일을 통일함으로써 해결할 수 있습니다. 코드 컨벤션을 준수하면 코드의 가독성이 좋아지고, 성능에 영향을 주거나 오류를 발생시키는 잠재적 위험 요소를 줄여주며, 특히 규모가 큰 프로젝트일수록 유지보수 비용을 줄이는데 도움이 됩니다.
Java Code Conventions - Oracle
September 12, 1997
https://www.oracle.com/technetwork/java/codeconventions-150003.pdf
1 Introduction
1.1 Why Have Code Conventions
1.2 Acknowledgments
2 File Names
2.1 File Suffixes
2.2 Common File Names
3 File Organization
3.1 Java Source Files
3.1.1 Beginning Comments
3.1.2 Package and Import Statements
3.1.3 Class and Interface Declarations
4 Indentation
4.1 Line Length
4.2 Wrapping Lines
5 Comments
5.1 Implementation Comment Formats
5.1.1 Block Comments
5.1.2 Single-Line Comments
5.1.3 Trailing Comments
5.1.4 End-Of-Line Comments
5.2 Documentation Comments
6 Declarations
6.1 Number Per Line
6.2 Placement
6.3 Initialization
6.4 Class and Interface Declarations
7 Statements
7.1 Simple Statements
7.2 Compound Statements
7.3 return Statements
7.4 if, if-else, if-else-if-else Statement
7.5 for Statements
7.6 while Statements
7.7 do-while Statements
7.8 switch Statements
7.9 try-catch Statements
8 White Space
8.1 Blank Lines
8.2 Blank Spaces
9 Naming Conventions
9.1 Classes
9.2 Interfaces
9.3 Methods
9.4 Variables
9.5 Constants
10 Programming Practices
10.1 Providing Access to Instance and Class Variables
10.2 Class Variables and Methods
10.3 Constants
10.4 Variable Assignments
10.5 Miscellaneous Practices
10.5.1 Parentheses
10.5.2 Returning Values
10.5.3 Expressions before ‘?’ in the Conditional Operator
10.5.4 Special Comments
11 Code Examples
11.1 Java Source File Example
1. 개요
1.1 왜 코드 컨벤션이 필요한가? (생략)
1.2 논문 사사 (생략)
2. 파일 이름
이 장에서는 일반적으로 사용되는 파일 확장자 및 이름을 설명합니다.
2.1 파일 확장자
자바 소프트웨어는 다음의 파일 확장자를 사용한다.
파일 형태 | 확장자 |
Java source | .java |
Java bytecode | .class |
2.2 공통으로 사용되는 파일 이름
자주 사용되는 파일 이름은 다음과 같다.
파일 이름 | 사용 |
GNUmakefile | The preferred name for makefiles. We use gnumake to build our software. |
README | 특정 디렉토리의 내용을 요약하는 파일 이름으로 사용 |
3. 파일 구조
파일은 빈 줄로 구분되어야 하는 섹션과 각 섹션을 식별하는 주석으로 구성된다.
2,000줄 이상의 파일은 복잡하기에 피해야한다.
3.1 자바 소스 파일
각각의 자바 소스 파일은 하나의 public 클래스 또는 인터페이스를 가진다. private 클래스들과 인터페이스들이 public 클래스와 연결되어 있는 경우, public 클래스와 같은 파일에 private 클래스들과 인터페이스들을 넣을 수 있다. public 클래스는 파일에서 첫 번째 클래스 또는 인터페이스이어야 한다.
다음과 같은 순서를 가진다.
3.1.1 시작 주석
모든 소스 파일은 프로그래머, 날짜, 저작권, 프로그램의 목적에 관한 간단한 설명 등의 C 스타일의 주석과 함께 시작한다.
/*
* Classname
*
* Version info
*
* Copyright notice
*/
3.1.2 Package 문과 Import 문
대부분의 자바 소스 파일에서 주석이 아닌 첫 번째 줄은 Package 문이다. 그 후에 Import 문이 온다.
package java.awt;
import java.awt.peer.CanvasPeer;
3.1.3 Class와 Interface 선언
다음 표에서는 클래스 또는 인터페이스 선언의 부분을 나타나는 순서대로 설명한다.
순서 | 클래스/인터페이스 선언의 구성요소 | 설명 |
1 | 문서화 주석 (/** ... */) | 5.2의 문서화 주석(Documentation Comments) 절을 참고한다. |
2 | 클래스/인터페이스 문 | - |
3 | 구현 주석 (/* ... */) | 이 주석은 클래스/인터페이스 문서화 주석에 적합하지 않은 하나의 클래스/인터페이스에만 해당하는 정보들을 포함해야 한다. |
4 | 클래스(static) 변수 | public 클래스 변수들, protected 클래스 변수들, 그 다음에 private 클래스 변수들 순으로 나온다. |
5 | Instance 변수 | public 클래스 변수들, protected 클래스 변수들, 그 다음에 private 클래스 변수들 순으로 나온다. |
6 | 생성자 | - |
7 | 메서드 | 메서드들은 범위나 접근성을 기준으로 나누기 보다 기능별로 분류한다. 코드가 더 쉽게 읽히고 더 쉽게 이해되도록 하는데에 중점을 둔다. ex) private 클래스 메서드가 두 개의 public 메서드들 사이에 위치. |
4. 들여쓰기
4개의 빈칸(space)을 들여쓰기 단위로 사용한다. 들여쓰기의 정확한 구현(spaces vs. tabs)은 정해져 있지 않다. 탭은 정확히 8개의 space으로 설정해야 한다. (4개가 아니다!)
4.1 한 줄의 길이
한 줄에 80자 이상 쓰는 것은 대부분의 터미널(terminal)과 툴에서 잘 다룰 수 없기 때문에 사용을 지양한다.
Note: Examples for use in documentation should have a shorter line length—generally no more than 70 characters.
4.2 줄 바꾸기
하나의 식(expression)이 한 줄에 들어가지 않을 때에는, 다음과 같은 일반적인 원칙들에 따라 두 줄로 나눈다.
• 쉼표(,) 뒤에 나눈다.
• 연산자(operator) 앞에서 나눈다.
• 낮은 수준의 원칙보다 상위 수준의 원칙에 따라 두줄로 나눈다. (연산자 우선순위)
• 앞줄과 같은 수준의 새로운 식은 앞줄과 들여쓰기를 일치시킨다.
• 만약 위의 원칙들이 코드를 더 복잡하게 하거나 오른쪽 끝을 넘어간다면, 8개의 빈칸을 사용해 들여 쓴다.
다음은 메서드 호출을 끊는 예이다.
function(longExpression1, longExpression2, longExpression3,
longExpression4, longExpression5);
var = function1(longExpression1,
function2(longExpression2,
longExpression3));
다음은 산술식을 깨는 두 가지 예이다. 첫 번째가 더 선호된다. (괄호 밖에서 줄 바꿈, 상위 수준 조건에 )
longName1 = longName2 * (longName3 + longName4 - longName5)
+ 4 * longname6; // PREFER
longName1 = longName2 * (longName3 + longName4
- longName5) + 4 * longname6; // AVOID
다음은 메서드 선언을 들여쓰는 예제이다. 첫 번째는 일반적인 경우이다. 두 번째의 경우 일반적인 들여쓰기를 사용한다면 두번째 줄과 세 번째 줄을 들여 써야 하므로, 대신에 8개의 빈칸을 이용하여 들여쓴다.
//CONVENTIONAL INDENTATION
someMethod(int anArg, Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
// 너무 멀리 들여쓰는 것을 피하기 위해 8개의 빈 칸으로 들여쓴다.
private static synchronized horkingLongMethodName(int anArg,
Object anotherArg, String yetAnotherArg,
Object andStillAnother) {
...
}
일반적으로 메서드 본문이 시작할 때 4개의 빈칸을 사용하므로, 메서드 본문과 구분하기 위해서 줄을 나누는 경우의 들여쓰기는 일반적으로 8개의 빈 칸 원칙을 사용한다.
//DON’T USE THIS INDENTATION
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) { //BAD WRAPS
doSomethingAboutIt(); //MAKE THIS LINE EASY TO MISS
}
//USE THIS INDENTATION INSTEAD
if ((condition1 && condition2)
|| (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
//OR USE THIS
if ((condition1 && condition2) || (condition3 && condition4)
||!(condition5 && condition6)) {
doSomethingAboutIt();
}
다음은 삼항식(ternary expression)에서 사용 가능한 세 가지 방법이다.
alpha = (aLongBooleanExpression) ? beta : gamma;
alpha = (aLongBooleanExpression) ? beta
: gamma;
alpha = (aLongBooleanExpression)
? beta
: gamma;
5. 주석
자바 프로그램은 다음과 같은 두 가지 주석을 가진다.
- 구현 주석 (implementation comments)
구현 주석은 C++에서도 볼 수 있는 주석 처리이며, /*...*/ 및 //로 구분한다. 각각의 구현에 대한 추가적인 설명이 필요할 때, 또는 코드를 주석 처리할 때 사용할 수 있다.
- 문서화 주석 (documentation comments)
문서화 주석(doc 주석)은 Java 전용 주석이며, /** ... */ ...로 구분된다. javadoc 툴을 사용하면 문서화 주석을 HTML 파일로 자동 추출할 수 있다. 소스 코드가 없는 개발자들도 읽고 이해할 수 있도록, 실제 구현된 코드와는 상관이 없는 코드의 명세 사항(specification)을 포함한다.
주석은 코드에 대한 개요와 코드 자체만 가지고는 알 수 없는 추가적인 정보들을 제공하기 위해 사용되어야 한다. 그리고 프로그램을 읽는 것과 이해하는 것에 관계된 정보만을 포함하고 있어야 한다. 예를 들어 '패키지를 어떻게 만들 것인가?' 또는 '파일들을 어느 디렉토리에 위치시킬 것인가?'에 대한 정보는 주석에 포함되어서는 안 된다.
중요하거나 코드만으로는 명확하지 않은 프로그램 설계에 대한 추가 설명을 포함하는 것은 적절하지만, 코드상에 이미 표현되어 있는 '중복 정보'는 피해야 한다. 중복 주석을 작성하는 데에 시간을 허비해 계획된 시간 안에 프로그램을 완성하지 못하는 경우도 발생한다. 또한 일반적으로 코드가 계속 디벨롭되면서 더 이상 유효하지 않을 것 같은 정보들은 주석에서 제외하는 것이 낫다.
Note : 때때로 코드에 대한 주석이 많이 필요하다는건 코드의 품질이 좋지 않다는 것을 의미한다. 주석을 추가해야 한다고 느낄 때, 코드를 좀 더 명확하게 다시 작성하는 것을 고려해 보는 것이 좋다. 주석을 별표(*) 또는 다른 문자를 사용하여 그린 큰 사각형에 넣는 방법은 피한다. 주석은 form-feed(프린트 시 용지 바꿈)나 backspace와 같은 특수 문자를 포함해서는 안된다.
5.1 구현(implementation) 주석
프로그램은 다음과 같은 4가지 형식의 구현 주석을 포함할 수 있다.
5.1.1 블록(Block) 주석
블록 주석은 파일, 메서드, 자료구조, 알고리즘에 대한 설명을 제공할 때 사용된다. 블록 주석은 각각의 파일이 시작될 때와 메서드 전에 사용해야 한다. 또한 메서드 안에서와 같이 다른 장소에서 사용될 수도 있다. 이때 메서드 안에 존재하는 블록 주석은 주석이 설명하는 코드와 같은 단위로 들여 쓰기를 해야한다. 다른 코드들과 구분하기 위해서 처음 한 줄은 비우고 사용하며 첫 번째 줄을 제외한 각 줄의 시작 부분에 별표(*)가 있다.
/*
* Here is a block comment.
*/
Block comments can start with /*-, which is recognized by indent(1) as the beginning of a block comment that should not reformatted. Example:
/*
* Here is a block comment with some very special
* formatting that I want indent(1) to ignore.
*
* one
* two
* three
*/
5.1.2 한 줄(Single-Line) 주석
짧은 주석은 뒤따라 오는 코드와 같은 동일한 들여쓰기를 하는 한 줄로 작성할 수 있다. 만약 주석이 한 줄에 다 들어가지 않는다면, 블록 주석 형식을 따라야 한다. 한 줄 주석은 빈 줄로 시작되어야 한다.
if (condition) {
/* Handle the condition. */
...
}
5.1.3 꼬리(Trailing) 주석
아주 짧은 주석이 필요한 경우 코드와 같은 줄에 작성한다. 하지만 실제 코드와는 구분될 수 있도록 충분히 간격을 두어야 한다. 만약 코드 덩어리에 두 개 이상의 짧은 주석을 작성한다면, 모두 동일한 탭 간격으로 들여 써야 한다. 어셈블리 언어와 같이 실행 코드의 모든 줄에 꼬리 주석을 추가하는 스타일은 사용하지 않는 것이 좋다.
다음은 Java 코드로 된 꼬리 주석의 예이다.
if (a == 2) {
return TRUE; /* special case */
} else {
return isprime(a); /* works only for odd a */
}
5.1.4 줄 끝(End-Of-Line) 주석
주석 기호 // 는 새로운 줄로 주석을 작성할 때 사용되며 한 줄 모두 또는 일부분을 주석 처리해야 할 때 쓰인다. 긴 내용의 주석을 나타내기 위해 연속되는 여러 줄에 사용하는 것은 안되지만, 특정 코드의 일부분을 주석 처리하기 위해서 연속으로 사용하는 것은 허락된다.
if (foo > 1) {
// Do a double-flip.
...
}
else
return false; // Explain why here.
//if (bar > 1) {
//
// // Do a triple-flip.
// ...
//}
//else
// return false;
5.2 문서화(Documentation) 주석
Note : 여기에 나오는 주석들은 아래 "11장 1절 자바 소스 파일 예제"를 참고하기 바람.
For further details, see “How to Write Doc Comments for Javadoc” which includes information on the doc comment tags (@return, @param, @see) : http://java.sun.com/products/jdk/javadoc/writingdoccomments.html
For further details about doc comments and javadoc, see the javadoc home page at : http://java.sun.com/products/jdk/javadoc/
문서화 주석은 Java 클래스, 인터페이스, 생성자, 메서드 및 필드를 설명하기 위해 사용한다. 각 문서화 주석은 API당 하나의 코멘트로 주석 구분 기호 /**...*/ 안에 작성되며 선언 직전에 표시되어야 한다.
/**
* The Example class provides ...
*/
class Example { ...
처음 나오는 클래스와 인터페이스들은 들여 쓰지 않지만 그들의 멤버들은 들여 쓰기를 한다. 클래스 및 인터페이스에 대한 문서화 주석의 첫 번째 줄(/**)은 들여쓰기하지 않고, 그다음에 이어지는 문서화 주석 줄에는 별표를 수직으로 정렬되도록 각각 하나의 들여 쓰기를 한다. 생성자를 포함한 멤버들은 첫 줄에서는 4개의 빈칸을 들여 쓰기 하고, 그 이후에는 5개의 빈칸으로 들여 쓰기를 한다.
만약 클래스, 인터페이스, 변수 또는 메서드에 대한 어떤 정보를 제공하고 싶지만 문서화 주석이 어울리지 않는다고 생각된다면 클래스 선언 바로 후에 블록 주석 또는 한 줄(Single-Line) 주석을 사용한다. 예로 클래스의 구현에 대한 세부 사항들은 클래스에 대한 문서화 주석이 아니라, 클래스 선언문 뒤 블록 주석에 들어가야 한다.
자바는 문서화 주석을 주석 이후에 처음 나오는 선언문과 연결시키기 때문에 문서화 주석은 메서드 또는 생성자 구현 안에 위치해서는 안된다.
6. 선언
6.1 한 줄당 선언문의 수
한 줄에 하나의 선언문을 쓰는 것이 주석문 쓰는 것을 쉽게 해주기 때문에 한 줄에 하나의 선언문을 쓰는 것이 좋다.
int level; // indentation level
int size; // size of table
int level, size; // is preferred over
어떤 경우에도 변수와 함수가 같은 선에 선언되어서는 안 된다.
long dbaddr, getDbaddr(); // WRONG!
같은 줄에 서로 다른 타입을 선언하면 안 된다.
int foo, fooarray[]; //WRONG!
다음과 같이 타입과 변수 사이에 space가 아닌 tab(탭)을 사용할 수 있다.
int level; // indentation level
int size; // size of table
Object currentEntry; // currently selected table entry
6.2 배치
선언은 블록(블록은 보통 중괄호 { } 로 둘러쌓인 코드를 의미)의 시작 부분에 배치한다. 변수를 처음 사용할 때 변수를 선언할 경우, 코드 이동시 문제가 발생할 혼란을 야기할 수 있다.
void MyMethod() {
int int1; // beginning of method block
if (condition) {
int int2; // beginning of "if" block
...
}
}
for문 인덱스의 경우 예외로 반복문 내 선언을 허용한다!
for (int i = 0; i < maxLoops; i++) { ...
상위 영역에서의 선언를 숨기는 지역 선언은 피해야 한다. 예를 들어 다음과 같이 블록 안의 블록에서 동일한 변수 이름을 사용해 선언하는 것은 지양해야한다.
int count;
...
func() {
if (condition) {
int count; // AVOID!
...
}
...
}
6.3 초기화
지역 변수의 경우, 지역 변수를 선언할 때 초기화 하는 것이 좋다. 만약 변수의 초기값이 다른 계산에 의해서 결정되는 경우라면 변수를 선언할 때 초기화 하지 않아도 된다.
6.4 클래스와 인터페이스의 선언
자바 클래스와 인터페이스를 선언할 때는, 다음 3가지 원칙을 따르도록 한다.
• 메서드 이름과 그 메서드의 파라미터 리스트의 시작인 괄호 "(" 사이에는 빈 공간이 없어야 한다.
• 여는 중괄호 "{" 는 클래스/인터페이스/메서드 선언과 동일한 줄의 끝에 사용한다.
• 닫는 중괄호 "}" 는 여는 중괄호 "{" 후에 바로 나와야 하는 null 문의 경우를 제외하고는, 여는 문장과 동일한 들여쓰기를 하는 새로운 줄에서 사용한다.
class Sample extends Object {
int ivar1;
int ivar2;
Sample(int i, int j) {
ivar1 = i;
ivar2 = j;
}
int emptyMethod() {}
...
}
• 메서드들을 구분하기 위해 각 메서드들 사이에 한 줄을 비운다.
7. 문(Statements)
+ 문이란 실행가능한(executable) 최소의 독립적인 코드 조각을 말한다.
7.1 간단한 문
각각의 줄에는 최대한 하나의 문(statement)만 사용하도록 한다.
argv++; argc--; // AVOID!
특별한 이유가 없이 쉼표 연산자를 사용하여 여러 문을 그룹화하는 것은 지양한다.
if (err) {
Format.print(System.out, “error”), exit(1); //VERY WRONG!
}
7.2 복합문
복합문은 중괄호 "{ statements }" 로 둘러싸여진 문들의 리스트를 포함하는 문이다. 이 리스트에 포함될 수 있는 문들은 다음 원칙을 따른다.
• 둘러싸여진 문들은 복합문보다 한 단계 더 들여쓰기를 한다.
• 여는 중괄호 "{" 는 복합문을 시작하는 줄의 마지막에 위치해야 한다. 닫는 중괄호 "}" 는 새로운 줄에 써야하고, 복합문의 시작과 같은 들여쓰기 한다.
• 중괄호는 if-else 또는 문과 같은 제어 구조의 일부인 경우 중괄호들이 모든 문들(단 하나의 문일 경우에도)을 둘러싸는데 사용되어야 한다.(이는 중괄호를 닫는 것을 잊어버려 발생하는 버그들를 방지하고, 문을 추가할 때 도움을 준다).
7.3 return 문
값을 반환하는 return 문은 특별한 방법으로 더 확실한 return 값을 표현하는 경우 외에 괄호를 사용하지 않는 것이 좋다.
return;
return myDisk.size();
return (size ? size : defaultSize);
7.4 if, if-else, if else-if else 문
if-else 문을 사용할 때는 다음과 같이 작성한다.
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else if (condition) {
statements;
}
* if 문은 항상 중괄호를 사용한다. 다음과 같은 에러가 발생할 수 있는 상황은 피해야 한다.
if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
7.5 for 문
for 문은 다음과 같이 작성한다.
for (initialization; condition; update) {
statements;
}
빈 for 문(모든 작업이 initialization, condition, update 에서 완료되는)은 다음과 같은 형태를 가져야 한다.
for (initialization; condition; update);
for 문의 초기화 또는 업데이트 절에서 콤마(,) 연산자를 사용할 때는 변수를 세 개 이상 사용하지 않도록 한다. 만약 필요하다면, for 문 이전에 문을 분리시켜 사용(initialization절의 경우)하거나 for 문의 마지막에 문을 분리시켜 사용(update절의 경우)한다.
7.6 while 문
while 문은 다음과 같이 작성한다.
while (condition) {
statements;
}
빈 while 문은 다음과 같이 작성한다.
while (condition);
7.7 do-while 문
do-while 문은 다음과 같이 작성한다.
do {
statements;
} while (condition);
7.8 switch 문
switch 문은 다음과 같이 작성한다.
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
statements;
break;
case XYZ:
statements;
break;
default:
statements;
break;
}
모든 case를 수행해야 하는 경우에는 break 문을 사용하지 않으면 된다. 이러한 경우는 위의 예제 코드의 첫번째 case에서 볼 수 있다. 또한 모든 switch 문은 default case를 포함해야 한다. 위의 예제와 같이 어떤 경우에 default case에서 break는 중복적이지만, 이후에 또 다른 case가 추가되어질 경우 에러를 방지할 수 있다.
7.9 try-catch 문
try-catch 문은 다음과 같이 작성한다.
try {
statements;
} catch (ExceptionClass e) {
statements;
}
try-catch 문은 try 블록이 성공적으로 완료되든지, 아니면 중간에 에러가 발생하든지에 상관없이 실행되어야 하는 부분을 추가하기 위해서 finally 부분을 사용할 수 있다.
try {
statements;
} catch (ExceptionClass e) {
statements;
} finally {
statements;
}
8. 빈칸
8.1 한 줄 띄우기(Blank Lines)
한 줄을 띄우고 코드를 작성하면 논리적으로 관계가 있는 코드들을 쉽게 구분할 수 있기 때문에 코드의 가독성(readability)을 향상시킨다. 다음과 같은 경우에는 한 줄을 띄어서 코드를 작성한다.
• 메서드 간
• 메소드의 로컬 변수와 첫 번째 문 사이
• 블록(Block) 또는 한 줄(Single-Line) 주석 이전
• 가독성을 향상시키기 위한 메서드 내부의 논리적인 섹션들 사이
다음 상황에서는 항상 두 개의 빈 줄을 사용해야 한다.
• 소스 파일의 섹션들 사이
• 클래스 정의와 인터페이스 정의 사이
8.2 공백(Blank Spaces)
공백은 다음과 같은 경우에 사용한다.
• 괄호와 함께 나타나는 키워드는 공백으로 나누어야 한다.
while (true) {
...
}
메서드 이름과 메서드의 여는 괄호 사이에 공백이 사용되어서는 안 된다는 것을 명심하자. 이렇게 하는 것은 메서드 호출과 키워드를 구별하는데 도움을 준다.
• 공백은 인자(argument) 리스트에서 콤마 이후에 나타나야 한다.
• '.' 을 제외한 모든 이항(binary) 연산자는 연산수들과는 공백으로 분리되어야 한다. 공백은 단항 연산자(++ 혹은 --)의 경우에는 사용해서는 안 된다.
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
prints("size is " + foo + "\n");
• for 문에서 사용하는 세 개의 식(expression) 들은 공백으로 구분해서 나누어야 한다.
for (expr1; expr2; expr3)
• 변수의 타입을 변환하는 캐스트(cast)의 경우에는 공백으로 구분해야 한다.
myMethod((byte) aNum, (Object) x);
myMethod((int) (cp + 5), ((int) (i + 3)) + 1);
9. 명명(Naming) 규칙
명명 규칙을 사용하면 프로그램을 읽기 쉽게 만들어 더 이해하기 쉽게 만들어 준다. 또한 식별자의 기능(예: 상수, 패키지 또는 클래스)에 대한 정보를 제공하여 코드를 이해하는데 도움이 된다. 이 절에 소개된 명명 규칙의 식별자 타입은 다음 6가지이다.
9.1 Classes
• 클래스 이름은 명사여야 하며, 복합 단어일 경우 각 단어의 첫 글자는 대문자이어야 한다.
• 클래스 이름은 간단하고 명시적으로 작성해야 한다.
• 완전한 단어를 사용하고 두 문자어와 약어는 피하도록 한다(만약, 약어가 URL이나 HTML과 같이 더 넓고 많이 사용되고 있다면 약어를 사용하는 것도 괜찮다).
class Raster;
class ImageSprite;
9.2 Interfaces
• 인터페이스 이름도 클래스 이름과 같은 대문자 사용 규칙을 적용해야 한다.
interface RasterDelegate;
interface Storing;
9.3 Methods
• 메서드의 이름은 동사이어야 하며, 복합 단어일 경우 첫 단어는 소문자로 시작하고 그 이후에 나오는 단어의 첫 문자는 대문자로 사용해야 한다.
run();
runFast();
getBackground();
9.4 Variables
• 변수 이름의 첫 번째 문자는 소문자로 시작하고, 각각의 내부 단어의 첫 번째 문자는 대문자로 시작해야 한다.
• 이름은 짧지만 의미 있어야 하며 그 변수의 사용 의도를 알아낼 수 있도록 의미적이어야 한다. 한 문자로만 이루어진 변수 이름은 암시적으로만 사용하고 버릴 변수일 경우를 제외하고는 피해야 한다. 보통의 임시 변수들의 이름은 integer 일 경우에는 i, j, k, m, n을 사용하고, character 일 경우에는 c, d, e를 사용한다.
int i;
char *cp;
float myWidth;
9.5 Constants
• 클래스 상수로 선언된 변수들과 ANSI 상수들의 이름은 모두 대문자로 쓰고 각각의 단어는 언더바("_")로 분리 해야 한다.
• 디버깅을 쉽게 하기 위해서 ANSI 상수들의 사용은 자제하도록 한다.
static final int MIN_WIDTH = 4;
static final int MAX_WIDTH = 999;
static final int GET_THE_CPU = 1;
+ ANSI 상수란?
문서에서 언급된 ANSI 상수는 공식적인 명칭은 아닌것으로 보인다. 추측으로는 ANSI C(Standard C)에서 상수를 #define 문과 const 한정자를 사용하는 두 가지 방법으로 정의할 수있는데 이것에서 시작한 것이 아닌가하는...결론적으로 사용자가 정의한 상수들을 의미하는 건 맞는것 같다.
10. 좋은 프로그래밍 습관
10.1 인스턴스 변수와 클래스 변수를 외부 노출없이 대신 접근 제공
인스턴스 변수 또는 클래스 변수를 합당한 이유없이 public으로 선언하지 않는다. 인스턴스 변수들은 명시적으로 선언될 필요가 없는 경우가 많기 때문이다. 인스턴스 변수가 public으로 선언되는 것이 적절한 경우는 클래스 자체가 어떤 동작(behavior)을 가지지 않는 데이터 구조(data structure)일 경우이다. 만약 class 대신 struct를 사용해야 하는 경우라면(만약 Java가 struct를 지원한다면) class의 인스턴스 변수들을 public으로 선언하는 것이 적합하다.
10.2 클래스 변수와 클래스 메서드는 클래스 이름을 사용하여 호출
클래스(static) 변수 또는 클래스 메서드를 호출하기 위해서 객체를 사용하는 것을 피해야 한다. 대신에 클래스 이름을 사용한다.
classMethod(); //OK
AClass.classMethod(); //OK
anObject.classMethod(); //AVOID!
10.3 상수
숫자 상수(literals)는 카운트 값으로 for 루프에 나타나는 -1, 0, 1을 제외하고는 숫자 자체를 코드에 사용하지 않는다.
10.4 변수에 값을 할당할 때 주의할 것들
하나의 문(statement)에서 같은 값을 여러 개의 변수들에 할당하지 않는다.(이렇게 하면 읽기가 어렵게 된다.)
fooBar.fChar = barFoo.lchar = 'c'; // AVOID!
비교 연산자(==)와 혼동되기 쉬운 곳에 할당 연산자(=)를 사용하지 않는다.
if (c++ = d++) { // AVOID! Java disallows
...
}
if ((c++ = d++) != 0) { // should be written as
...
}
실행시 성능 향상을 위해서 할당문(assignment statement)안에 또 다른 할당문을 사용하지 않는다.
d = (a = b + c) + r; // AVOID!
// should be written as
a = b + c;
d = a + r;
10.5 그 외 신경써야 할 것들
10.5.1 괄호
연산자 우선순위 문제를 피하기 위해 복합 연산자를 포함하는 경우에는 자유롭게 괄호를 사용하는 것이 좋다. 작성자는 연산자 우선 순위를 확실하게 알고 있다고 할지라도, 다른 프로그래머에게는 생소할 수 있다는 것을 주의한다.
if (a == b && c == d) // AVOID!
if ((a == b) && (c == d)) // RIGHT
10.5.2 반환 값 (Returning Values)
프로그램의 구조와 목적이 일치해야 한다.
if (booleanExpression) {
return TRUE;
} else {
return FALSE;
}
// should instead be written as
return booleanExpression;
// Similarly,
if (condition) {
return x;
}
return y;
// should be written as
return (condition ? x : y);
10.5.3 조건 연산자 '?' 이전에 나오는 식(expression)
삼항 연산자(?:) 에서 '?' 이전에 이항 연산자를 포함하는 식(expression)이 있는 경우에는 꼭 괄호를 사용한다.
(x >= 0) ? x : -x
10.5.4 Special Comments
Use XXX in a comment to flag something that is bogus but works. Use FIXME to flag something
that is bogus and broken.
11 Code Examples
11.1 Java Source File Example
다음 예제는 하나의 public class를 가지는 소스 파일을 어떻게 수정하는지 부여준다.
* 자바에서 사용하는 interface도 비슷하게 구성된다.
/*
* %W% %E% Firstname Lastname
*
* Copyright (c) 1993-1996 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("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 Sun.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF
* THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR
* ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
* DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
*/
package java.blah;
import java.blah.blahdy.BlahBlah;
/**
* Class description goes here.
*
* @version 1.10 04 Oct 1996
* @author Firstname Lastname
*/
public class Blah extends SomeClass {
/* A class implementation comment can go here. */
/** classVar1 documentation comment */
public static int classVar1;
/*** classVar2 documentation comment that happens to be
* more than one line long
*/
private static Object classVar2;
/** instanceVar1 documentation comment */
public Object instanceVar1;
/** instanceVar2 documentation comment */
protected int instanceVar2;
/** instanceVar3 documentation comment */
private Object[] instanceVar3;
11 - Code Examples
20
/**
* ...method Blah documentation comment...
*/
public Blah() {
// ...implementation goes here...
}
/**
* ...method doSomething documentation comment...
*/
public void doSomething() {
// ...implementation goes here...
}
/**
* ...method doSomethingElse documentation comment...
* @param someParam description
*/
public void doSomethingElse(Object someParam) {
// ...implementation goes here...
}
}
[참고자료]
감사합니다.
공부한 내용을 복습/기록하기 위해 작성한 글이므로 내용에 오류가 있을 수 있습니다.
'JAVA' 카테고리의 다른 글
[JAVA] 프로그래머스 : 문자열을 정수로 바꾸기 (feat. parseInt) (1) | 2023.06.06 |
---|