[C++] 01. C언어 기반의 C++ #1

kkado·2023년 10월 11일
0

열혈 C++

목록 보기
1/16
post-thumbnail

💬 윤성우 님의 <열혈 C++ 프로그래밍> 책을 혼자 공부하며 배운 내용을 정리합니다. 글의 모든 내용은 책에서 발췌하였습니다.


기본 입출력

std::cin >> a;

std:: cout << a;

std : namespace

함수 오버로딩

동일한 이름의 함수를 매개변수의 선언형태가 다르게 여러 번 정의하는 것

C는 함수 오버로딩이 불가능하지만 C++은 가능하다.
이는 C와 C++이 함수를 찾는 방법의 차이에서 기인한다.

  • C : 이름으로만 찾는다
  • C++ : 이름과 매개변수의 형태를 가지고 찾는다
int myFunc(char c) {}
int myFunc(int a) {}
int myFunc(int a, int b) {}

오버로딩이 가능하려면 매개변수의 자료형이나 개수가 달라야 한다. 함수의 반환타입만 다르다면 오버로딩 X

매개변수 Default Value

int myFunc(int num=7) {}

매개변수가 없으면 7이 전달된 것으로 간주하도록 할 수 있다.

myFunc();
myFunc(7);

둘은 동일.

일부분만 default value 지정하기

int func(int n1, int n2=5, int n3=7);

func(10); // func(10, 5, 7) 과 같은 의미
func(10, 50); // func(10, 50, 7)과 같은 의미

그러나 아래와 같이 오른쪽 매개변수를 먼저 비울 수 없다.

int func(int n1=3, int n2=5, int n3);
int func(int n1=3, int n2, int n3);

유의할 점

int func(int n=10);
int func(void);

이런 식으로의 오버로딩은 불가능. (func();을 호출했을 때 어느 함수를 실행할 지 난감하기 때문)


인라인(inline) 함수

매크로 함수의 장단점

#define SQUARE(x) ((x) * (x))
  • 장 : 일반 함수에 비해 실행 속도 측면에서 이점을 가져갈 수 있다.
  • 단 : 정의하기가 어렵고 복잡한 함수를 매크로 함수로 정의하기엔 한계가 있다.

인라인 함수 : 일반 함수처럼 정의할 수 있고, 실행 속도 측면에선 유리한 함수

inline int SQUARE(int x) {
	return x * x;
}

매크로 함수는 전처리기에 의해 컴파일러에게 넘어가기 전에 처리되지만 키워드 inline에 의한 인라인 함수의 처리는 컴파일러에 의해 처리된다.

그러나, 매크로 함수가 갖고 있는 또 다른 장점 중 하나인 자료형에 의존적이지 않다 는 단점은 해결하기가 어렵다.

-> 템플릿 template 의 등장


namespace

여러 명이 협업한다면 다음과 같은 문제가 발생할 수 있음

void f() {
    std:: cout << "A가 만든 함수" << "\n";
}

void f() {
    std:: cout << "B가 만든 함수" << "\n";
}

int main() {

    f();

    return 0;
}

어떤 함수의 이름과 매개변수 형태까지 똑같은 함수들이 있다.
이럴 때 namespace를 분리해줌으로써 문제를 해결 가능

namespace A {

    void f() {
        std:: cout << "A가 만든 함수" << "\n";
    }
}

namespace B{
    void f() {
        std:: cout << "B가 만든 함수" << "\n";
    }
}

int main() {

    A::f();

    return 0;
}

범위지정 연산자 ::를 이용하여 namespace를 명시.

동일 namespace 내에 정의된 함수를 호출할 땐 범위지정 연산자 필요 X

namespace A {
    void f1();
    void f2();
}

void A::f2() {
    std::cout << "f2 function" << "\n";
}

void A::f1() {
    std::cout << "f1 function" << "\n";
    f2();
}

namespace는 중첩될 수 있다.

namespace Parent {
    int num = 2;

    namespace Child1 {
        int num = 3;
    }

    namespace Child2 {
        int num = 4;
    }
}

int main()
{
    std:: cout << Parent::num << "\n";
    std:: cout << Parent::Child1::num << "\n";
    std:: cout << Parent::Child2::num << "\n";
}

범위지정 연산자도 중복해서 사용해주면 된다.

using의 사용으로 매번 귀찮게 범위지정 연산자를 붙이는 일을 줄일 수 있다.

namespace A {
    int num = 2;
}

int main()
{
    using A::num;

    std:: cout << num << "\n";
}

아니면 극단적으로 한 namespace에 선언된 모든 것에 대해 범위지정 연산자를 생략하겠다는 뜻으로 다음과 같이도 사용 가능

using namespace std;

int main() {
	cout << "Hello world" << "\n";
}

좋은 방법은 아님.

profile
울면안돼 쫄면안돼 냉면됩니다

0개의 댓글