나는 프로그래밍 언어의 첫시작을 go언어를 사용하였다. go는 간단하고 파워풀했지만, 아직은 마이너한 언어이고 특정 분야에 특화된 언어였다.
그러는 와중, 팀내에서 kernel을 eBPF를 사용하여서 service를 구현하는 경우가 많아지고 있고, 그에따라서 c++의 학습의 필요성을 느끼고 있다.
그래서 c++를 공부하기 시작하였는데, go에 비해서 훨씬 다양한 기능을 제공하고 공부해야되는 부분도 많았다.
나는 기존의 학습된 내용을 기반으로 추가적으로 무엇이 다른지, 정리를 하면서 공부하고 싶어서 이렇게 내용을 정리하고자 한다.
패키지 호출
- go의 경우, package이름을 자동으로 넣어주고 내부에 있는 함수를 package.function의 형태로 호출한다.
- c++의 경우, 코드의 처음부분에 #include package의 형태로 참조, package::function의 형태로 호출한다.
- package::을 생략하기위해서 using namespace std와 같이 미리 선언해줄 수 있다.
- 근데 이러면 서로 다른 패키지의 동일 이름 함수 호출은 어떻게 구분되는가?
- 같은 namespace에 있을경우, ::부분이 생략가능하다 = 우선권이 있다
- local이 global보다 우선순위에 있다.함수, 변수의 선언
- 근데 이러면 서로 다른 패키지의 동일 이름 함수 호출은 어떻게 구분되는가?
- package::을 생략하기위해서 using namespace std와 같이 미리 선언해줄 수 있다.
- 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 |