C++ Language [핵심정리] - 1
C++언어란 무엇일까요?
C++은 기존의 C언어에서 여러가지 기능을 추가해 만든 프로그래밍 언어입니다. C++은 C언어에서 절차지향적 특징을 가져왔고, Simula(노르웨이인 달과 뉘고르가 시뮬레이션 목적으로 확장하여 개발한 언어 입니다. 차후 많은 언어의 기반이 되었습니다.)에서 객체지향적 특징을 가져왔습니다. 그래도 C++은 C를 기반으로 만들어졌기에 C 표준 라이브러리를 사용할 수 있습니다.
때문에 해당 글을 읽기전에 C언어 핵심정리를 먼저 읽고 오시기를 바랍니다.
1. C++ 의 기본 문법
우리가 C언어를 배울 때 C언어 표준 함수들을 사용하기 위해서 include 전처리자를 사용해 <stdio.h>파일을 포함했는데요. C++ 의 경우에는 더 많은 기능들이 포함된 <iostream>이라는 헤더파일을 사용합니다. iostream 은 stdio 와 비슷하게 input/output stream 의 약자로 표준 입출력을 위한 헤더 파일입니다.
출력을 할 때는 cout 이라는 함수를 사용합니다.
<< 는 데이터를 분리하는 역할을 합니다. 일종의 , 라고 볼 수 있겠네요.
그리고 프로그램의 흐름을 나타낸다고 말해도 무방합니다.
그럼 자연스레 std::endl 이 무엇을 의미하는 지 궁금해질 수 밖에 없는데요. endl은 \n 즉, 줄 바꿈을 의미합니다.
줄바꿈을 하려면 출력이 되야하기 때문에 cout 함수와 endl 함수는 하나의 묶음으로 보셔야 합니다.
코드를 보시면 앞에 계속 std:: 라는 부분을 보실 수 있을텐데요. 해당 부분에 마우스 커서를 가져다 대면
이처럼 std:: 부분을 사용하기 귀찮다 하시면 main 함수 외부에 using namespace std 를 사용해주시면 됩니다.
namespace 는 변수명이나 함수명의 명칭을 사용하는 공간으로 일종의 소속을 나타내는 표식 정도로 생각하시면 됩니다.
namespace는 다음과 같은 형태로 사용됩니다.
약간 쓰임새가 넓은 범위에서 구조체를 닮은 느낌이 있네요.
입력을 받을 때는 cout 과 반대로 cin 함수를 사용합니다.
C언어에서 입력값을 받을 때 자주사용하던 scanf 함수는 서식지정자를 이용해 입력을 받으려는 변수의 자료형을 명시했습니다만, cin 함수의 경우 함수 자체에서 자료형을 판단하기 때문에 자료형을 명시해줄 필요 없습니다. 그리고 이 때 cin의 꺽새의 방향은 cout 함수를 사용하던 때와 반대 방향입니다.
이런 식으로 입력한 값이 input 이라는 변수 안에 들어가기 때문에 흐름이 정반대가 됩니다.
그리고 저희가 C언어에서 문자열을 사용하기 위해 배열이나 포인터 형태로 변수를 선언해주었던 반면에 C++에선 string 이라는 클래스를을 제공합니다.
string 클래스를 사용할 경우에는 배열형태가 아니기 때문에 가변길이를 주지 않고 더불어 길이에 제한을 받지 않습니다 다만, 공백을 줄 경우 입력값을 모두 가져가지 못하는 데 공백을 포함한 입력값을 받기 위해선 getline 함수를 사용해서 입력을 받습니다.
저희는 이렇게 문자열을 선언하고 C언어에선 strcat, strcpy 등 다양한 함수들을 사용해 문자열들을 수정했습니다. 이와 달리 C++ 에서는 + 같은 연산자를 이용해서 문자열 간의 수정이 가능합니다.
변수를 초기화 할 때 C언어에서는 int a = 10 과 같은 형태로 초기화를 했는데요. 사실 C언어에서 초기화, 할당 등의 개념들을 구분할 필요는 없었습니다. 하지만 C++에서는 초기화 와 할당이라는 개념은 구분해서 사용해야 합니다.
이처럼 C++에서는 C와 달리 ( )[괄호]를 이용해 초기화를 할 수 있습니다. 물론 주석 C++ 초기화 라고 쓰긴 했지만 C 에서 사용하는 초기화 형식을 C++ 에서 사용하지 않는 건 아닙니다. 암튼 중요한 건 이게 아니고, 변수에 값을 대입할 때는 괄호를 사용할 수 없습니다. (왜냐하면 해당 부분이 함수인지 변수인지 구분할 수 없기 때문이죠)
그리고 C++에서는 범위 기반 for문 이라는 걸 사용할 수 있어요.
범위 기반 for문의 경우에는 int n 과 같이 지정된 변수를 배열에 하나씩 넣어가며 n 을 출력합니다.
따라서 for문 안에 int n = 요소; 같은 코드가 한 줄 들어있다 생각하면 됩니다. 그렇기 때문에 해당 for문 안에서 n 의 값을 아무리 수정해야봐야 실제 arr 값은 변경되지 않습니다.
이 때 n을 이용해 요소의 값을 변경하고 싶다면 n을 일반변수가 아닌 레퍼런스 변수를 사용해 값을 참조하면 됩니다.
우리는 C++에서 int &n과 같은 변수를 레퍼런스 변수 라고 합니다. 우리는 그전에 C언어에서 포인터(다른 변수에 주소를 가르킴)와 일반변수에 대해서 공부했는데, 레퍼런스 변수는 C++ 에서 지원하는 세번째 변수 형태입니다. 그리고 레퍼런스 변수는 총 3가지의 참조형을 지원합니다.
1) non-const 값 참조형 -> (상수가 아닌 값)
여기서 & 는 주소가 아닌 참조(reference)를 의미합니다.
참조형은 선언과 동시에 반드시 초기화 해야합니다. 더군다나 NULL을 저장하는 포인터와 달리 NULL 참조가 없어서 NULL로 초기화를 못해요. 따라서 non-const(상수가 아닌 값)의 초기화는 오직 non-const 로만 할수 있습니다. (+ const, r-value 값으로 할 수 없어요)
우선 여기까지 하겠습니다. 레퍼런스 변수의 참조에 대해선 나중에 필요할 때쯤 다시 정리할게요.