본문 바로가기

개발 공부/C++

따라하며 배우는 C++ 1. C++의 기초적인 사용법

 따라하며 배우는 C++ 

 

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

 

1.1 프로그램의 구조

 

표현식 Expressions

명령문 Statements

함수 Function

 

 

컴파일러 옵션으로 main 함수 이름을 변경할 순 있지만 그러는 경우는 드물다

OS가 프로그램을 실행시킬 때 가장 먼저 main이라는 이름의 함수를 찾는다.

기능을 수행시킬 수 있는 프로그램을 만들 땐 main이 꼭 있어야 한다.

 

빈 칸이나 빈 줄은 컴파일러가 무시한다.

보통 int main(void)라고 넣기도 한다. (void--아무것도 없다는 뜻)

int main에서 int는 출력 부분을 의미한다. main 옆의 괄호 안에는 입력 부분을 의미한다.

{} 중괄호는 main 함수의 몸체 부분이다.

return 0; 에서 return은 main 함수의 출력값을 의미한다. 여기서 출력이 정수이므로 0을 return 한다.

(함수가 다 끝났다는 의미이기도 한다)

 

기능을 수행한다는 뜻에서 statement라고 한다. (ex. return statement -- 즉 명령문)

명령문도 문장이다. C나 C++에서는 문장의 끝을 표시하는 것이 세미콜론(;)이다.

 

(**syntax error - 문법적인 오류)

(1 + 2) * (3 + 4); 같은 표현 단위를 expression이라고 한다.

int x; 정수형(Integer) 데이터를 담을 메모리를 x라는 이름으로 할당받은 것

2 같은 상수를 리터럴(literal)이라고 하며 x나 y는 변수라고 한다.

 

#include는 포함을 시킨다는 뜻.

#은 preprocessor directive라고 불리며 전처리기가 담당하는 부분을 표시한 것이다.

<< -- stream, output operator

 

 

1.2 주석 Comments

 

컴파일러가 주석 영역은 무시한다.

// -- 한 줄 한 줄

/* */ -- 영역을 통째로 주석 처리

단축키는 Ctrl+C, K

 

함수의 기능과 프로그램의 상세 설명을 주석으로 남겨두는 것이 좋다.

 

 

1.3 변수와의 첫 만남

 

객체 Objects : 메모리에 담겨 있는 의미있는 정보들

 

변수 Variables : 객체는 메모리에 담겨 있는데, 객체를 사용하기 위해선 그 객체의 이름이 있어야 한다.

     메모리에 담겨 있는 객체의 이름, 주소의 다른 이름

 

Left-values와 Right-values : 분류 기준이 프로그래머가 메모리 주소에 접근할 수 있느냐 없느냐

 

초기화 initialization 와 대입 assignment

 

초기화를 안 했을 때의 문제점

 

 

변수의 값에 아무것도 넣지 않으면 경고가 뜬다.

ex) int x; std;:cout<<x<<std::endl;

 

int x = 123; //initialization

x = 5; //assingment

초기화나 대입의 개념을 구분하는 것이 좋다.

 

int x(123);으로 int x = 123의 기능을 수행할 수 있다.

 

릴리즈 모드에선 초기화를 안 할 경우 자동으로 0이 대입될 수 있다(=즉 나중에 초기화 안한 부분을 찾기가 힘들어짐)

또한 초기화를 안할 경우 메모리를 지나치게 많이 잡아먹을 수 있다(Garbage 데이터)

 

 

1.4 입출력 스트림과의 첫 만남 cin, cout

 

cin : console in

cout : console out

endl : endline

 

#include <iostream> 필수

#include <cstdio> 에는 printf 들이 들어 있다.

 

출력하고 싶은 내용이 cout 을 타고 흘러 간다. 라고 생각하면 좋다.

<<를 output operator라고도 부른다.

endl은 입력을 마쳤다, 줄의 끝이라는 뜻을 동시에 가지고 있는 것이다.

 

여기서 \t는 줄맞춤을 해주는 tab

\가 붙어 있는 문자는 어떠한 기능을 수행하는 문자가 된다.

\n : new line 

using namespace std; --> 라고 파일 앞에 적으면 std::를 떼어도 괜찮다.

컴파일러가 std에서 cout이나 endl를 인식하는 것

 

"\a"는 소리를 내주는 기능이다.

 

cin>>에서 >>는 입력 operator

아주 큰 숫자를 넣으면 이샇한 숫자가 들어갈 수 있다(해당 변수가 들어갈 수 있는 최저거나 최대의 변수가 나타날 수 있다)

 

1.5 함수와의 첫 만남

 

 

함수 이름 Rename 기능을 이용하면 모든 함수의 이름을 자동으로 재설정할 수 있다.

 

 

 

 

- 함수는 재사용 가능

- 함수가 함수를 부를 수 있다

 

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

식별자 = identifier

 

reserved keyword : return, sizeof, int 등

예약되어 있는 단어들이라서, 변수 이름에서 위 단어들은 사용할 수 없다.

 

main은 운영체제에서 제일 먼저 사용하는 함수의 이름이기 때문에 reserved keyword처럼 작용한다.

변수의 시작은 숫자로 시작할 수 없다.

의미를 충분히 알 수 있는 이름으로 짓는 것이 좋다.

변수에서는 띄어쓰기 할 수 없다. (ex int number_of_apples)

변수명은 소문자로 사용하는 것이 관행적이다.

 

함수는 동사+명사 형태로 많이 한다. 맨 앞글자는 소문자로 쓰는 경우가 많다. (ex void makeNumber())

 

저수준 레벨에서의 개발이 _apple 이런 식으로 언더바를 붙이는 경우가 많았다.

(요새는 객체의 멤버를 정의할 때도 _를 맨 앞에 쓰는 경우도 있다)

 

1.7 지역 범위

 

범위라고 하면 보통 {}를 의미한다. {}를 넘어가면 변수의 의미가 사라진다.

{} 마다 다른 메모리 영역을 가진다.

지역 변수는 영역을 벗어나면 사용할 수 없게 된다.

지역 변수가 차지하고 있던 메모리는 그 지역 변수가 영역을 벗어날 때 스택 메모리로 반납됨.

반납된 메모리는 다음 지역 변수가 사용할 수 있도록 대기한다.

 

 

 

1.8 연산자와의 첫 만남

 

리터럴 Literal

피연산자 Operand

단항 unary, 이항 binary, 삼항 ternary

 

 

단항 : -2와 같은 부호.

이항 : a+b, a/b, a*b, a-b, a%b 등

삼항 : (x > 0) : 1 ? 2;

     (조건식): 조건식이 참일 경우 ? 조건식이 거짓일 경우;

 

1.9 기본적인 서식 맞추기

 

보통 들여쓰기는 tab 혹은 space * 4

* 하드 코딩은 프로그래머가 코드에서 변수값을 리터럴 같이 고정된 값으로 직접 대입해주는 방식.

반대로 소프트 코딩은 프로그램 실행 중에 사용자 입력 혹은 외부 파일, 인터넷 통신 등으로 데이터를 가져오는 방식.

 

 

 

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

 

이렇게 함수의 종류가 많아지는 경우

 

컴파일러는 순차적으로 읽어서, main에서 불러오는 함수를 main 이후에 정의-선언을 동시에 하는 경우 컴파일러는 이 함수를 찾지 못한다.

 

이렇게 함수의 prototype을 main위에 써서 이러한 함수가 있음을 컴파일러에 알릴 수 있다.

전방 선언, forward declaration을 하고 main 이후에 함수의 정의를 쓰는 것이다. definition.

 

1.11 헤더파일 만들기

 

 

 

 

위처럼 할 수도 있지만 굳이 함수의 정의를 써주어야 하므로 번거롭다.

헤더 파일을 이용해 include를 쉽게 해 줄 수 있다.

 

 

1.12 헤더 가드가 필요한 이유

이렇게 있을 경우 "add.h"가 메인에서 한번, doSomething.h에서 한번 중복 참조가 되어 버린다.

그럴 경우 빌드가 되지 않는다. (헤더 파일으 #pragma once가 없을 경우)

 

#pragma once나 #ifndef~#endif에 이르는 구문을 넣어준다면, 해당 파일이 이미 참조되었을 경우 중복 참조하지 않는다.

IDE에서 #pragma once를 자동 추가해주는 경우, 그냥 그대로 그것을 사용하면 된다.

 

 

1.13 네임스페이스(명칭 공간)

 

함수의 형식과 이름이 완전 같을 경우 빌드가 되지 않는다.

 

 

namespace 안에 또 namespace 삽입 가능.

그럴 경우 namespace::inner_namespace:: ~ 로 사용하면 된다.

 

1.14 전처리기와의 첫 만남

 

#define의 경우 해당 상수를 뒤에 있는 literal로 만들어준다.

#define MAX(a, b) ((a > b) ? a : b)

요새는 매크로를 많이 안 쓴다.

 

전처리기는 빌드하기 전에 사용된다.

#ifdef~#endif 해당 기능이 정의되어 있을 때 실행

#ifndef~#endif 해당 기능이 정의되어 있지 않을 때 시행

매크로를 이용해서 conditional compilization을 할 수 있다.

 

전처리기는 해당 파일 내부에서만 정의될 수 있다!