본문 바로가기
프로그래밍/c++

c++ 배워보기(1)

by 나도한강뷰 2023. 3. 8.

나는 프로그래밍 언어의 첫시작을 go언어를 사용하였다. go는 간단하고 파워풀했지만, 아직은 마이너한 언어이고 특정 분야에 특화된 언어였다.
그러는 와중, 팀내에서 kernel을 eBPF를 사용하여서 service를 구현하는 경우가 많아지고 있고, 그에따라서 c++의 학습의 필요성을 느끼고 있다.

그래서 c++를 공부하기 시작하였는데, go에 비해서 훨씬 다양한 기능을 제공하고 공부해야되는 부분도 많았다.
나는 기존의 학습된 내용을 기반으로 추가적으로 무엇이 다른지, 정리를 하면서 공부하고 싶어서 이렇게 내용을 정리하고자 한다.

패키지 호출

  • go의 경우, package이름을 자동으로 넣어주고 내부에 있는 함수를 package.function의 형태로 호출한다.
  • c++의 경우, 코드의 처음부분에 #include package의 형태로 참조, package::function의 형태로 호출한다.
    • package::을 생략하기위해서 using namespace std와 같이 미리 선언해줄 수 있다.
      • 근데 이러면 서로 다른 패키지의 동일 이름 함수 호출은 어떻게 구분되는가?
        • 같은 namespace에 있을경우, ::부분이 생략가능하다 = 우선권이 있다
        • local이 global보다 우선순위에 있다.함수, 변수의 선언
  • go의 경우, func functionName(inputName inputType) (return type){}의 형태로 구성되는, "타입-이름(인풋) 아웃풋"형태이다
    • 변수의 경우는 name-type형태이다.
  • c++의 경우, returnType name(inputType inputName){}형태로 구성된다. "아웃풋-이름-인풋"형태이다.
    • 변수의 경우 type-name형태이다.
  • go의 경우가 명시적으로 이게 함수인지 뭐인지를 나타내고, c++의경우, 함수를 명시적으로 선언해주는 명령어는 없다.(go가 좀더 명확해서 이해가 쉽군...)

type을 명시적 선언

  • go의 경우, type이 다르면 대입조차 안됨
  • c++의 경우, int에 float값을 넣으면 자동으로 int로 변환됨
    • 자동 형변환. 편리해보이는데, 좀 헷갈릴 수 있는 부분인거 같다.
    • 명시적 표현을 위해서 캐스트 연산자 사용
      • (int)num, num을 int형으로 바꾸겠다, atoi같이 문자를 숫자로 바꾸는등 그런 기능은 아니다.

switch 문의 사용

  • go의 경우, switch -> case로 조건을 분개하고 case내의 것을 전부 실행시키고 종료된다.
  • c++의 경우, case에서 종료를 tab, {}로 구분하는게 아니라 break;라는 표현을 통해서 종료되고, break표현이 없을시, default절 직전까지 모든 구문을 실행시킨다.
  • break/ continue
    • break는 해당 블록을 탈출해라
    • continue는 블록의 남은건 뛰어넘고 다시 시작위치로 가라

조건연산자의 사용

  • c++의 경우, if문을 간단한 조건연산자로 대체할 수 있다.
    • 조건연산자(?:)
    • 조건 ? 참일때 : 거짓일때
    • ans = (res==1) ? "a" : "b"

함수

  • c++의 경우, return 값을 하나밖에 갖을 수 없다.
    • return 값이 없는 함수의 경우 void function 이런 식으로 시작된다.
  • c++에는 인라인 함수라는 기능이 따로 존재한다
    • inline 리턴값의형 함수이름(input list){ ... }
    • 인라인 함수는 컴파일러가 해당 코드를 실행할때, 코드자체를 실행위치에 넣기때문에 참조하는 시간이 줄어들고 성능향상에 도움이 된다.
    • 너무길면 컴파일러가 인라인으로 인정하지 않는다.
  • c++의 경우 함수 선언부를 따로 정의 할 수 있다.
    • 함수 호출후 함수를 정의하는 부분이 나온다면 위에서 부터 읽는 특성상 함수를 찾을 수 없게 되기때문에
    • 이런것을 함수 프로토타입이라고 한다
      • 리턴값의형 함수명(인수 리스트);
      • 함수 선언에 마지막에 세미콜론이 들어가면 프로토타입이다.
    • 프로토타입에서 default argument(기본 인수)를 설정 할 수 있다.
      • 리턴값의 형 함수명(인수형 인수명 = "기본값")
      • 추후 함수 호출시, 아무값도 넣지않으면 default값 사용가능
      • 기본인수는 오른쪽부터 순서를 맞춰서 설정해야 됨, 중간에 특정값만 기본 인수를 넣을 수 없음
        • 왜냐하면 함수를 사용할때, 왼쪽부터 값을 넣기때문에, 값이 들어가지 않으려면 최우측이 가장 값이 안들어가있고, 그다음이 차우측 이런식이기때문
  • go의 경우 함수 오버로드를 지원하지 않는다.
  • c++의 경우 함수 오버로드(중복정의)를 지원한다.
    • 인수의 형과 개수가 다르면 같은 이름을 가진 함수를 여러개 정의할 수 있다.
    • 함수의 unique는 함수이름+ 인수의 정보를 통해서 결정
    • 리턴값만 다른경우 사용 불가능
    • default argument가 정의 되어서 어느 함수를 호출한건지 구분 할 수 없을때 사용 불가능
  • c++의 경우 이러한 오버로드 최적화를 위해서 템플릿을 지원
    • 템플릿은 함수의 틀을 만드는 기능
    • template < class 인수 이름 >
        template <class T>
        T max(T x, T y)
        {
            if (x>y)
                return x;
            else
                return y;
        }
    • 이렇게하면 모든 T에 대해서 max값을 구하는 함수를 구현할 수 있다.

잡다한것

  • 8진수 앞은 0을 붙여서 나타내고, 16진수앞은 0x를 붙여서 나타낸다.
    • ex) 010, 0x1F
  • 선언한다= 메모리에 공간을 확보해둠 = type에 따라 확보해야되는 공간의 크기가 다름 = 변수의 형태에 따라서 사용메모리의 공간도 다름 = 힙/스택 메모리
  • const 선언시, 초기화없이 선언한다면, 추후 그 상수에 값을 대입할 수 없게 된다.
  • 전위, 후위 증가 연산자
    • b = a++ , 이것은 a>b is true
    • b = ++a , 이것은 a=b is true
  • << >> 시프트 연산자는 비트를 변경하는 용도로도 쓰이지만, 입출력을 담당하는 cout cin 에서도 쓰이게 된다.

'프로그래밍 > c++' 카테고리의 다른 글

c++배워보기(4)  (0) 2023.03.19
c++배워보기(3)  (0) 2023.03.18
c++배워보기(2)  (0) 2023.03.13