Programming Language/C++

[TheSSEN/C++] 1. C++ 개요

coco_daddy 2025. 1. 27. 14:04
※ LIG Nex1 The SSEN Embedded SW School에서 진행된 내용을 정리한 포스팅입니다.

C++ 개요

  • using namespace
    • scope 연산자
    • C++는 중대형 프로젝트를 관리하기 위한 목적의 언어이다.
      • 이름이 충돌할 가능성이 크다.
      • 영역을 구분하여 충돌을 방지해야 한다.
  • main의 반환값
    • 프로그램 종료 코드
      • 부모 프로세스로 전달된다.
      • 멀티 프로세싱을 사용하면 큰 의미가 없을 수 있다.
  • 함수
    • 특정 기능을 제공하기 위한 것
    • 목적에 따라 접근 제어자를 설정해주어야 한다.
  • 접근 제어자(access modifier)
    • defulat 값은 private이다.
  • pipeline 연산자 (<<)
    • 원시 자료형은 내부적으로 문자열로 변환이 되어 출력된다.
  • 멤버 직접 연산자(.)와 멤버 간접 연산자(->)
  • 메모리 할당 연산자(new)
    • 클래스의 크기 만큼 할당한 주소의 void *를 반환한다. 
      • 저장하려는 변수의 타입으로 암묵적 형변환이 일어난다.
      • 생성자를 호출한다.
      • 없는 경우 컴파일러가 생성한 default 생성자를 호출한다.
    • delete 메모리 해제 연산자로 할당을 해제한다.

함수 오버로딩

함수 호출 시, 함수의 이름과 전달되는 파라미터의 정보를 동시에 참조하여 호출할 함수를 결정한다.

  • C에서는 변수와 함수의 이름이 동일한 경우 에러가 발생한다.
  • 컴파일러는 모호함을 허락하지 않는다.
  • 이름이 같다면 파라미터의 개수 또는 타입이 다른 함수를 구분해야 한다.
// C
int add(int, int);
// int add(float, float); Error
int add(char*, char*);

// C++
int add(int, int);
int add(float, float);
int add(char*, char*);
  • 호출 시 전달받은 인자의 타입으로 어떤 함수를 호출할지 탐색한다.
    • 상수도 타입이 존재한다.
      • 정수: int
      • 실수: double(f가 붙었다면 float)
    • 데이터가 큰 쪽으로 형변환이 일어난다.
      • 정수와 실수 관계에서는 정수가 실수로 형변환이 일어난다.
add(3, 4);
float f = 3.14; // double 상수를 float로 암묵적 형변환
float f1 = 3.14f; // 상수를 float으로 선언

 

매개변수의 default 값

매개변수의 default 값을 지정할 때, 오른쪽이 비워진 상태로 함수를 생성할 수 없다.

int func(int a = 1. int b = 2, int c = 3) { ... }

func(4);        // func(4, 2, 3);
func(5, 6);     // func(5, 6, 3);
func(7, 8, 9);  // func(7, 8, 9);

매개변수의 default 값 설정 시 주의점

int add (int a, int b) {
    return a + b;
}

int add(int a, int b, int c) {
    return a + b + c;
}

파라미터의 개수가 다르더라도 디폴트 값이 설정되어 있는 경우 모호함(ambiguous)을 유발할 수 있다.

int add (int a, int b){
    return a + b;
}

int add(int a, int b, int c = 3){
    return a + b + c;
}

int main(void) {
	add(3, 5); // ambiguous error
}

namespace

이름의 충돌을 막을 목적으로 소속을 정해준다.

  • namespace의 선언
namespace Add{
    int add (int a, int b);
    int add(int a, int b, int c);
    float add(float a, float b);
}
  • namespace의 사용
    • ::연산자를 이용하여 접근한다.
using namespace Add;

int main()
{
    cout << "add(1,2): " << Add::add(1,2) <<endl;
    cout << "add(1,2,3): " << add(1,2,3) <<endl;
    cout << "add(1.2f,2.3f): " << add(1.2f,2.3f) <<endl;
    return 0;
}

const

// 변수 num 상수화
const int num = 10;
// 포인터가 가리키는 int 상수화
const int * ptr1 = &val1;
// 포인터의 주소값 상수화
int * const ptr2 = &val2;
// 주소값과 참조값 모두 상수화
const int * const ptr3 = &val3;

구조체

  • 멤버함수를 넣을 수는 있지만 추천하지 않는다.
  • 데이터의 묶음으로만 사용하며, 공용체(union) 등으로 정의된다.

new와 delete

malloc과 free 대신 new와 delete를 사용한다.

  • delete의 형태는 new 선언 시 사용한 형태와 매치된다.
    • new -> delete
    • new[] -> delete[]
int *ptr1 = new int;
double * ptr2 = new double;
int *arr1 = new int[3];
double *arr2 = new double[4];

// delete의 형태는 new 선언 시 사용한 형태와 매치된다.
// new -> delete, new [] -> delete[]
delete ptr1;
delete ptr2;
delete[] arr1;
delete[] arr2;

※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)