Search
Duplicate
♟️

1. C++의 기초적인 사용법

간단소개
c++의 문법과 예제를 정리하는 시리즈입니다.
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C++
Scrap
태그
c++
9 more properties

들어가기 전에

이 시리즈는 “홍정모의 따라하며 배우는 C++”를 기반으로 다른 여러 레퍼런스의 내용을 덧붙여 C++의 문법에 대한 내용을 정리하는 시리즈입니다.
잘못된 내용에 대한 피드백은 언제나 환영입니다!

1. C++의 기초적인 사용법

1.1 프로그램의 구조
1.2 변수와의 첫 만남
1.3 입력스트림과의 만남 cin, cout
1.4 함수와의 첫 만남
1.5 키워드와 식별자 이름짓기
1.6 지역 범위
1.7 연산자와의 첫 만남
1.8 헤더파일과의 첫 만남
1.9 Namespace

1.1 프로그램의 구조

1) 프로그램과 소프트웨어

프로그램은 프로그래밍된 결과물을 뜻하고, 소프트웨어는 하드웨어와 반대되는 개념인데요 흔히 우리는 이 둘을 같은 의미로 사용합니다. 하지만 한번쯤은 둘에 어떤 차이가 있는지도 확인하면 좋을 것 같아요. 프로그램소프트웨어의 엄밀한 의미에서의 차이는 아래와 같습니다.
프로그램 : 컴파일된 결과물뿐만 아니라, 프로그래머가 작성한 소스 코드까지도 포함한다.
소프트웨어 : 프로그램뿐만 아니라 CD, 설명서, 제품 포장 등 패키지 전체를 뜻하기도 한다.

2) 프로그램의 구조

우리가 C, C++과 같은 언어를 사용해서 소스 코드를 작성하고 이를 컴파일하면 컴퓨터가 실행할 수 있는 바이너리 파일로 변환이 됩니다. 프로그램이란 컴퓨터에서 실행될 때 특정 작업(specific task)을 수행하는 일련의 명령어들의 모음이라고 할 수 있지만, 이것은 우리가 컴파일한 프로그램이 CPU로 바로 전달된다는 의미는 아닙니다. 운영체제가 존재하는 컴퓨터에서는 사용자의 모든 명령이 운영체제로 전달이 되고 운영체제는 이런 명령을 수행하기 위해 CPU나 디스크, 메모리와 같은 자원에 접근을 하게 됩니다.
C++에서 프로그램의 구조는 크게 아래와 같습니다.
//앞에 #이 붙는 것은 전처리기입니다. #include <iostream> int main() //main 함수가 없으면 프로그램이 실행되지 않습니다. { return 0; //프로그램이 제대로 작동하면 0, 그게 아니면 다른 정수 반환. }
C++
복사

1.2 변수와의 첫 만남

Objects

Object란 실제 메모리 공간에 저장된 것들을 말합니다. 변수, 함수, c++의 객체, 자료구조 모두 Object입니다.

Variables

메모리 공간에 이름을 달아주는 것 → 즉 주소의 다른 이름이라고 할 수 있습니다.

L-value, R-value

프로그래머가 메모리에 접근 할수 있느냐에 따라 L-value와 R-value의 구별이 가능합니다.
L-value : 메모리 주소를 가지고 있는 value
R-value : 메모리주소를 알기 힘든(이해하기 쉽게 없는, 휘발성의) 값
int x = 2; x = 123; //x == L-value, 123 == R-value x = x + 2; //왼쪽 x는 메모리 주소를 가지고 있는 L-value //오른쪽 x는 값만 일시적으로 가져온, 즉 메모리주소가 없는 R-value
C++
복사

Initialization

초기화란 변수 생성과 동시에 값을 할당하는 것을 의미합니다.
초기화를 하지 않은 변수는 쓰레기 값을 가짐
assignment와는 다른 개념입니다.
int a = 1234; // Initialization int b{1234}; int c(1234); int d; //아래의 대입연산자 '='는 할당이다! d = 6543; //Assignment //=을 똑같이 쓰지만 사실은 다르다. -> 오버로딩, 오버라이딩 개념으로 확대된다
C++
복사

1.3 입력스트림과의 만남 cin, cout

stdio

<iostream>라이브러리로 사용 가능합니다.
표준 출력객체인 cout 은 시스템의 표준 출력 버퍼에 해당 내용을 전달하고, 표준 입력 객체인 cin 은 표준 입력 버퍼에서 해당 내용을 가져옵니다. 이렇게 버퍼에 저장하고 가져오는 방식이 마치 물이 흘러가는 것 같다고 하여 스트림이라고 합니다.
<<, >>는 스트림 연산자이며, endl객체는 줄바꿈 후 버퍼 정리를 표준 출력 객체에 전달합니다.
cin : cin.fail() : 실패할 경우 True 리턴 및 실패플래그 set(1) cin.clear() : 실패플래그 초기화 cin.ignore() : 특정 글자가 나오거나 특정 길이만큼 입력을 무시.
위의 메서드를 이용해 에러 핸들링이 가능합니다
이스케이프 시퀀스
\t 탭문자 → 줄맞춤이 가능하다.
\b 백슬레쉬 → 단어가 하나지워진다
\r 커서를 다시 맨 앞으로 옮긴다. 이때 글을 입력하면 글 수정 모드
\a 소리출력

1.4 함수와의 첫만남

함수란 하나의 작업을 하는 일련의 명령어들을 모아놓은 것입니다. 함수 실행 시 stack이 생성되고 변수 또한 stack에 생성됩니다. 이 stack에 생성된다는 개념은 뒤에도 계속 나오니 기억해 주시면 좋을 것 같아요.
C++은 함수 내에서 함수 선언 불가능하며, 함수 내에서 다른 함수 호출은 가능합니다.
반환타입 함수이름(매개변수); //프로토타입 선언, main함수 위에 선언하여야 함 //함수 실행과 동시에 매개변수가 생성되고 전달된 인자로 초기화 된다. 반환타입 함수이름(매개변수) { statemant; }
C++
복사

선언(Declaration)과 정의(Definition)의 분리

C++에서는 main()함수 위에 함수를 선언 또는 정의를 해주어야 합니다. 가독성을 위해 선언만 위로 올리는 것도 좋은 방법입니다.(foward declaration)

1.5 키워드와 식별자 이름짓기

키워드(Keyward)

C++내의 예약된 단어들. 키워드로 식별자로 쓰면 안됩니다.

식별자(Identifier)

함수, 변수, 객체 등의 메모리 주소를 사용자가 알기 쉽게 식별자를 지정합니다.

식별자 규칙

숫자로 시작하는 함수는 안된다
키워드는 사용 불가능하다.
띄어쓰기 사용은 불가능하다.

1.6 지역범위

{} 는 범위 지정을 할때 사용합니다.

int x = 0; { int x = 3; } { int x = 4; } //위의 x는 전부 다른 변수이다. //또한 지역변수는 지역에서 벗어나는 순간 사용이 불가능 해진다.
C++
복사

1.7 연산자와의 첫 만남

int main() { int x = 2; //x is variable, 2 ix a literal cout << 1+2 << endl; cout << "My Home" << endl; //"My Home" is literal return 0; }
C++
복사
C++의 유일한 삼항 연산자(Ternary Operator)는 조건연산자(Conditional Operator)입니다
condition ? a : b //condition == True 면 a, 아니라면 b 반환 : 좌우로 같은 타입이어야 함. if-else와 비슷하며, 대입의 경우 대입받는 변수의 타입이 그 문장의 타입니다.
int nResult = 0; int A = 10, B = 20; nResult = (A < B) ? A : B; std::cout << nResult << std::endl; nResult = (A > B) ? A : B; std::cout << nResult << std::endl; int a = 3, b; (a == 3) ? b = 3 : b = 1; int c = (b == 3) ? 3 : 1; cout << "a: " << a << " b: " << b << " c: " << c << endl; // 3, 3, 3
C++
복사

1.8 헤더파일과의 첫 맛남

헤더파일 만들기

코드가 길어지면 함수, 클래스 등을 다른 파일로 쪼개는게 좋습니다.
이 때, main.cpp 에 선언을 하면 읽기 불편하므로 헤더파일을 만들어 선언을 한 후 #include "add.h" 와 같이 사용합니다. 하위폴더에 헤더파일이 존재할 경우 "avr/stdio.h"와 같이 사용가능하며 컴파일러의 옵션에서 헤더파일의 위치를 설정할 수도 있습니다.

헤더가드

만약 a.h 가 b.h 를 include 하고 main에서 a.h b.h 둘 다 include하면 중복 include! → 이 때 헤더가드를 이용해이용해중복을 막습니다.
//SOME_UNIQUE_NAME_HERE가 정의되어있지 않다면 #ifndef SOME_UNIQUE_NAME_HERE //SOME_UNIQUE_NAME_HERE를 정의하라 # define SOME_UNIQUE_NAME_HERE 선언과 정의 . . . //SOME_UNIQUE_NAME_HERE가 정의되어있다면 #endif
C++
복사

1.9 Namespace

만일 두 개의 헤더 파일에 이름이 같은 함수fun()(command-line argument도 동일한)가 존재하고 이들을 같은 프로그램에 include하여 fun()을 호출하면 두 함수는 충돌합니다. 이를 방지하기 위해 C++에는 namespace가 존재합니다.
기본적으로 일반 함수와 전역 변수는 전역 네임스페이스에서 정의됩니다. 만일 namespace 내에 정의를 한다면, 스코프 분석 연산자(::) 를 이용하여 호출하거나 또는 using 명령문 을 사용하여야 합니다.
namespace는 중첩 이 가능합니다.이때 중첩된 네임 스페이스를 입력하는 것은 길기 때문에 네임스페이스 별칭 을 만들 수 있습니다.
namespace aaa { namespace bbb { int bb = 4; } } namespace ccc = aaa::bbb //ccc now refers to aaa::bbb
C++
복사
std namespace 는 C++ 표준라이브러리의 namespace 입니다.
Namespace 는 두개이상 using 가능합니다.

Reference

홍정모의 따라하며 배우는 C++