////
Search
Duplicate
🎁

31. 배치와 스타일

이 장에서는 소스 코드의 미적인 측면인 배치를 다룬다.
프로그램의 실행 속도나 메모리 사용과 같은 성능적인 측면에는 영향을 미치지 않으며 가독성을 향상시켜 작성한 지 몇 달이 지난 후에 봐도 이해하기 쉬운 코드를 작성할 수 있게끔 한다.

1. 배치 기초 지식

극단적인 배치

만약 줄바꿈이 하나도 없는 소스코드가 있다면 정말 이해하기 어려울 것이다.
이런 극단적인 예시를 드는 것은 적합하지 못하다고 생각하지만 그정도로 배치가 중요하다는 것을 강조하기 위함인 것 같다.
줄바꿈만 있는 소스코드도 이해하기 어려울 것이다. 좋은 글은 문단이 잘 나눠져있듯이 소스코드도 그 위계가 코드의 흐름을 파악하는데 큰 도움을 준다.
코드와 주석은 완전히 같다. 기계는 공백을 이해하지 못한다. 하지만 우리는 공백을 이해하는데 효과적으로 사용할 수 있다.

형식화 기본 법칙

훌륭한 시각적 배치가 프로그램의 논리 구조를 표현할 수 있다는 것을 따른다.
코드를 보기 좋게 작성하는 것도 중요하지만 보다 더 중요한 것은 코드의 구조를 보여주는 것이다.

프로그램에 대한 사람과 컴퓨터의 해석

컴퓨터를 오로지 괄호나 시작과 끝에 신경 쓰는 반면 사람은 코드의 외견상 표현으로부터 단서를 얻어내는 경향이 있다.
만약 다음과 같은 코드를 사람과 컴퓨터가 본다면 각각 이해하는 바가 다를것이다. 물론 우리는 프로그래머니까 두번째, 세번째 명령문은 한 번만 실행될 것을 알고 있긴 하지만 말이다.
// swap left and right elements for whole array for ( i = 0; i < MAX_ELEMENTS; i++ ) leftElement = left[ i ]; left[ i ] = right[ i ]; right[ i ] = leftElement;
TypeScript
복사

좋은 배치는 얼마나 가치있을까?

좋은 배치는 가독성의 핵심 요소 중 하나다.
저자는 여기서 다양한 사례를 들며 전문가들이 프로그램의 중요한 특징을 인지하고 기억하는 데 소스코드의 구조가 도움이 된다는 것을 설명했다.
여기서 중요한 점은 프로그램을 일관된 형태로 구조화하는 것이 프로그램을 구조화하는 기법들보다 더 중요하다는 것이다.

종교로서의 배치

무조건 신봉할만한 배치 형태는 존재하지 않는다. 훌륭한 개발자는 자신의 배치 습관에 대한 편견이 없으며 적응하는데 다소 어려움이 있더라도 받아들일 수 있어야 한다.

좋은 배치의 목표

좋은 배치 구조는 분명히 다음과 같은 것을 수행해야 한다.
코드의 논리 구조를 정확하게 표현한다.
코드의 논리 구조를 일관되게 표현한다.
가독성을 향상시킨다.
변경 사항에 대한 내성을 지닌다.
배치 목표를 사용하기 위한 방법
다른 개발자와 배치 형태가 대립할 때, 자신의 배치 구조가 더 낫다는 것을 설명하기 위한 근거로 삼을 수 있다.

2. 배치 기법

공백

“공백을사용해가독성을높여라”, 스페이스, 탭, 줄 바꿈, 빈 줄 등의 공백이 프로그램의 구조를 보여주기 위해 주로 사용하는 도구들이다.
그룹화
공백은 관련된 명령문들이 서로 그룹화되어 있다는 것을 알려주는 것이라고 할 수 있다.
글에서는 생각이 단락으로 그룹화된다. 잘 쓴 단락은 특정한 생각과 관련된 문장만 들어 있다.
코드도 마찬가지로 하나의 기능만 수행하고 서로 연관된 명령문이 들어가야 한다.
빈 줄
관련된 명령문을 그룹화하는 것이 중요한 것처럼 관련이 없는 명령문을 구분하는 것도 중요하다.
빈 줄은 프로그램이 어떻게 구성되는지 보여주는 방법이다. 빈 줄을 사용해 연관된 명령문의 그룹을 단락으로 나누거나 메소드를 구분하거나 주석을 강조할 수 있다.
들여쓰기
들여쓰기를 사용해 프로그램의 논리적인 구조를 보여줘라. 대개 논리적으로 하위에 있는 명령문은 들여쓰기 해야 한다.

괄호

필요하다고 생각하는 것보다 훨씬 더 많은 괄호를 사용하라.
괄호를 사용해 항이 두 개 이상인 표현식을 명확하게 나타내라.
다음 식을 컴퓨터가 어떻게 평가할지 모든 사람이 한 번에 알 수 있을까? 알 수 없다면 그것은 적절히 괄호를 사용해야한다는 신호다.
12 + 4 % 3 * 7 / 8
TypeScript
복사

3. 배치 스타일

블록은 중괄호나 키워드 그리고 다른 언어에서는 이와 유사한 구조로 감싼다.

순수 블록

이 예제에서는 명령문 A가 제어 구조를 시작하고 명령문 D가 제어 구조를 끝낸다. 두 명령문 사이에 있는 B, C 명령문이 코드가 폐쇄되어 있음을 보여준다.

순수 블록 흉내내기

순수 블록을 제공하지 않는 언어를 사용한다면 begin, end 키워드를 제어 구조의 확장된 형태로 사용하라라는 내용이다.
아마 자바의 표준이 아닐까?

블록 경계를 나타내는 데 begin-end 쌍(중괄호) 사용

beginend 쌍을 블록 경계로 사용하는 방법이다.

줄 끝 배치

이 예제도 명령문 A가 시작해서 명령문 D가 끝낸다.
흠..

어떤 스타일이 가장 좋은가?

보통은 표준을 다르는 것이 좋다. 자바를 사용하고 있다면 순수 블록 들여쓰기를 선택하라.
한 가지 스타일을 선택해 일관성 있게 그 스타일을 적용하면 좋은 배치로부터 최고의 효과를 거둘 수 있다.

4. 제어 구조의 배치

제어 구조의 배치는 가독성과 이해력에 영향을 미치기 때문에 우선시되는 부분이다.

제어 구조 블록의 형식화에 대한 세세한 부분들

들여쓰기 되지 않은 begin-end 쌍을 피하라.
begin-end에서 이중 들여쓰기를 피하라.
{, } 쌍을 들여쓰기 하면 그 안의 명령문들은 이중 들여쓰기가 된다. 이런 구조를 피하라.
가급적이면 beginend를 블록 경계로 사용하거나 해당 쌍이 감싸는 명령문을 나란히 정렬하여 이 문제를 피하라.

기타 고려 사항

단락 사이에 빈 줄을 사용하라.
같은 성질이 있는 명령문의 그룹인 논리적인 블록은 영어의 단락과 같은 방법으로 다루어야 한다. 각 블록을 빈 줄로 구분하라.
단일 명령문 블록을 일관성 있게 형식화하라.
단일 명령문 블록은 중괄호를 생략 가능한데, 나는 가급적이면 생략하지 않는다.
case 문에 대한 줄 끝 예외를 두지 마라.
하나의 배치를 사용하기로 했으면 일관적으로 지키는 것이 좋다. 줄 끝 배치는 표준이 아니므로 case 문에만 예외적으로 적용시키지 말라.

5. 개별 명령문 배치

명령문 길이

일반적이면서 다소 낡은 규칙은 길이를 80자로 제한하는 것이다. 그 이유는 다음과 같다.
80자를 넘는 줄을 읽기가 어렵다.
80자로 길이를 제한하면 중첩이 깊어지는 것을 방지할 수 있다.
80자를 넘는 줄은 보통 A4 용지의 한 줄에 다 담기지 않는다.
그렇다고 엄격하게 지키지는 말자. 불필요한 엔터는 가독성을 해친다. 길이가 길어야할 이유가 충분히 있고 80자를 약간 넘는 정도라면 융통성있게 놔두자.

명료함을 위한 공백 사용

가독성을 위해 명령문 내에 공백을 사용한다. 다음은 그 지침들이다.
논리적인 표현식을 읽기 쉽게 만들기 위해서 공백을 사용하라.
while(pathName[startPath+position]<>';') and ((startPath+position)<length(pathName)) do
Visual Basic
복사
while ( pathName[ startPath+position ] <> ';' ) and ( ( startPath + position ) < length( pathName )) do
Visual Basic
복사
while ( pathName[ startPath + position ] <> ';' ) and ( ( startPath + position ) < length( pathName ) ) do
Visual Basic
복사
일반적으로 구별자는 공백으로 구분하는 것이 좋다.
때때로 3번과 같이 표현식에 공백을 추가해 논리적인 구조를 강조하는 기법을 사용하기도 한다.
메소드의 인자를 읽기 쉽도록 공백을 사용하라.
GetCensus( inputFile, empCount, empData, maxEmps, inputError );
Visual Basic
복사

연속된 줄 형식화하기

불완전한 명령문을 명확하게 만들어라.
길이가 너무 길어서 명령문을 여러 줄로 나누어야 할때, 첫 번재 줄에 있는 명령문이 전체 명령문의 일부라는 점을 명확하게 나타내라. &&+와 같은 연산자를 사용하여 명령문이 끝나지 않았음을 표현하라.
관련이 있는 요소를 가까운 위치에 배치하라.
연장된 줄의 끝을 찾기 쉽게 만들어라.
여러 줄로 나뉜 제어 명령문은 보통만큼 들여쓰기하라.
할당문에 오른쪽 정렬을 수행하지 말아라.

한 줄에 하나의 명령문만 사용하기

명령문을 여러개 사용할 수 있도록 문법을 지원하는 언어들이 존재한다. 하지만 사용하지 마라. 다음은 이를 뒷받침하는 이유들이다.
한 줄에 한 명령문을 입력하면 프로그램의 복잡성을 정확하기 이해할 수 있다.
한 줄에 여러 개의 명령문을 입력해도 컴파일러에게 최적화 단서를 제공하지는 않는다.
한 줄에 한 명령문을 입력하면 코드를 상하좌우로 읽는 대신 위 아래로만 읽을 수 있다.
컴파일러가 오류를 발생한 줄 번호를 제공하는 것만으로도 문법 오류를 쉽게 찾을 수 있다.
줄 단위 디버거에서 살펴보기가 쉬워진다.
요약하자면 복잡성을 표현하기 위해, 딱히 최적화가 발생하지 않아서 가독성이 좋기 때문에 디버깅이 쉬워져서인 것 같다.

데이터 선언 배치

한 줄에 데이터 선언은 하나만 한다. 공간을 많이 차지하게 되지만 타입을 파악하기 쉽다.
처음으로 사용되는 위치와 가까운 곳에 변수를 선언하라.
분별력 있게 데이터 선언을 나열하라.
같은 타입끼리 연속되도록 나열하는 것이 좋다. 그룹화하여 알아보기 쉽게하기 위함이다.

6. 주석 배치

주석이 설명하는 코드와 나란히 주석을 들여써라.
지키지 않는다면 주석이 코드의 들여쓰기를 감춰버려 논리적인 구조에 대한 단서를 파악하기가 힘들어진다.
적어도 빈 줄 하나를 입력하고 주석을 시작하라.
// comment zero CodeStatementZero; CodeStatementOne; // comment one CodeStatementTwo; CodeStatementThree;
Visual Basic
복사

7. 메소드 배치

빈 줄을 사용해 메소드의 각 부분을 구분하라.
메소드 시그니처와 데이터, 상수 선언, 본문 사이에 빈 줄을 사용하라.
메소드 인자에 대해서 표준 들여쓰기를 사용하라.
public bool ReadEmployeeData( int maxEmployees, EmployeeList *employees, EmployeeFile *inputFile, int *employeeCount, bool *isInputError ) ... public void InsertionSort( SortArray data, int firstElement, int lastElement )
Visual Basic
복사

8. 클래스 배치

인터페이스 배치

다음 순서로 인터페이스 멤버를 작성하는 것이 일반적인 규약이다.
1.
클래스를 설명하고 클래스의 사용법에 관한 내용을 제공하는 헤더 주석
2.
생성자와 소멸자
3.
공개 메소드
4.
보호 메소드
5.
비공개 메소드와 멤버 데이터

클래스 배치

클래스는 일반적으로 다음 순서로 배치한다.
1.
클래스가 들어 있는 파일의 내용을 설명하는 헤더 주석
2.
클래스 데이터
3.
공개 메소드
4.
보호 메소드
5.
비공개 메소드
한 파일에 둘 이상의 클래스가 있다면 각 클래스를 명확하게 구별하라.
자바같은 언어의 경우 특별한 이유가 없는 한 파일에 하나의 클래스만 입력한다. 그렇지만 하나의 클래스에 여러 개의 하부 메소드를 가질 수 있으며 그들을 배치할 때 그룹화할 수 있다.

파일과 프로그램 배치

한 클래스를 하나의 파일에 작성하라.
클래스 이름과 관련 있는 파일 이름을 작성하라.
파일 내에서 메소드를 명확하게 분리하라.
두 메소드를 구분하는데 최소 한 줄은 사용한다.

요점 정리

배치의 우선순위는 코드의 논리적인 구조를 분명히하는 것이 먼저다. 우선순위가 달성되었는지 평가하는 기준에는 가독성, 정확성, 일관성, 유지보수성이 있다.
보기 좋은 것은 다른 기준보다 크게 중요하지 않다. 그렇지만 다른 기준이 충족되고 기본적인 코드가 훌륭하다면 자연스레 보기 좋을 것이다.
자바에서 블록 기능을 지원하기 때문에 블록 배치를 사용할 수 있다.
코드를 구조화하는 것은 그 자체로 중요하다. 규악의 구체적인 내용보다는 어떠한 규약을 일관성 있게 따르는 것이 더 중요하다.
절대적인 지침은 없으며 주관적으로 선호하는 것과 객관적인 것을 떼어놓고 생각해본다.
선호하는 스타일의 논의를 지지하는 데 도움이 되는 명시적인 기준을 알아두면 좋다.