본문 바로가기

C++/FOCU_C++

C++ chtp3.

초기 C++ 의 새로운 기능들과 코딩 표준

 

- 전혀 사용하지 않는 기능들이 매두 많음

- 현재에서는 오직 소수의 기능만 알아도 문제없음

 

bool 데이터형 (C++ 98, 모던 C++)

참조(reference)

개체지향 프로그래밍(OOP: object-oriented programming)

...

 


Bool 데이터형

 

C 일 때와 비교 예문

// 만약 student 가 아니면
if (IsStudent() == 0)
{
    // ...
}

// 만약 student 라면
if (IsStudent() == <non-zero>)
{
    // ...
}

-----------------------------------------------------------------

// 만약 student 가 아니면
if (IsStudent() == false)
{
    // ...
}

// 만약 student 라면
if (IsStudent() == true)
{
    // ...
}

 


참조(Reference)

 

포인터를 사용하는 좀 더 안전한 방법

하지만 JAVA 만큼 제한적이지는 않음

 

- 값에 의한 호출 (call by value)

- 참조에 의한 호출 (call by reference)

- 포인터

 

참조는 NULL 이 될 수 없다

참조는 초기화에서 반드시 선언되어야 한다.

 

사용방식은 

int number = 1;
int number2 = 2;

int& referense = number; // & 를 자료형 바로 옆에 붙혀서 사용

reference = number2;	// 참조는 첫 선언 때만 참조 기능이 적용되고, 이후는 전부 값이 복사돼 적용된다

 


코딩 표준에 대한 팁

 

strcut Vector
{
    int X;
    int Y;
    int Z;
}

bool TryDivide(Vector& a, Vector& b, Vector& c);

 

위 코드 TryDivide(a, b, c)는 a = b / c 형태의 성분별 나눗셈(vector component-wise division) 을 시도하려는 함수다.

 

함수 이름에 "Try"가 붙은 것으로 보아 다음과 같은 동작을 하겠끔 유도된 함수다.

  • 나눗셈이 모든 성분에 대해 유효할 경우 true를 반환하고 a에 결과를 저장.
  • 나눗셈이 하나라도 실패(0으로 나눔 등) 하면 false를 반환하고 a는 손대지 않음 (또는 정해진 fallback 처리).

 

하지만 위 함수를 호출자 입장에서 사용할 땐 함수만 보고는 어떤 값이 반환 값이 될지 알 수 없고, 호출자가 마음대로 던져도 작동은 되는 함수라고 볼 수 있어 제작자의 의도가 드러나지 않는 단점이 있다.

 

이를 보완하기 위한 방법들을 하나씩 살펴보자

 

방법1.

// 리턴되는 값의 변수명을 설정하기
bool TryDivide(Vector& result, Vector& a, Vector& b)

 

이 방식은 의도는 좋으나 여전히 호출자가 실수해도 유효 동작이 되기 때문에 최선이라 보긴 어려움
호출자가 TryDivide(a, b, result) 와 같이 인자의 순서가 섞일 수 있는 부분에 대해 취약함

 

 

방법2.

// const 를 통해 읽기 전용 매개변수로 상수화하는 방법
bool TryDivide(Vector& result, const Vector& a, const Vector& b);

 

이 방식은 호출자가 아래와 같이 사용한다면 의도대로 사용하겠끔 유도할 수 있지만

const Vector a;
const Vector b;
Vector result;

// 위 처럼 선언 사용시 다음과 같은 결과를 얻을 수 있음
TryDivide(a, b, result) // 컴파일 에러, const는 수정할 수 없는데, 파라미터가 const가 아니어서 수정 의도가 발생하기 때문
TryDivide(result, a, b) // 컴파일 성공

 

아래처럼 사용하는 경우가 발생할 수도 있어 이 방법 또한 최선이라고 보기는 어렵다.

Vector a;
Vector b;
Vector c;

// 호출자가 비const 로 전달할 경우 역시 의도대로 동작되지 않는 문제가 발생
TryDivide(a, b, c)

 

 

 

방법3. - 이 방식은 보편적인 코딩 표준으로써 '읽기 전용 매개변수 = 상수 참조' & '출력 결과용 매개변수 = 포인터' 방식을 사용한다

// 읽기 전용인 b, c 는 const 참조
// 반환값 저장용인 a 는 포인트

bool TryDivide(Vector *a, const Vector& b, const Vector& c)
{
    assert(a != NULL)
}

//호출자
TryDivide(&a, b, c);

 

결과값의 파라미터와 연산용 파라미터의 형식을 달리해주면서, a 의 파라미터가 포인터 설정으로 a 값이 바뀔 것 이라는 걸 예측 가능.

매개변수의 형식에 맞지 않으면 컴파일 오류를 내뱉음으로써 의도대로 사용할 수 있게 가능

함수는 값의 형식만 맞추면 결과값을 뱉어주는 매커니즘을 고정시킴으로써, 파라미터와 맞지 않는 방식의 인자 전달을 무효화시켜줌.

함수의 반환값이 유도되는 상황에서 사용자가 인자의 순서를 잘못 전달해서 나오는 결과값의 책임은 사용자가 온전히 안겠끔 함.

 

 

여담으론 C# 에서는 'out' 키워드를 통해 좀 더 확실하게 가독성을 올리는 방법을 택함

bool TryDivide(out Vecort result, ... );

 

 

'C++ > FOCU_C++' 카테고리의 다른 글

C++ chpt6.  (1) 2025.05.16
C++ chpt5.  (0) 2025.05.04
C++ chpt4.  (0) 2025.05.03
C++ chpt2.  (0) 2025.04.29
C++ chpt1.  (0) 2025.04.28