코딩을 잘하기 위해 갖춰야 할 요소가 뭐가 있을까요?
알고리즘, 디자인 ( 설계 ) , 프로젝트 경험, 운영체제에 대한 이해, 컴파일러에 대한 이해, 네트워크 지식
뭐 셀 수 없이 많을겁니다.
컴퓨터는 평생 공부해야 하는 과목이라고 하니까요

이번 포스팅은 그 중에서도 보기좋은 코드를 작성하는 방법에 대한 내용이예요.
딱히 기술적인 것도 아니고, 대규모 프로젝트를 경험해보기 힘든 대학생으로서는
중요하단걸 알면서도 피부로 느끼기 참 힘든 부분이지만
예전에 작성했던 코드를 보면서 가끔 느끼는 부분입니다.
(진짜 내가 코드를 이따위로 쓴건가 싶어요...)

*이 글은 '전문가를 위한 C++, 마크 그레고리 저' 도서를 읽고 정리한 글입니다.

1. 코드의 문서화

코드를 보고서처럼 짜야되는건가 싶었던 말입니다.
주석을 적절히 잘 써야한다는 말이더라구요
신입생때부터 귀에 못박히게 들은 말이지만 정말 실천 안되는 부분입니다.

주석에 넣어야 하는 내용은 3가지가 있습니다.

  첫 번째는 해당 코드의 사용법인데요, 함수로 예를 들면 파라미터, 리턴 타입 등을 보면 사용법이야 알 수 있지만 예외처리나 재귀, thread 등 함수 선언만 봐서는 알기 힘든 내용을 주석에 표시합니다. 그럼 굳이 코드를 안봐도 코드의 활용법을 알 수 있습니다.
  같은 맥락에서 알고리즘과 같은 고급 코드에도 주석을 달아주는게 좋습니다. 코드에 사용한 알고리즘이 익숙한 사람이야 한눈에 알아보겠지만 그렇지 않은 경우에는 코드를 정독해도 알기 힘든 경우도 있죠. 그런 상황을 피하기 위해 주석을 꼭 달아주는 것이 좋습니다.
  마지막으로 헤더, namespace 등에 대한 메타데이터가 있습니다. 이런 경우 페이지의 맨 상단에 적는 경우가 많습니다.

전 ide를 많이 활용하지 않아서 몰랐는데 ide별로 핫키를 사용해 표준 주석 문구를 자동으로 넣을 수 있더라구요.
잘 활용하면 문서화 시간도 줄이고 보기도 좋은 주석을 넣을 수 있을 것 같습니다.

물론 가장 좋은 문서화는 주석 없이도 한눈에 볼 수 있는 코드를 쓰는거겠죠?

 

2. 코드 분할

함수 하나엔 작업 하나가 이상적이라는건 대부분 개발자들이 다 아는 말이죠
저도 알아요. 근데 실천하기가 쉽지 않더라구요

이미 분할 없이 작성한 코드를 여러 함수로 나누는 작업을 리팩토링이라고 합니다.
리팩토링엔 아래 3가지 방법이 있습니다.

추상화 강화

- 추상화는 인터페이스와 구현 부분을 분리하는 작업을 말해요. 추상화를 위한 가장 쉬운 방법은 private에 코드를 작성하는 것이죠. class내부의 코드는 대부분 private에 선언하고 변수도 getter setter를 사용하는 것이 기본적인 추상화 방법입니다.
- 또 인터페이스에서 문제없이 사용하기 위해 int, char와 같은 범용적인 데이터 타입을 사용하는 것이 좋습니다.

논리적 분할

- 함수 하나엔 작업 하나, 이 말을 지키기 위한 작업이예요. 한 함수를 여러 함수로 나누고, 한 클래스를 여러 클래스로 나누는 작업을 의미합니다.

코드 위치 개선

- 함수의 위치를 더 적절한 소스파일로 바꾸고, 이해하기 쉬운 이름을 쓰도록 바꾸는 작업입니다.
- 제일 이해가 안되는 부분이고 아직 왜 필요한지 모르겠는데 보통 이런게 제일 중요하더라구요. 알아둘 생각입니다.

리팩토링은 한번 작성한 코드를 다시 분할하는 작업입니다.
두번 일하는 거죠
이런 불상사를 막기 위해서는 개발 시작 전에 디자인 작업이 필수적입니다.
프로젝트 규모가 클수록 이런 작업을 머리로 생각하고 작업하는건 불가능에 가까워집니다.
그렇기 때문에 코드 분할을 위해 미리 정해진 디자인 패턴을 사용한다면 작업 시작 시간은 늦춰지더라도 두번 작업하느라 시간을 버릴 일은 없을거예요.

 

3. naming

개발자들이 젤 힘들어하는 부분이죠. 이름짓기
C++의 경우에는 문법적인 제한 이외에 네이밍 규약이 있습니다.

우선 '_'로 시작하거나 단어 사이에 '_'를 두번 쓰는건 라이브러리에서 미리 예약했기 때문에 쓰지 않는게 좋습니다.

아래는 naming convention이라 불리는, 표준적인 네이밍 방법입니다.

- 접두어 : memberData -> mData
             이와 같이 단어를 축약해 한글자만 앞에 붙이는걸 의미합니다.
             global을 g로 쓰는 등 대중적인 접두어는 이해를 돕지만
             나만 아는 접두어는 주석을 쓰던, 알아볼 수 있을 만큼만 줄이는게 좋겠죠?

- 대,소문자를 통한 구별
             대신 C++에서는 단어 구분을 위해 두 번째 단어부터 첫 알파벳을 대문자로 사용해요.
             memberData, controllAction()처럼요.
             변수, 함수와의 구분을 위해 class 이름은 첫 번째 단어도 대문자로 시작합니다.

- 헝가리언 표기법
             ms windows 프로그래머들이 많이 사용하는 방법으로 헝가리 출신의 찰스 시모니가 만들었다고 해요.
             변수, 함수 이름의 사전 쯤으로 이해할 수 있습니다.

 

4. 일관성 있는 코딩

이 부분은 그냥 제 생각입니다.

일관성이라는 말은 괄호의 위치, 줄 간격, 공백의 사용 여부에 대한 일관성을 의미합니다.

int foo(int i){

}

int foo( int i )

{

}

두 함수는 같은 코드지만 괄호 사용도, 공백의 위치도 다르죠.
코드에 전혀 영향도 없고 정말 아무 의미도 없지만 개발자들에겐 매우 신경쓰이는 부분이예요.
쓸데없이 신경쓰여서 읽기 불편해요 정말.
저만 그런건지 개발자들에게 생기는 강박증인지 모르겠지만 개인적으로 중요하다고 생각하는 부분입니다.

 

혼자 코딩을 많이 하다 보니까 잘 못지키는 부분이예요.

이렇게 포스팅해두고 매번 참고하면서 지켜보려 노력할 예정입니다.

'개발일지 > c++' 카테고리의 다른 글

보기 좋은 코드 작성  (0) 2018.10.14
중요 문법  (0) 2018.10.13

'중요' 문법이라고 있어보이게 말하긴 했지만
사실은 그냥 제가 몰랐던 C++문법이예요.
C와 C++의 차이 정도로 볼 수도 있겠습니다.

*이 글은 '전문가를 위한 C++, 마크 그레고리 저' 도서를 읽고 정리한 글입니다.

1. namespace

C언어는 시작할때  `#include <stdio.h>` 이거부터 시작하죠.

 

C++은

#include <iostream>
using namespace std;

이거더라구요.

 

std라는 이름의 namespace를 사용한다는 의미입니다.
std안에는 cout, cin과 같은 함수들을 갖고있는데
전처리기로 using 선언을 해주면 그냥 사용할 수 있지만 그렇지 않은 경우엔
std::cin과 같이 [namespace]::[function]으로 사용해야 해요.

namespace는 같은 이름의 여러 함수를 구별해 사용하기 위한 기능입니다.
만약 헤더파일에 namespace의 using선언을 해버리면 헤더를 include하면 동시에 헤더에서 사용한 namespace가 선언이 될 거예요.
그럼 namespace를 사용하는 의미가 없겠죠?
또 너무 과도하게 많은 namespace를 사용하는 것도 의미 퇴색의 문제가 있어 주의해야 합니다.

 

2.  단락 논리 (Short-Curcuit Logic)

if( A == B || B==C || C == D)

이 경우에 C언어의 경우 모든 연산을 다 하고 || 연산도 마친 후에 결과값을 도출한다.
하지만 C++의 경우 A==B 하나만 true로 나오면 뒤의 연산은 건너뛴다고 해요.
뭔가 컴파일러가 똑똑해진 느낌?

 

3. 함수 정의

[type] [function name]([parameter]) { }

함수 정의의 기본 형태입니다.
하지만 C++에선 템플릿 함수에서 사용하기 위해 다음과 같은 형태를 사용하기도 합니다.

auto [function name]([parameter]) -> [type] { }

여기서 리턴타입은 지정해주지 않아도 됩니다.
auto로 지정해주면 리턴타입은 코드 내 첫 번째 return문에서 리턴하는 값의 타입을 따라갑니다.
단 이를 위해 함수 내 코드에서 첫 번째 return이 재귀일 수 없습니다.

 

4. decltype

설명이 좀 힘들어서 예제로 설명을 대체하겠습니다.

int x = 123;

decltype(x) y = 456;

이 때 y는 int타입으로 선언됩니다.
알아두면 뭔가 쓸모있을듯한 기능입니다.

 

5. class 정의

생성자 : [classname]()

소멸자 : ~[classname]()

class [classname] {

이 태그 내부에는 변수 및 함수에 대한 선언 한다.

}

[classname]::[function name]() { }

선언한 함수에 대한 정의는 태그 밖에서 진행

 

'개발일지 > c++' 카테고리의 다른 글

보기 좋은 코드 작성  (0) 2018.10.14
중요 문법  (0) 2018.10.13

제 블로그 글을 보시면... 흠...

놀고 먹기만 하는 놈 같을겁니다.

제가 봐도 그렇거든요

아주그냥 놀러다닐 생각만 하고 살 것 같지만 의외로!!!

저는 프로그램 개발자예요

사이버보안을 공부하다 개발에 매력을 느껴 보안 솔루션 개발자를 목표로 공부하는 학생입니다.

 

주 언어...라고 할건 아직 없어요.

여러가지 대외활동을 하고, 수업 과제를 해야 하는 언어를 그때그때 배워가면서 하고 있습니다.

장점이라고 하면 여러가지 언어를 다뤄보며 경험을 쌓을 수 있고

검색능력, 에러나 예외 상황에 대한 대처능력

그리고 프로그램의 전체적인 구조를 언어에 맞춰서 짤 수 있는 융통성이 생긴 점이예요.

단점은 아무래도 주 언어가 없다는거죠.

어떤 언어도 검색 없이 10줄이상 짜기 힘들어하고 숙지하고 있는 라이브러리는 거의 없다고 볼 정도니까요.

 

목표는 있습니다!!

C++을 주 언어로 공부하고

알고리즘을 꾸준히 연습하는거죠.

뭐, 이게 중요한거 모르는 사람은 없겠지만 꾸준히 하는사람은 드물잖아요?

꾸준히 해보려 합니다.

그 기록도 남겨보려구요.

이러다 안하기 일수지만....

되도록 노력하려고 합니다.

 

화이팅!!!

힘!!!

으아아악!!!!

'개발일지' 카테고리의 다른 글

개발 일지 Prolog  (0) 2018.09.28

+ Recent posts