문서의 선택한 두 판 사이의 차이를 보여줍니다.
namerule [2014/05/08 15:58] minetech |
namerule [2014/05/08 16:33] (현재) minetech |
||
---|---|---|---|
줄 1: | 줄 1: | ||
- 네이밍 관례와 표준 | - 네이밍 관례와 표준 | ||
이 문서 전반에 걸쳐 파스칼표기법과 카멜 표기법이 사용된다. | 이 문서 전반에 걸쳐 파스칼표기법과 카멜 표기법이 사용된다. | ||
+ | |||
파스칼 표기법 - 모든 단어에서 첫번째 문자가 대문자이며 나머지는 소문자이다. | 파스칼 표기법 - 모든 단어에서 첫번째 문자가 대문자이며 나머지는 소문자이다. | ||
+ | <file> | ||
예: BackColor | 예: BackColor | ||
+ | </file> | ||
+ | |||
카멜 표기법 - 최초에 사용된 단어를 제외한 첫번째 문자가 대문자이며 나머지는 소문자이다. | 카멜 표기법 - 최초에 사용된 단어를 제외한 첫번째 문자가 대문자이며 나머지는 소문자이다. | ||
+ | <file> | ||
예: backColor | 예: backColor | ||
+ | </file> | ||
1. 클래스 명에는 파스칼 표기법을 사용한다. | 1. 클래스 명에는 파스칼 표기법을 사용한다. | ||
+ | <file> | ||
public class HelloWorld | public class HelloWorld | ||
{ | { | ||
... | ... | ||
} | } | ||
+ | </file> | ||
2. 함수(Method) 명에는 파스칼 표기법을 사용한다. | 2. 함수(Method) 명에는 파스칼 표기법을 사용한다. | ||
+ | <file> | ||
void SayHello(string name) | void SayHello(string name) | ||
{ | { | ||
... | ... | ||
} | } | ||
+ | </file> | ||
3. 변수와 함수 파라미터에는 카멜표기법을 사용한다. | 3. 변수와 함수 파라미터에는 카멜표기법을 사용한다. | ||
+ | <file> | ||
int totalCount = 0; | int totalCount = 0; | ||
void SayHello(string name) | void SayHello(string name) | ||
줄 25: | 줄 36: | ||
... | ... | ||
} | } | ||
+ | </file> | ||
4. 인터페이스에는 접두사 "I"가 포함된 파스칼표기법에 따른다. ( Example: IEntity ) | 4. 인터페이스에는 접두사 "I"가 포함된 파스칼표기법에 따른다. ( Example: IEntity ) | ||
5. 변수명에 헝가리안 표기법을 사용하지 않는다. 이전에는 많은 프로그래머들이 변수명에 데이타 타입에 해당하는 접두사를 첨가하겨 맴버변수에는 m_을 접두사로 사용하는 헝가리안 표기법을 사용했다. | 5. 변수명에 헝가리안 표기법을 사용하지 않는다. 이전에는 많은 프로그래머들이 변수명에 데이타 타입에 해당하는 접두사를 첨가하겨 맴버변수에는 m_을 접두사로 사용하는 헝가리안 표기법을 사용했다. | ||
+ | <file> | ||
string m_sName; | string m_sName; | ||
int nAge; | int nAge; | ||
+ | </file> | ||
그러나 닷넷 코딩 표준에서 헝가리안 표기법은 추천하지 않는다. 데이타 타입을 사용하는 것과 멤버 변수를 표현하기 위한 m_ 은 사용해서는 안된다. 모든 변수는 카멜 표기법을 사용해야 한다. 몇몇 프로그래머들은 아직 m_를 붙이거나 데이타 타입을 표시하는 것을 더 좋아하겠지만, 이제 이것들은 멤버 변수를 확인하기위한 쉬운 방법이 아니다. | 그러나 닷넷 코딩 표준에서 헝가리안 표기법은 추천하지 않는다. 데이타 타입을 사용하는 것과 멤버 변수를 표현하기 위한 m_ 은 사용해서는 안된다. 모든 변수는 카멜 표기법을 사용해야 한다. 몇몇 프로그래머들은 아직 m_를 붙이거나 데이타 타입을 표시하는 것을 더 좋아하겠지만, 이제 이것들은 멤버 변수를 확인하기위한 쉬운 방법이 아니다. | ||
6. 변수에 모든 의미를 충분히 담아라. 약어를 사용하지 말것. | 6. 변수에 모든 의미를 충분히 담아라. 약어를 사용하지 말것. | ||
+ | |||
좋은 예: | 좋은 예: | ||
+ | <file> | ||
string address | string address | ||
int salary | int salary | ||
+ | </file> | ||
나쁜 예: | 나쁜 예: | ||
+ | <file> | ||
string nam | string nam | ||
string addr | string addr | ||
int sal | int sal | ||
+ | </file> | ||
7. i, n, s 같이 한글자로 된 이름을 사용하지 말것. index, temp 같은 이름을 사용할 것. | 7. i, n, s 같이 한글자로 된 이름을 사용하지 말것. index, temp 같은 이름을 사용할 것. | ||
한가지 예외가 있다면 루프에서 반복을 의미하는 변수를 하용하는 경우이다. | 한가지 예외가 있다면 루프에서 반복을 의미하는 변수를 하용하는 경우이다. | ||
+ | <file> | ||
for ( int i = 0; i < count; i++ ) | for ( int i = 0; i < count; i++ ) | ||
{ | { | ||
... | ... | ||
} | } | ||
+ | </file> | ||
만일 변수가 단지 반복을 위한 카운터로만 사용된다면 그리고 그것이 루프안에 있는 다른 어떤 곳에서도 사용되지 않는다면, 많은 사람들은 아직까지 다른 적합한 단어는 만들어서 사용하는 것보다 i를 사용하는 것을 선호한다. | 만일 변수가 단지 반복을 위한 카운터로만 사용된다면 그리고 그것이 루프안에 있는 다른 어떤 곳에서도 사용되지 않는다면, 많은 사람들은 아직까지 다른 적합한 단어는 만들어서 사용하는 것보다 i를 사용하는 것을 선호한다. | ||
줄 58: | 줄 79: | ||
11. boolean 이 들어가는 변수, 속성, 함수(method)등은 "is" 또는 유사한 접두사를 사용한다. | 11. boolean 이 들어가는 변수, 속성, 함수(method)등은 "is" 또는 유사한 접두사를 사용한다. | ||
+ | |||
+ | <file> | ||
예: private bool _isFinished | 예: private bool _isFinished | ||
+ | </file> | ||
12. 네임스페이스 명은 표준 패턴을 따라야 한다. | 12. 네임스페이스 명은 표준 패턴을 따라야 한다. | ||
+ | <file> | ||
<회사명>.<제품명>.<최상위모듈>.<하위모듈> | <회사명>.<제품명>.<최상위모듈>.<하위모듈> | ||
+ | </file> | ||
13. UI 구성요소를 위하여 적당한 접두사를 사용해야 한다. 그래서 다른 변수들과 구분할 수 있어야 한다. | 13. UI 구성요소를 위하여 적당한 접두사를 사용해야 한다. 그래서 다른 변수들과 구분할 수 있어야 한다. | ||
+ | |||
여기 추천하는 서로 다른 두 가지 방식이 있다. | 여기 추천하는 서로 다른 두 가지 방식이 있다. | ||
a. 모든 UI 구성요소를 위하여 공통적인 접두사(ui_)를 사용하는 것이다. 이것은 모든 UI 구성요소를 묶는데 도움을 줄 것이고 쉽게 이해하고 접근하게 할 것이다. | a. 모든 UI 구성요소를 위하여 공통적인 접두사(ui_)를 사용하는 것이다. 이것은 모든 UI 구성요소를 묶는데 도움을 줄 것이고 쉽게 이해하고 접근하게 할 것이다. | ||
+ | |||
b. 각각의 UI 구성요소마다 접두사를 적용하는 방법. 간단한 목록이 아래에 있다. 닷넷은 다양한 컨트롤들이 제공되므로 더 많은 컨트롤(써드파티 컨트롤을 포함한)에 대한 표준을 정의해야 한다. | b. 각각의 UI 구성요소마다 접두사를 적용하는 방법. 간단한 목록이 아래에 있다. 닷넷은 다양한 컨트롤들이 제공되므로 더 많은 컨트롤(써드파티 컨트롤을 포함한)에 대한 표준을 정의해야 한다. | ||
줄 82: | 줄 110: | ||
14. 파일명은 클래스 명과 같아야 한다. | 14. 파일명은 클래스 명과 같아야 한다. | ||
+ | |||
예를 들어, 클래스 명이 "HelloWorld" 라면 파일명은 "HelloWorld.cs" 이어야 한다. | 예를 들어, 클래스 명이 "HelloWorld" 라면 파일명은 "HelloWorld.cs" 이어야 한다. | ||
줄 87: | 줄 116: | ||
메서드나 함수 이름은 반드시 동사이면서 소문자로 시작해 대소문자를 섞어 써야 한다. | 메서드나 함수 이름은 반드시 동사이면서 소문자로 시작해 대소문자를 섞어 써야 한다. | ||
+ | <file> | ||
getName(), computeTotalWidth() | getName(), computeTotalWidth() | ||
+ | </file> | ||
C++ 개발 커뮤니티에서 일반적인 용례이다. 이 형식은 변수 이름과 같지만 C++에서 함수는 형식상 변수와 이미 구별된다. | C++ 개발 커뮤니티에서 일반적인 용례이다. 이 형식은 변수 이름과 같지만 C++에서 함수는 형식상 변수와 이미 구별된다. | ||
약어와 동의어를 이름으로 사용할 때는 반드시 대문자가 아니어야 한다. | 약어와 동의어를 이름으로 사용할 때는 반드시 대문자가 아니어야 한다. | ||
+ | <file> | ||
exportHtmlSource(); // 아님: exportHTMLSource(); | exportHtmlSource(); // 아님: exportHTMLSource(); | ||
openDvdPlayer(); // 아님: openDVDPlayer(); | openDvdPlayer(); // 아님: openDVDPlayer(); | ||
+ | </file> | ||
+ | |||
기본 이름에 대해 모두 대문자를 사용하면 위에서 제시한 명명 규칙과 충돌한다. 이런 종류의 변수는 dVD, hTML 등으로 이름 지어야 하나 분명 가독성이 매우 나쁘다. 위 예에서 보여준 다른 문제는 이런 이름을 다른 것과 붙여 사용할 때 가독성이 심각하게 나빠진다는 점이다. 즉, 약어 다음에 오는 단어가 원하는 만큼 돋보이지 않게 된다. | 기본 이름에 대해 모두 대문자를 사용하면 위에서 제시한 명명 규칙과 충돌한다. 이런 종류의 변수는 dVD, hTML 등으로 이름 지어야 하나 분명 가독성이 매우 나쁘다. 위 예에서 보여준 다른 문제는 이런 이름을 다른 것과 붙여 사용할 때 가독성이 심각하게 나빠진다는 점이다. 즉, 약어 다음에 오는 단어가 원하는 만큼 돋보이지 않게 된다. | ||
줄 99: | 줄 133: | ||
16. get/set은 반드시 속성(attribute)에 직접 접근할 때 사용해야 한다. | 16. get/set은 반드시 속성(attribute)에 직접 접근할 때 사용해야 한다. | ||
+ | <file> | ||
employee.getName(); | employee.getName(); | ||
employee.setName(name); | employee.setName(name); | ||
줄 104: | 줄 139: | ||
matrix.getElement(2, 4); | matrix.getElement(2, 4); | ||
matrix.setElement(2, 4, value); | matrix.setElement(2, 4, value); | ||
+ | </file> | ||
C++ 개발 커뮤니티에서 일반적인 용례이며, 자바에서는 거의 표준이 되었다. | C++ 개발 커뮤니티에서 일반적인 용례이며, 자바에서는 거의 표준이 되었다. | ||
17. compute는 무언가 계산하는 메서드에서 사용한다. | 17. compute는 무언가 계산하는 메서드에서 사용한다. | ||
+ | <file> | ||
valueSet->computeAverage(); | valueSet->computeAverage(); | ||
matrix->computeInverse(); | matrix->computeInverse(); | ||
+ | </file> | ||
이 것은 시간을 소비할 수 있는 연산이라는 것을 즉시 알아챌 수 있는 단서를 제공해 반복해서 사용한다면 결과를 따로 저장해 두는 것을 고려하도록 할 수 있다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | 이 것은 시간을 소비할 수 있는 연산이라는 것을 즉시 알아챌 수 있는 단서를 제공해 반복해서 사용한다면 결과를 따로 저장해 두는 것을 고려하도록 할 수 있다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | ||
18. find는 무언가 찾는 메서드에서 사용한다. | 18. find는 무언가 찾는 메서드에서 사용한다. | ||
+ | <file> | ||
vertex.findNearestVertex(); | vertex.findNearestVertex(); | ||
matrix.findMinElement(); | matrix.findMinElement(); | ||
+ | </file> | ||
최소한의 계산이 포함된, 간단한 검색 메서드라는 것을 즉시 알아챌 수 있는 단서를 다른 개발자에게 제공한다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | 최소한의 계산이 포함된, 간단한 검색 메서드라는 것을 즉시 알아챌 수 있는 단서를 다른 개발자에게 제공한다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | ||
19. initialize는 객체 또는 개념을 만들 때 사용한다. | 19. initialize는 객체 또는 개념을 만들 때 사용한다. | ||
+ | |||
printer.initializeFontSet(); | printer.initializeFontSet(); | ||
영국어 initialise보다 미국어 initialize를 사용해야 하며, 약어 init는 피해야 한다. | 영국어 initialise보다 미국어 initialize를 사용해야 하며, 약어 init는 피해야 한다. | ||
20. GUI 요소(component)를 나타내는 변수는 해당 요소 타입 이름을 접미어로 사용해야 한다. | 20. GUI 요소(component)를 나타내는 변수는 해당 요소 타입 이름을 접미어로 사용해야 한다. | ||
+ | <file> | ||
mainWindow, propertiesDialog, widthScale, loginText, | mainWindow, propertiesDialog, widthScale, loginText, | ||
leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle 등. | leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle 등. | ||
+ | </file> | ||
해당 변수 타입을 통해 리소스 객체를 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | 해당 변수 타입을 통해 리소스 객체를 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | ||
21. 복수형은 객체 모음(collection)을 나타내는 이름에 사용해야 한다. | 21. 복수형은 객체 모음(collection)을 나타내는 이름에 사용해야 한다. | ||
+ | <file> | ||
vector<Point> point; | vector<Point> point; | ||
int values[]; | int values[]; | ||
+ | </file> | ||
변수 타입과 더불어 해당 요소에 수행할 수 있는 연산을 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | 변수 타입과 더불어 해당 요소에 수행할 수 있는 연산을 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | ||
줄 139: | 줄 184: | ||
24. 반복자 변수는 i, j, k 등으로 호출해야 한다. | 24. 반복자 변수는 i, j, k 등으로 호출해야 한다. | ||
+ | <file> | ||
for (int i = 0; i < nTables; i++) { | for (int i = 0; i < nTables; i++) { | ||
: | : | ||
줄 147: | 줄 193: | ||
... | ... | ||
} | } | ||
+ | </file> | ||
반복자를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. 변수 이름으로 j, k 등은 중첩 루프에서만 사용해야 한다. (옮긴이 주: 이 표기법은 되도록 간단한 루프에서만 사용하고 복잡하거나 긴 루프에서는 의미있는 이름을 사용하는 게 좋다.) | 반복자를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. 변수 이름으로 j, k 등은 중첩 루프에서만 사용해야 한다. (옮긴이 주: 이 표기법은 되도록 간단한 루프에서만 사용하고 복잡하거나 긴 루프에서는 의미있는 이름을 사용하는 게 좋다.) | ||
줄 154: | 줄 201: | ||
다음은 상황에 따라 접두어 is보다 더 나은 방법 몇 가지로 has, can 그리고 should 접두어를 사용한다. | 다음은 상황에 따라 접두어 is보다 더 나은 방법 몇 가지로 has, can 그리고 should 접두어를 사용한다. | ||
+ | <file> | ||
bool hasLicense(); | bool hasLicense(); | ||
bool canEvaluate(); | bool canEvaluate(); | ||
bool shouldSort(); | bool shouldSort(); | ||
+ | </file> | ||
26. 반의어는 반드시 대응하는 연산에 대해 사용해야 한다[1]. | 26. 반의어는 반드시 대응하는 연산에 대해 사용해야 한다[1]. | ||
+ | <file> | ||
get/set, add/remove, create/destroy, start/stop, insert/delete, | get/set, add/remove, create/destroy, start/stop, insert/delete, | ||
increment/decrement, old/new, begin/end, first/last, up/down, min/max, | increment/decrement, old/new, begin/end, first/last, up/down, min/max, | ||
next/previous, open/close, show/hide, suspend/resume, etc. | next/previous, open/close, show/hide, suspend/resume, etc. | ||
+ | </file> | ||
대칭 관계를 통해 복잡성을 낮출 수 있다. | 대칭 관계를 통해 복잡성을 낮출 수 있다. | ||
27. 이름에 약어는 피해야 한다. | 27. 이름에 약어는 피해야 한다. | ||
+ | <file> | ||
computeAverage(); // 아님: compAvg();// | computeAverage(); // 아님: compAvg();// | ||
+ | </file> | ||
두 가지 단어 종류를 생각해야 하는데, 첫 번째는 사전에 있는 일반 단어이며 절대 약어로 쓰면 안 된다. 즉, 절대 다음처럼 쓰지 않는다. | 두 가지 단어 종류를 생각해야 하는데, 첫 번째는 사전에 있는 일반 단어이며 절대 약어로 쓰면 안 된다. 즉, 절대 다음처럼 쓰지 않는다. | ||
+ | <file> | ||
command 대신 cmd | command 대신 cmd | ||
copy 대신 cp | copy 대신 cp | ||
줄 173: | 줄 226: | ||
compute 대신 comp | compute 대신 comp | ||
initialize 대신 init | initialize 대신 init | ||
+ | </file> | ||
등. | 등. | ||
그에 반해 약어/두문자어가 더 자연스런 특정 분야의 관용구는 약어 형태를 유지해야 하며, 절대 다음처럼 쓰지 않는다. | 그에 반해 약어/두문자어가 더 자연스런 특정 분야의 관용구는 약어 형태를 유지해야 하며, 절대 다음처럼 쓰지 않는다. | ||
+ | <file> | ||
html 대신 HypertextMarkupLanguage | html 대신 HypertextMarkupLanguage | ||
cpu 대신 CentralProcessingUnit | cpu 대신 CentralProcessingUnit | ||
pe 대신 PriceEarningRatio | pe 대신 PriceEarningRatio | ||
+ | </file> | ||
등. | 등. | ||
28. 포인터를 이름에 사용하는 것은 특히 피해야 한다. | 28. 포인터를 이름에 사용하는 것은 특히 피해야 한다. | ||
+ | <file> | ||
Line* line; // 아님: Line* pLine; // | Line* line; // 아님: Line* pLine; // | ||
// 아님: Line* linePtr;// | // 아님: Line* linePtr;// | ||
+ | </file> | ||
C/C++ 환경에서 많은 변수가 포인터이므로 이와 같은 관례는 따르기가 거의 불가능하다. 또한 C++에서 객체는 흔히, 프로그래머가 특정 구현 내용을 무시할 수 있는 간접 타입이다. 포인터를 이름에 사용할 때는 객체의 실제 타입이 특별히 중요할 때에 한해 해당 타입을 강조하기 위해서이다. | C/C++ 환경에서 많은 변수가 포인터이므로 이와 같은 관례는 따르기가 거의 불가능하다. 또한 C++에서 객체는 흔히, 프로그래머가 특정 구현 내용을 무시할 수 있는 간접 타입이다. 포인터를 이름에 사용할 때는 객체의 실제 타입이 특별히 중요할 때에 한해 해당 타입을 강조하기 위해서이다. | ||
29. 부정적인(negated) 불린 변수 이름은 반드시 피해야 한다. | 29. 부정적인(negated) 불린 변수 이름은 반드시 피해야 한다. | ||
+ | <file> | ||
bool isError; // 아님: isNoError | bool isError; // 아님: isNoError | ||
bool isFound; // 아님: isNotFound | bool isFound; // 아님: isNotFound | ||
+ | </file> | ||
문제는 이런 이름을 논리 부정 연산자와 함께 사용할 때 이중 부정을 통해 결과가 만들어지므로 생긴다. !isNotFound 의 의미를 즉시 명확하게 알아차릴 수 없다. | 문제는 이런 이름을 논리 부정 연산자와 함께 사용할 때 이중 부정을 통해 결과가 만들어지므로 생긴다. !isNotFound 의 의미를 즉시 명확하게 알아차릴 수 없다. | ||
30. 열거 상수는 공통 타입 이름을 접두어로 붙인다. | 30. 열거 상수는 공통 타입 이름을 접두어로 붙인다. | ||
+ | <file> | ||
enum Color { | enum Color { | ||
COLOR_RED, | COLOR_RED, | ||
줄 198: | 줄 259: | ||
COLOR_BLUE, | COLOR_BLUE, | ||
}; | }; | ||
+ | </file> | ||
이러한 것은 해당 선언을 어디에서 찾을 수 있는지, 어느 상수가 함께 속한 것인지, 그리고 그 상수가 어떤 개념을 나타내는지 등 추가 정보를 제공한다. 다른 방법은 Color: : RED, Airline: : AIR_FRANCE 등과 같이 항상 공통 타입을 통해 해당 상수를 참조하는 것이다. | 이러한 것은 해당 선언을 어디에서 찾을 수 있는지, 어느 상수가 함께 속한 것인지, 그리고 그 상수가 어떤 개념을 나타내는지 등 추가 정보를 제공한다. 다른 방법은 Color: : RED, Airline: : AIR_FRANCE 등과 같이 항상 공통 타입을 통해 해당 상수를 참조하는 것이다. | ||
31. 예외 클래스는 Exception 접미어를 붙여야 한다. | 31. 예외 클래스는 Exception 접미어를 붙여야 한다. | ||
+ | <file> | ||
class AccessException | class AccessException | ||
{ | { | ||
: | : | ||
} | } | ||
+ | </file> | ||
예외 클래스는 실제 해당 프로그램의 주된 설계 부분이 아니며(옮긴이 주: 프로그램에서 주된 처리 로직이 아니라는 뜻), 이와 같이 이름을 붙이면 다른 클래스와 상대적으로 구별된다. | 예외 클래스는 실제 해당 프로그램의 주된 설계 부분이 아니며(옮긴이 주: 프로그램에서 주된 처리 로직이 아니라는 뜻), 이와 같이 이름을 붙이면 다른 클래스와 상대적으로 구별된다. | ||
줄 215: | 줄 279: | ||
2. 주선은 코드와 같은 레벨에 있어야 한다(들여쓰기의 레벨을 같이 사용한다.). | 2. 주선은 코드와 같은 레벨에 있어야 한다(들여쓰기의 레벨을 같이 사용한다.). | ||
+ | |||
좋은 예: | 좋은 예: | ||
+ | <file> | ||
// Format a message and display// | // Format a message and display// | ||
string fullMessage = "Hello " + name; | string fullMessage = "Hello " + name; | ||
줄 221: | 줄 287: | ||
string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); | string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); | ||
MessageBox.Show ( message ); | MessageBox.Show ( message ); | ||
+ | </file> | ||
좋지 않은 예: | 좋지 않은 예: | ||
+ | <file> | ||
// Format a message and display// | // Format a message and display// | ||
string fullMessage = "Hello " + name; | string fullMessage = "Hello " + name; | ||
줄 228: | 줄 296: | ||
string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); | string message = fullMessage + ", the time is : " + currentTime.ToShortTimeString(); | ||
MessageBox.Show ( message ); | MessageBox.Show ( message ); | ||
+ | </file> | ||
3. 중괄호는 중괄호 밖에 있는 코드와 같은 레벨에 있어야 한다. | 3. 중괄호는 중괄호 밖에 있는 코드와 같은 레벨에 있어야 한다. | ||
4. 논리적인 코드 그룹은 빈 줄 하나로 구분해야 한다. | 4. 논리적인 코드 그룹은 빈 줄 하나로 구분해야 한다. | ||
+ | |||
좋은 예: | 좋은 예: | ||
+ | <file> | ||
bool SayHello ( string name ) | bool SayHello ( string name ) | ||
{ | { | ||
줄 249: | 줄 320: | ||
return true; | return true; | ||
} | } | ||
+ | </file> | ||
안 좋은 예: | 안 좋은 예: | ||
+ | <file> | ||
bool SayHello (string name) | bool SayHello (string name) | ||
{ | { | ||
줄 265: | 줄 338: | ||
return true; | return true; | ||
} | } | ||
+ | </file> | ||
5. There should be one and only one single blank line between each method inside the class. | 5. There should be one and only one single blank line between each method inside the class. | ||
6. 중괄호는 다른 라인과 분리되어 있어야하며 라인을 같이 쓰면 안된다. | 6. 중괄호는 다른 라인과 분리되어 있어야하며 라인을 같이 쓰면 안된다. | ||
+ | |||
좋은 예: | 좋은 예: | ||
+ | <file> | ||
if ( ... ) | if ( ... ) | ||
{ | { | ||
// Do something// | // Do something// | ||
} | } | ||
+ | </file> | ||
안 좋은 예: | 안 좋은 예: | ||
+ | <file> | ||
if ( ... ) { | if ( ... ) { | ||
// Do something// | // Do something// | ||
} | } | ||
+ | </file> | ||
7. 지시자(operator)와 괄호 앞뒤로는 한 칸의 공간을 남긴다. | 7. 지시자(operator)와 괄호 앞뒤로는 한 칸의 공간을 남긴다. | ||
+ | |||
좋은 예: | 좋은 예: | ||
+ | <file> | ||
if ( showResult == true ) | if ( showResult == true ) | ||
{ | { | ||
줄 289: | 줄 370: | ||
} | } | ||
} | } | ||
+ | </file> | ||
나쁜 예: | 나쁜 예: | ||
+ | <file> | ||
if(showResult==true) | if(showResult==true) | ||
{ | { | ||
줄 298: | 줄 381: | ||
} | } | ||
} | } | ||
+ | </file> | ||
8. 연관된 코드를 묶을때는 #region을 사용해라. #region을 사용해서 묶는다면 그 페이지는 훨씬 간략해질 것이다. | 8. 연관된 코드를 묶을때는 #region을 사용해라. #region을 사용해서 묶는다면 그 페이지는 훨씬 간략해질 것이다. | ||
줄 304: | 줄 388: | ||
switch 문은 다음 형식이어야 한다. | switch 문은 다음 형식이어야 한다. | ||
+ | <file> | ||
switch (condition) { | switch (condition) { | ||
case ABC : | case ABC : | ||
줄 321: | 줄 406: | ||
break; | break; | ||
} | } | ||
+ | </file> | ||
각 case 키워드를 전체 switch 문에 대해 들여쓰기한다는 점에 주의한다. 이를 통해 전체 switch 문을 두드러지게 한다. 또한 : 문자 앞에 있는 여분의 빈칸에 주의한다. case 문에 break 문이 없으면 항상 명시적으로 '지나감'이라고 주석을 달아야 한다. break 문이 없는 것은 일반적인 오류이므로, 사용하지 않을 때는 의도적이라는 것을 명확히 해야 한다. | 각 case 키워드를 전체 switch 문에 대해 들여쓰기한다는 점에 주의한다. 이를 통해 전체 switch 문을 두드러지게 한다. 또한 : 문자 앞에 있는 여분의 빈칸에 주의한다. case 문에 break 문이 없으면 항상 명시적으로 '지나감'이라고 주석을 달아야 한다. break 문이 없는 것은 일반적인 오류이므로, 사용하지 않을 때는 의도적이라는 것을 명확히 해야 한다. | ||
줄 326: | 줄 412: | ||
do-while 문은 다음 형식이어야 한다. | do-while 문은 다음 형식이어야 한다. | ||
+ | <file> | ||
do { | do { | ||
statements; | statements; | ||
} while (condition); | } while (condition); | ||
+ | </file> | ||
이 형식은 위에서 제시한 일반 구역 규칙을 따른다. | 이 형식은 위에서 제시한 일반 구역 규칙을 따른다. | ||
기본 들여쓰기는 2로 해야 한다. | 기본 들여쓰기는 2로 해야 한다. | ||
+ | <file> | ||
for (i = 0; i < nElements; i++) | for (i = 0; i < nElements; i++) | ||
a[i] = 0; | a[i] = 0; | ||
+ | </file> | ||
들여쓰기를 1로 하면 코드의 논리적 레이아웃을 강조하기엔 작고, 4보다 크면 많은 단계로 중첩한 코드가 읽기 어려울 뿐만 아니라 줄을 나눠야 할 가능성도 커진다. 들여쓰기는 2, 3 그리고 4 중에서 선택하는 것이 일반적이며 2를 선택해 코드를 나눌 기회를 줄인다. (역자주: 개인적으로 2보다는 4가 구분하기 더 좋고 일반적으로 가장 많이 쓰는 형태가 아닐까 생각한다. 또한 깊게 중첩한 코드는 피하는 게 좋다.) | 들여쓰기를 1로 하면 코드의 논리적 레이아웃을 강조하기엔 작고, 4보다 크면 많은 단계로 중첩한 코드가 읽기 어려울 뿐만 아니라 줄을 나눠야 할 가능성도 커진다. 들여쓰기는 2, 3 그리고 4 중에서 선택하는 것이 일반적이며 2를 선택해 코드를 나눌 기회를 줄인다. (역자주: 개인적으로 2보다는 4가 구분하기 더 좋고 일반적으로 가장 많이 쓰는 형태가 아닐까 생각한다. 또한 깊게 중첩한 코드는 피하는 게 좋다.) | ||
while 문은 다음 형식이어야 한다. | while 문은 다음 형식이어야 한다. | ||
+ | <file> | ||
while (condition) { | while (condition) { | ||
statements; | statements; | ||
} | } | ||
+ | </file> | ||
이 형식은 위에서 제시한 일반 구역 규칙을 따른다. | 이 형식은 위에서 제시한 일반 구역 규칙을 따른다. | ||
기본 들여쓰기는 2로 해야 한다. | 기본 들여쓰기는 2로 해야 한다. | ||
+ | <file> | ||
for (i = 0; i < nElements; i++) | for (i = 0; i < nElements; i++) | ||
a[i] = 0; | a[i] = 0; | ||
+ | </file> | ||
들여쓰기를 1로 하면 코드의 논리적 레이아웃을 강조하기엔 작고, 4보다 크면 많은 단계로 중첩한 코드가 읽기 어려울 뿐만 아니라 줄을 나눠야 할 가능성도 커진다. 들여쓰기는 2, 3 그리고 4 중에서 선택하는 것이 일반적이며 2를 선택해 코드를 나눌 기회를 줄인다. (역자주: 개인적으로 2보다는 4가 구분하기 더 좋고 일반적으로 가장 많이 쓰는 형태가 아닐까 생각한다. 또한 깊게 중첩한 코드는 피하는 게 좋다.) | 들여쓰기를 1로 하면 코드의 논리적 레이아웃을 강조하기엔 작고, 4보다 크면 많은 단계로 중첩한 코드가 읽기 어려울 뿐만 아니라 줄을 나눠야 할 가능성도 커진다. 들여쓰기는 2, 3 그리고 4 중에서 선택하는 것이 일반적이며 2를 선택해 코드를 나눌 기회를 줄인다. (역자주: 개인적으로 2보다는 4가 구분하기 더 좋고 일반적으로 가장 많이 쓰는 형태가 아닐까 생각한다. 또한 깊게 중첩한 코드는 피하는 게 좋다.) | ||
부동소수점 상수는 항상 소수점과 함께 써야 한다. | 부동소수점 상수는 항상 소수점과 함께 써야 한다. | ||
+ | <file> | ||
double total = 0.0; // 아님: double total = 0;// | double total = 0.0; // 아님: double total = 0;// | ||
double speed = 3.0e8; // 아님: double speed = 3e8;// | double speed = 3.0e8; // 아님: double speed = 3e8;// | ||
줄 356: | 줄 451: | ||
: | : | ||
sum = (a + b) * 10.0; | sum = (a + b) * 10.0; | ||
+ | </file> | ||
이는 정수와 부동소수점 수의 본질적인 차이를 강조한다. 수학적으로 두 모델은 완전히 다르며 호환되지 않는 개념이다. 또한 위의 마지막 예제처럼 코드의 어떤 지점에서 명확하지 않을 수 있는 대입되는 변수(sum)의 타입을 강조한다. | 이는 정수와 부동소수점 수의 본질적인 차이를 강조한다. 수학적으로 두 모델은 완전히 다르며 호환되지 않는 개념이다. 또한 위의 마지막 예제처럼 코드의 어떤 지점에서 명확하지 않을 수 있는 대입되는 변수(sum)의 타입을 강조한다. | ||
부동소수점 상수는 항상 소수점 앞에 숫자를 써야 한다. | 부동소수점 상수는 항상 소수점 앞에 숫자를 써야 한다. | ||
+ | <file> | ||
double total = 0.5; // 아님: double total = .5; | double total = 0.5; // 아님: double total = .5; | ||
+ | </file> | ||
C++에서 숫자와 표현식 시스템은 수학에서 빌려왔으므로 가능한 구문에 대한 수학적 관례를 따라야 한다. 또한 .5보다 0.5가 휠씬 읽기 쉬우며 정수 5와 헷갈리지 않는다. | C++에서 숫자와 표현식 시스템은 수학에서 빌려왔으므로 가능한 구문에 대한 수학적 관례를 따라야 한다. 또한 .5보다 0.5가 휠씬 읽기 쉬우며 정수 5와 헷갈리지 않는다. | ||
루프 변수는 해당 루프 바로 앞에서 초기화해야 한다. | 루프 변수는 해당 루프 바로 앞에서 초기화해야 한다. | ||
+ | <file> | ||
isDone = false; // 아님: bool isDone = false;// | isDone = false; // 아님: bool isDone = false;// | ||
while (!isDone) { // :// | while (!isDone) { // :// | ||
줄 368: | 줄 467: | ||
} // :// | } // :// | ||
// }// | // }// | ||
+ | </file> | ||
54. do-while 루프는 피한다. | 54. do-while 루프는 피한다. | ||
줄 376: | 줄 476: | ||
56. 무한 루프는 while (true) 형식을 사용해야 한다. | 56. 무한 루프는 while (true) 형식을 사용해야 한다. | ||
+ | <file> | ||
while (true) { | while (true) { | ||
: | : | ||
줄 387: | 줄 488: | ||
: | : | ||
} | } | ||
+ | </file> | ||
+ | |||
1에 대해 시험하는 것은 필요하지도 의미적이지도 않다. for (;;) 형식은 가독성이 매우 나쁘며 실제 무한 루프인지 명확하지 않다. | 1에 대해 시험하는 것은 필요하지도 의미적이지도 않다. for (;;) 형식은 가독성이 매우 나쁘며 실제 무한 루프인지 명확하지 않다. | ||
줄 393: | 줄 496: | ||
객체 이름이 암시되어 있으면 메서드 이름에서 반복 사용하지 말아야 한다. | 객체 이름이 암시되어 있으면 메서드 이름에서 반복 사용하지 말아야 한다. | ||
+ | <file> | ||
line.getLength(); // 아님: line.getLineLength();// | line.getLength(); // 아님: line.getLineLength();// | ||
+ | </file> | ||
클래스 선언에서 두 번째가 자연스러운 것처럼 보이지만 불필요하게 사용한 예이다. | 클래스 선언에서 두 번째가 자연스러운 것처럼 보이지만 불필요하게 사용한 예이다. | ||
get/set은 반드시 속성(attribute)에 직접 접근할 때 사용해야 한다. | get/set은 반드시 속성(attribute)에 직접 접근할 때 사용해야 한다. | ||
+ | <file> | ||
employee.getName(); | employee.getName(); | ||
employee.setName(name); | employee.setName(name); | ||
줄 401: | 줄 507: | ||
matrix.getElement(2, 4); | matrix.getElement(2, 4); | ||
matrix.setElement(2, 4, value); | matrix.setElement(2, 4, value); | ||
+ | </file> | ||
C++ 개발 커뮤니티에서 일반적인 용례이며, 자바에서는 거의 표준이 되었다. | C++ 개발 커뮤니티에서 일반적인 용례이며, 자바에서는 거의 표준이 되었다. | ||
17. compute는 무언가 계산하는 메서드에서 사용한다. | 17. compute는 무언가 계산하는 메서드에서 사용한다. | ||
+ | <file> | ||
valueSet->computeAverage(); | valueSet->computeAverage(); | ||
matrix->computeInverse(); | matrix->computeInverse(); | ||
+ | </file> | ||
이 것은 시간을 소비할 수 있는 연산이라는 것을 즉시 알아챌 수 있는 단서를 제공해 반복해서 사용한다면 결과를 따로 저장해 두는 것을 고려하도록 할 수 있다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | 이 것은 시간을 소비할 수 있는 연산이라는 것을 즉시 알아챌 수 있는 단서를 제공해 반복해서 사용한다면 결과를 따로 저장해 두는 것을 고려하도록 할 수 있다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | ||
18. find는 무언가 찾는 메서드에서 사용한다. | 18. find는 무언가 찾는 메서드에서 사용한다. | ||
+ | <file> | ||
vertex.findNearestVertex(); | vertex.findNearestVertex(); | ||
matrix.findMinElement(); | matrix.findMinElement(); | ||
+ | </file> | ||
최소한의 계산이 포함된, 간단한 검색 메서드라는 것을 즉시 알아챌 수 있는 단서를 다른 개발자에게 제공한다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | 최소한의 계산이 포함된, 간단한 검색 메서드라는 것을 즉시 알아챌 수 있는 단서를 다른 개발자에게 제공한다. 이처럼 용어를 일관되게 사용하면 가독성을 향상시킨다. | ||
19. initialize는 객체 또는 개념을 만들 때 사용한다. | 19. initialize는 객체 또는 개념을 만들 때 사용한다. | ||
+ | <file> | ||
printer.initializeFontSet(); | printer.initializeFontSet(); | ||
+ | </file> | ||
영국어 initialise보다 미국어 initialize를 사용해야 하며, 약어 init는 피해야 한다. | 영국어 initialise보다 미국어 initialize를 사용해야 하며, 약어 init는 피해야 한다. | ||
20. GUI 요소(component)를 나타내는 변수는 해당 요소 타입 이름을 접미어로 사용해야 한다. | 20. GUI 요소(component)를 나타내는 변수는 해당 요소 타입 이름을 접미어로 사용해야 한다. | ||
+ | <file> | ||
mainWindow, propertiesDialog, widthScale, loginText, | mainWindow, propertiesDialog, widthScale, loginText, | ||
leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle 등. | leftScrollbar, mainForm, fileMenu, minLabel, exitButton, yesToggle 등. | ||
+ | </file> | ||
해당 변수 타입을 통해 리소스 객체를 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | 해당 변수 타입을 통해 리소스 객체를 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | ||
21. 복수형은 객체 모음(collection)을 나타내는 이름에 사용해야 한다. | 21. 복수형은 객체 모음(collection)을 나타내는 이름에 사용해야 한다. | ||
+ | <file> | ||
vector<Point> point; | vector<Point> point; | ||
int values[]; | int values[]; | ||
+ | </file> | ||
변수 타입과 더불어 해당 요소에 수행할 수 있는 연산을 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | 변수 타입과 더불어 해당 요소에 수행할 수 있는 연산을 즉시 알아챌 수 있는 단서를 사용자에게 제공하므로 가독성을 향상시킨다. | ||
22. 접두어 n은 객체 수를 나타내는 변수에 사용해야 한다. | 22. 접두어 n은 객체 수를 나타내는 변수에 사용해야 한다. | ||
+ | <file> | ||
nPoints, nLines | nPoints, nLines | ||
+ | </file> | ||
객체 수를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. | 객체 수를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. | ||
줄 436: | 줄 555: | ||
24. 반복자 변수는 i, j, k 등으로 호출해야 한다. | 24. 반복자 변수는 i, j, k 등으로 호출해야 한다. | ||
+ | <file> | ||
for (int i = 0; i < nTables; i++) { | for (int i = 0; i < nTables; i++) { | ||
: | : | ||
줄 444: | 줄 564: | ||
... | ... | ||
} | } | ||
+ | </file> | ||
반복자를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. 변수 이름으로 j, k 등은 중첩 루프에서만 사용해야 한다. (옮긴이 주: 이 표기법은 되도록 간단한 루프에서만 사용하고 복잡하거나 긴 루프에서는 의미있는 이름을 사용하는 게 좋다.) | 반복자를 나타내는 이 관례적인 표기법은 수학에서 가져왔다. 변수 이름으로 j, k 등은 중첩 루프에서만 사용해야 한다. (옮긴이 주: 이 표기법은 되도록 간단한 루프에서만 사용하고 복잡하거나 긴 루프에서는 의미있는 이름을 사용하는 게 좋다.) | ||
25. 접두어 is는 불린 변수와 메서드에 사용해야 한다. | 25. 접두어 is는 불린 변수와 메서드에 사용해야 한다. | ||
+ | <file> | ||
isSet, isVisible, isFinished, isFound, isOpen | isSet, isVisible, isFinished, isFound, isOpen | ||
+ | </file> | ||
C++ 개발 커뮤니티에서 일반적이며 자바에서는 일부분에서 강제하는 용례이다. 접두어 is를 사용하면 status나 flag처럼 좋지 못한 불린 이름을 선택하는 흔한 문제를 해결할 수 있다. 사실 isStatus나 isFlag는 적절하지 못하므로 더 의미있는 이름을 선택해야 한다. | C++ 개발 커뮤니티에서 일반적이며 자바에서는 일부분에서 강제하는 용례이다. 접두어 is를 사용하면 status나 flag처럼 좋지 못한 불린 이름을 선택하는 흔한 문제를 해결할 수 있다. 사실 isStatus나 isFlag는 적절하지 못하므로 더 의미있는 이름을 선택해야 한다. | ||
다음은 상황에 따라 접두어 is보다 더 나은 방법 몇 가지로 has, can 그리고 should 접두어를 사용한다. | 다음은 상황에 따라 접두어 is보다 더 나은 방법 몇 가지로 has, can 그리고 should 접두어를 사용한다. | ||
+ | <file> | ||
bool hasLicense(); | bool hasLicense(); | ||
bool canEvaluate(); | bool canEvaluate(); | ||
bool shouldSort(); | bool shouldSort(); | ||
+ | </file> | ||
26. 반의어는 반드시 대응하는 연산에 대해 사용해야 한다[1]. | 26. 반의어는 반드시 대응하는 연산에 대해 사용해야 한다[1]. | ||
+ | <file> | ||
get/set, add/remove, create/destroy, start/stop, insert/delete, | get/set, add/remove, create/destroy, start/stop, insert/delete, | ||
increment/decrement, old/new, begin/end, first/last, up/down, min/max, | increment/decrement, old/new, begin/end, first/last, up/down, min/max, | ||
next/previous, open/close, show/hide, suspend/resume, etc. | next/previous, open/close, show/hide, suspend/resume, etc. | ||
+ | </file> | ||
대칭 관계를 통해 복잡성을 낮출 수 있다. | 대칭 관계를 통해 복잡성을 낮출 수 있다. | ||
27. 이름에 약어는 피해야 한다. | 27. 이름에 약어는 피해야 한다. | ||
+ | <file> | ||
computeAverage(); // 아님: compAvg();// | computeAverage(); // 아님: compAvg();// | ||
+ | </file> | ||
두 가지 단어 종류를 생각해야 하는데, 첫 번째는 사전에 있는 일반 단어이며 절대 약어로 쓰면 안 된다. 즉, 절대 다음처럼 쓰지 않는다. | 두 가지 단어 종류를 생각해야 하는데, 첫 번째는 사전에 있는 일반 단어이며 절대 약어로 쓰면 안 된다. 즉, 절대 다음처럼 쓰지 않는다. | ||
+ | <file> | ||
command 대신 cmd | command 대신 cmd | ||
copy 대신 cp | copy 대신 cp | ||
줄 470: | 줄 600: | ||
compute 대신 comp | compute 대신 comp | ||
initialize 대신 init | initialize 대신 init | ||
+ | </file> | ||
등. | 등. | ||
그에 반해 약어/두문자어가 더 자연스런 특정 분야의 관용구는 약어 형태를 유지해야 하며, 절대 다음처럼 쓰지 않는다. | 그에 반해 약어/두문자어가 더 자연스런 특정 분야의 관용구는 약어 형태를 유지해야 하며, 절대 다음처럼 쓰지 않는다. | ||
+ | <file> | ||
html 대신 HypertextMarkupLanguage | html 대신 HypertextMarkupLanguage | ||
cpu 대신 CentralProcessingUnit | cpu 대신 CentralProcessingUnit | ||
pe 대신 PriceEarningRatio | pe 대신 PriceEarningRatio | ||
등. | 등. | ||
+ | </file> | ||
28. 포인터를 이름에 사용하는 것은 특히 피해야 한다. | 28. 포인터를 이름에 사용하는 것은 특히 피해야 한다. | ||
+ | <file> | ||
Line* line; // 아님: Line* pLine;// | Line* line; // 아님: Line* pLine;// | ||
// 아님: Line* linePtr;// | // 아님: Line* linePtr;// | ||
+ | </file> | ||
C/C++ 환경에서 많은 변수가 포인터이므로 이와 같은 관례는 따르기가 거의 불가능하다. 또한 C++에서 객체는 흔히, 프로그래머가 특정 구현 내용을 무시할 수 있는 간접 타입이다. 포인터를 이름에 사용할 때는 객체의 실제 타입이 특별히 중요할 때에 한해 해당 타입을 강조하기 위해서이다. | C/C++ 환경에서 많은 변수가 포인터이므로 이와 같은 관례는 따르기가 거의 불가능하다. 또한 C++에서 객체는 흔히, 프로그래머가 특정 구현 내용을 무시할 수 있는 간접 타입이다. 포인터를 이름에 사용할 때는 객체의 실제 타입이 특별히 중요할 때에 한해 해당 타입을 강조하기 위해서이다. | ||
29. 부정적인(negated) 불린 변수 이름은 반드시 피해야 한다. | 29. 부정적인(negated) 불린 변수 이름은 반드시 피해야 한다. | ||
+ | <file> | ||
bool isError; // 아님: isNoError | bool isError; // 아님: isNoError | ||
bool isFound; // 아님: isNotFound | bool isFound; // 아님: isNotFound | ||
+ | </file> | ||
문제는 이런 이름을 논리 부정 연산자와 함께 사용할 때 이중 부정을 통해 결과가 만들어지므로 생긴다. !isNotFound 의 의미를 즉시 명확하게 알아차릴 수 없다. | 문제는 이런 이름을 논리 부정 연산자와 함께 사용할 때 이중 부정을 통해 결과가 만들어지므로 생긴다. !isNotFound 의 의미를 즉시 명확하게 알아차릴 수 없다. | ||
30. 열거 상수는 공통 타입 이름을 접두어로 붙인다. | 30. 열거 상수는 공통 타입 이름을 접두어로 붙인다. | ||
+ | <file> | ||
enum Color { | enum Color { | ||
COLOR_RED, | COLOR_RED, | ||
줄 495: | 줄 633: | ||
COLOR_BLUE, | COLOR_BLUE, | ||
}; | }; | ||
+ | </file> | ||
이러한 것은 해당 선언을 어디에서 찾을 수 있는지, 어느 상수가 함께 속한 것인지, 그리고 그 상수가 어떤 개념을 나타내는지 등 추가 정보를 제공한다. 다른 방법은 Color: : RED, Airline: : AIR_FRANCE 등과 같이 항상 공통 타입을 통해 해당 상수를 참조하는 것이다. | 이러한 것은 해당 선언을 어디에서 찾을 수 있는지, 어느 상수가 함께 속한 것인지, 그리고 그 상수가 어떤 개념을 나타내는지 등 추가 정보를 제공한다. 다른 방법은 Color: : RED, Airline: : AIR_FRANCE 등과 같이 항상 공통 타입을 통해 해당 상수를 참조하는 것이다. | ||
31. 예외 클래스는 Exception 접미어를 붙여야 한다. | 31. 예외 클래스는 Exception 접미어를 붙여야 한다. | ||
+ | <file> | ||
class AccessException | class AccessException | ||
{ | { | ||
: | : | ||
} | } | ||
+ | </file> | ||
예외 클래스는 실제 해당 프로그램의 주된 설계 부분이 아니며(옮긴이 주: 프로그램에서 주된 처리 로직이 아니라는 뜻), 이와 같이 이름을 붙이면 다른 클래스와 상대적으로 구별된다. | 예외 클래스는 실제 해당 프로그램의 주된 설계 부분이 아니며(옮긴이 주: 프로그램에서 주된 처리 로직이 아니라는 뜻), 이와 같이 이름을 붙이면 다른 클래스와 상대적으로 구별된다. | ||