3 minute read

‘전문가를 위한 C++ - Marc Gregoire 지음, 남기혁 옮김’ 책을 참고하여 작성한 포스트입니다.


코딩 스타일의 중요성

바람직한 스타일의 기준

  • 잘 작성된 코드에는 다음과 같은 공통적인 특징들이 있다.
    • 문서화
    • 코드 분해
    • 명명 규칙
    • 언어 사용
    • 코드 서식(포매팅)

코드 문서화(documentation)

  • 프로그래밍에서 말하는 문서화란 주로 소스 파일에 주석(comment)을 다는 것을 의미

주석을 작성하는 이유

사용법을 알려주는 주석

  • 함수의 기능은 주석없이 함수 이름, 리턴 타입, 매개변수 이름과 타입만으로 쉽게 보여줄 수 있어야 한다.
  • 이 외에 함수 호출의 선행 조건과 후행 조건, 함수가 던지는 예외, const 레퍼런스를 사용하지 않은 이유 등은 주석으로 남기는 것이 좋다.
  • int 같은 범용 타입을 리턴하는 경우 이 타입이 어떤 값을 표현하는 지 주석을 남기는 것도 좋지만, 클래스를 따로 만들어 리턴타입을 주석없이 알 수 있게 명명하는 것도 괜찮다.
  • 즉, 공식 문서에는 구현에 대한 설명이 아니라 코드의 동작(입출력, 에러, 용법, 성능 보장 등)에 대한 설명만 나와야 한다.

복잡한 코드를 설명하는 주석

  • 코드가 이해하기 어려운 경우는 설명 주석을 달아 주어도 좋다.

메타 정보를 제공하는 주석

  • 메타 정보(meta-information)는 코드의 동작이 아닌 코드 생성에 대한 세부사항만 표현한다.
  • 저작권 문구, 변경 내역, 저자, 작성 일자, 주요 기능 등을 표현할 수 있다.

주석 스타일

문장 단위 주석

  • 모든 문장마다 주석을 다는 방법이다. 보통은 바람직하지 않지만,
  • 코드가 굉장히 복잡하고 난해한 경우 코드의 작성 의도를 설명하는 문장 단위 주석은 괜찮다.

머리말 주석

  • 주요 사항을 남기면 좋다.
    • 저작권 정보
    • 파일과 클래스에 대한 간략 설명
    • 최종 수정 일자
    • 최종 작성자
    • 변경 내역
    • 파일에서 구현한 기능의 ID
    • 미완성 기능
    • 발견된 버그

고정 양식 주석

  • JavaDoc 스타일 같은 표준 양식에 따라 주석을 작성하는 스타일이다.

임의 주석

  • 정해진 형식과 관계없이 필요에 의해 주석을 다는 스타일이다.
  • 다음과 같은 가이드라인을 따르는 것이 좋다.
    • 주석 작성 전 주석이 필요 없도록 코드 수정이 가능한 지 검토한다.
    • 쉽게 이해하기 어려운 부분에 주석을 단다.
    • 코드 업데이트 시 주석도 반드시 업데이트 해준다.
    • 한 함수의 주석을 여러 부분으로 나눠서 작성한다면, 그 함수를 더 작은 단위의 함수로 나눌 수 없는지 검토한다.

코드가 곧 문서인 코드

  • 잘 작성된 코드는 대체로 주석이 적고 쉽게 이해가 가능하다.
  • 코드를 더 작은 단위로 코드 분해 해보자.

코드 분해(decomposition)

리팩터링(refactoring)을 통한 코드 분해

  • 추상화 수준을 높이는 기법
    • 필드 캡슐화
      • 필드를 private,
      • getter, setter 메서드로 접근하게 함
    • 타입 일반화
      • 코드를 공유하기 좋게 좀 더 일반적인 타입 사용
  • 코드를 좀 더 논리적으로 분해하는 기법
    • 메서드 추출
      • 거대한 메서드에서 일부를 뽑아내 새로운 메서드 정의
    • 클래스 추출
      • 클래스 내 코드 중 일부를 새로운 클래스로 옮김
  • 명칭과 위치를 개선
    • 메서드 및 필드 옮기기
      • 좀 더 적합한 클래스나 소스 파일로 이동
    • 메서드 및 필드 이름 바꾸기
      • 목적이 더 잘 드러나도록 이름 바꾸기
    • 올리기
      • 기본(베이스, base) 클래스로 옮기는 기법
    • 내리기
      • 상속(확장, derived) 클래스로 옮기는 기법
  • 핵심은 이해하고, 유지하기 쉬운 형태로 변환하는 것이다.

설계 기준으로 코드 분해하기

  • 설계부터 하고..
  • 나중에 구현할 부분을 따로 빼놓는 방식으로 작성

명명 규칙

  • C++ 컴파일러의 규칙 중 몇.
    • 첫 글자로 숫자 x
    • 더블 언더스코어는 이름에 x
    • 언더스코어 다음 대문자 시작도 x
    • 글로벌 네임스페이스에서 언더스코어 시작도 x

좋은 이름과 나쁜 이름

  • 용도가 명확히 드러나는 이름이 좋은 이름이다.

명명 규칙

  1. 카운터
    • 최상위 카운터는 i, 그다음은 j가 관례다.
    • 2D 데이터를 다룬다면 헷갈리지 않게 Row, Column으로 표현하는 것도 좋다.
  2. 접두어
    • 불의 경우 b 혹은 Is를 붙이는 등.
  3. 헝가리안표기법
  4. 게터와 세터
    • 게터는 주로 Get, 세터는 Set을 접두어로 붙이면 좋다
  5. 대소문자 활용
  6. 네임스페이스를 적용한 상수
    • 열거 타입도 좋다


언어의 기능에 스타일 적용하기

상수 사용법

  • 2.717828(초월수 e)같은 매직 넘버(magic number)를 그대로 쓰지 말고,
  • 그 값을 의미를 나타내는 변수에 넣어 사용하는 것이 좋다.
  • c++20 에는 표준 라이브러리에 수학 상수가 추가되었다.
  • std::numbers::e, pi, sqrt, phi

포인터 대신 레퍼런스 사용하기

  1. 레퍼런스가 더 안전하다.
    • 메모리 주소를 직접 다루지 않고, nullptr이 될수도 없기 때문
  2. 코딩 스타일 측면에서 더 깔끔하다.
    • 스택 변수와 문법이 같아서 *나 &와 같은 기호를 안써도 된다.
  3. 메모리의 소유권을 명확히 표현할 수 있다.
    • 전달된 객체를 레퍼런스로 받도록 메서드를 작성하면 객체 읽기, 수정은 자유롭지만 객체에 할당된 메모리 해제는 쉽지 않다.
    • 포인터는 가능하기 때문에 어느 쪽에서 해제해야 할 지 가늠하기 어렵다.

사용자 정의 익셉션



코드 서식(formatting)

Leave a comment