티스토리 뷰

지난시간에 C++이란 무엇이고 C++을 같이 해석해 보면서 컴퓨터 언어라는 것을 이해해 보았다.

이번 시간에는 그러면 이 C++이라는 녀석을 이용해서 "프로그램"이라고 할 만한 것을 만들려면 무엇을 알아야 하는지 배워보겠다.


오늘은 양이 많다. 그러나 잘 배워두면 편하니까 쫄지말고 공부하자. (그리고 그렇게 어려운 내용도 아님)


Main() 함수


첫 번째로, main() 함수를 알아보도록 하겠다.

1
2
3
4
5
int main() {
    // 1단계: 입력
    // 2단계: 프로세싱
    // 3단계: 출력
}
cs


지난 시간에도 설명했지만, 모든 C++프로그램은 이 main() 함수부터 시작이라고했다. 

나중에 가면 객체지향 이란 개념을 배우면서 프로그램이 어떤 구조로 이루어져 있는지 배우게 될텐데, 이 함수는 가장 핵심이자 제일 처음 시작하는 프로그램이며, 딱 하나만 인식한다.

Visual Studio를 쓴다면 프로젝트를 만들고 솔루션 내에 소스파일을 추가해서 코드를 쓰게 되는데 내가 소개해준 예제들(앞으로 계속나옴)에는 다 main() 함수가 포함이 되어 있는데, 따라서 내가 준 예제를 무턱대고 복붙해서 프로젝트 빌드를 시도하면 에러가 날 것이다. 왜냐하면 main 함수가 너무 많거든.


실제로 우리가 쓰는 프로젝트는 전부 이 메인함수에서 동작하며 이 함수가 프로그램의 뼈대이고 서식이고 양식이다. 이정도만 설명해도 충분 할것 같다.


앞으로 저 주석자리에 저런 양식으로 짜넣어서 프로그램을 만들게 될것이다.


1단계 입력에 해당하는 내용을 지금부터 배워보겠다.


변수선언


변수란 무엇인가? 보통은 상자에 비유를 많이 한다. 실제로 컴퓨터가 돌아가는 원리를 봐도 상자에 더 가깝다.

변수에 대해서 지금부터 "정석대로" 설명해주겠다.

변수는 값을 담는 상자이다. 실제로 이 상자는 RAM 안에 있으며 이 메모리안에 공간을 마련해두고, 그 공간에 값을 저장시킨다. 그 공간에다가 우리는 이름을 붙일수있다. 이것이 변수이다.


근데 말이 어렵잖아... 내 설명이 어려우면 책을 읽어봐도 좋고, 아니면 다른 사람이 설명한 변수 개념 읽고와도 좋음. 다 똑같이 상자 이야기하니까.


나는 이 말이 어려워서 이해하기도 힘들고 받아들이기도 힘들어서 좀 다르게  설명해보려고한다.


변수는 "USB" 이다!

우리는 usb에다 영화도 넣고 사진도 넣고 문서도 넣고 별별 파일을 다 저장할수가 있다. 그리고 이 저장한 파일들을 읽고 쓰고 하고싶으면 컴퓨터에 꽂아서 그 안의 내용물을 보고 쓸수있게된다.

변수가 딱 USB랑 비슷하다. 변수도 똑같이 숫자도 넣고, 문자도 넣고, 문자열도 넣고, 심지어는 수식도 넣을수있다.

대신 중요한 것이 있다. 넣고 싶은 데이터 유형에 따라 올바른 USB 종류를 정해주어야 한다는 것이다.

USB도 A타입이니 C타입이니 들어본적이 있을것이다. 그 타입마다 USB 모양이 다르지 않는가. 그 모양을 맞춰줘야 올바르게 들어간다는 것이다.

우리는 그 데이터 유형을 조금이따가 배울것이다. 엄청많음.


이제 변수를 배웠다. 변수를 쓰려면 어떻게 해야하는지 예제를 통해 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main() {
    // 1. 반지름 읽기
    double radius;
    cout << "Enter a radius: ";
    cin >> radius;
 
    // 2. 면적 계산
    double area = radius * radius * 3.14159;
 
    // 3. 계산한 면적을 출력
    cout << "the area is " << area << endl;
 
    return 0;
}
cs

1~5행까지는 배웠으니까 패쓰. 모르는 사람은 1강 읽고오세요.
6행을 보면 저것이 변수를 선언하는 부분이다. 

1
데이터유형 변수이름
cs
위 예제에서는 double 이란 데이터 유형으로 radius라는 이름의 변수를 만들어줬다.

이것이 변수를 선언하는 방법이다.


변수를 선언할 때는 한번에 같은 유형의 변수를 여러개 선언해줄수가 있다.

1
int num1, num2, num3
cs
나는 int라는 유형의 변수를 세개 선언해준 것이다.


다음으로 예제의 8행을 보자. 모르는 말이 나왔다. cin이란게 눈에 띈다.

1
cin >> radius;
cs

눈치가 빠르고 기억력이 좋은 사람은 알수도 있겠지만 cout 의 반대 기능을 하는 녀석이다.


console input 을 줄여서 cin 이고 반대니까 입력해주는 기능이다. 실제로 콘솔에서는 아무 화면도 뜨지않고 당신이 무언가 입력하기를(입력 후에 Enter키를 누르기를) 기다리고 있을 뿐이다.


cin 함수를 알아보자. cin 함수는 >>(스트림 추출 연산자)로 내가 입력한 내용을 다음에 오는 변수에 넣어주는 역할을 한다.

그래서 8행을 해석하면 radius변수에 내가 입력한 값을 입력한다- 는 뜻이다.

스트림 연산자가 이해하기 힘들다면 데이터를 여기로 보내요~ 저기로 보내요~ 하는 화살표 정도로 생각하면 쉬울것 같다.


변수를 선언할때나 함수를 선언할때나 우리는 이름을 지어주게 된다. 이 이름들을 "식별자" 라고한다.

식별자를 지어줄때는 규칙이 있다.

1. 문자와 숫자, 그리고 _(언더 바)만 쓸수있다.

2. 식별자의 첫번째가 숫자로 올수는 없다. ex. 1num은 안됨. _1num은 됨. 당연히 num1도 됨.

3. 식별자 이름으로 예약어는 못쓴다.

4. 식별자 길이제한은 없는데 컴파일러마다 달라서 보통 31자 이하로 만드는 것을 권장한다.


그냥 하다보면 저절로 익혀진다. 원래 작명이 어려운거임.


다시 변수 이야기로 오자.

변수를 선언한다는 것은 지금부터 쓸 USB를 만들어주겠다는 말이다.

USB가 생겼으니 데이터를 집어 넣어보자.

이 처음 데이터를 집어넣어주는 것을 보고 "초기화"라고한다. 용어가 너무 많아 외우기 힘들다고 생각이 들것같다. 외우지마라. 그냥 이런게 있구나 하고 넘어가자.

초기화는 해도 되고 안해도 되는데 보통은 해주는게 깔끔하다. 위 예제에서는 초기화를 안한것처럼 보이겠지만. 우리는 8행에서 초기화를 해줬다.

그렇다. 그냥 변수에 값을 넣으면 초기화라고 하는것이다.

11행 에서 처럼 수식을 써서 계산하게 하려면 계산할 값이 있어야 하지 않겠는가. 항상 프로그램이 정상적으로 동작하려면 초기화는 필수가 되는것이다.


초기화하는 방법이다.

1
2
3
4
5
6
int i = 10//변수를 선언하고 값을 넣어준다.
 
int i; //변수를 만들고
= 10// 값을 넣어준다.
 
//위 두 표현이 같은 표현이다.
cs

나는 변수가 여러개 필요한데 언제 한 줄씩 쓰고있냐 귀찮게ㅠㅠ 하시는 분들은 다음을 잘 보도록.

변수를 선언할 때는 한번에 같은 유형의 변수를 여러개 선언해줄수가 있다.

1
int num1, num2, num3
cs

나는 int라는 유형의 변수를 세개 선언해준 것이다.


한번에 여러개도 초기화 할수있다.

1
2
3
4
5
6
int i = 1, j =2;
int i(1), j(2);
//둘다 똑같은 표현이다.
 
int i = j = k = 10;
// 같은 값으로 여러개의 변수를 초기화 하는 방법이다.
cs

대입

다음으로 대입에 대해서 알아보자.

대학입시의 대입이 아니라 수식에 대입하다 할때 대입이다.

우리는 위에서 변수에 값을 넣어주는것을 배웠다. 다른 방법으로 변수에 데이터를 넣어주는 방법을 배워보자.

우리는 수학을 배우면서 1 + 2 = 3 이라고 배웠다. 등호를 기준으로 왼쪽과 오른쪽의 값이 같다는 표현이다.

컴퓨터는 좀 다르다. 컴퓨터에서 쓰는 =(등호)는 등호가 아니라 "대입연산자"라고 한다.

1
변수 = 수식;
cs
수식을 변수에 대입한다는 말이다. 그리하여 컴퓨터 언어에서는 이런 식도 가능해진다.

1
= x + 1
cs
우리가 아는 방정식으로 계산하면 x가 소거되고 0 = 1 이 되어 말도안되는 수식이지만 컴퓨터는 "같다" 가 아니라 "대입한다" 여서

"지금부터 변수 x의 값은 x + 1 이다!(변수 x에 값 x + 1을 넣어준다!)" 가 되는것이다.


이름상수


정의는 프로그램 실행동안 변하지 않는 영구적인 값.


쉽게 말해 이름상수는 말그대로 항상 똑같은 수를 매번 치기 귀찮으니까 변수 선언하듯 이름을 지어주는 것이다.


예를 들면 3.141592..라는 숫자는 원주율(pi)라는 이름을 가지고 있다. 이 값은 변하지 않는 수라서 우리가 이름을 지어준것이다.

컴퓨터에서도 똑같이 가능하다.

1
const 데이터유형 상수이름(대문자) = 값;
cs

이렇게 쓸수있다. 예제로 보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
int main() {
    const double PI = 3.14159;
    
    double radius;
    cout << "Enter a radius: ";
    cin >> radius;
 
    double area = radius * radius * PI;
 
    cout << "The area is ";
    cout << area << endl;
 
    return 0;
}
cs
5행에서 나는 이름상수를 만들어주고 11행 계산식에서 상수값인 3.14159대신 PI를 써서 간결하게 프로그래밍을 하였다.


이렇게 하는거에요. 별거 없죠?


데이터 유형(Data Type)



다음은 데이터 유형과 연산을 알아보자.

숫자 유형의 종류는 다음과 같다.


short, unsigned short, int signed, unsigned, long, unsigned long, float, double, long double


시발 많다. 외울 필요는 없는데 상황에 따라 프로그래머는 이 유형들을 적절하게 사용할줄 알아야한다. 그렇게 하기 위해서는 차이를 알아야하지 않겠는가?

그렇게 중요한 부분은 아니다. 나중에 생각안나면 다시 이 부분만 읽어봐도 좋다. 넘어가도 된다. 그래도 알고 싶은 분들은 데이터 타입을 검색해보자.

우리가 알아야하고 주로 쓰는 것은 int, long, float, double 정도이다.


int와 long 타입은 정수형이다. 1, 2, 3, ... 같이 숫자를 말한다.범위는 32비트(2의 32승,음수를 포함하니 -2의31승부터 2의 31승-1 까지의 모든 정수)이다.


float과 double은 부동소수점(떠다니며 움직이는 소수점)으로, 실수형이다.

float의 범위는 음수를 포함한 32비트만큼의 실수이고,

double은 그 두배인 64비트만큼의 실수이다.


그 외 위에서 소개한 unsigned가 붙는 녀석들은 부호가 없는 애들이다. 그니까 양수만 취급함.


범위에 대한 부분은 예제를 통해 직접 코딩하여 돌려보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <limits>
using namespace std;
 
int main() {
    cout << "INT_MIN is " << INT_MIN << endl;
    cout << "INT_MAX is " << INT_MAX << endl;
    cout << "LONG_MIN is " << LONG_MIN << endl;
    cout << "LONG_MAX is " << LONG_MAX << endl;
    cout << "FLT_MIN is " << FLT_MIN << endl;
    cout << "FLT_MAX is " << FLT_MAX << endl;
    cout << "DBL_MIN is " << DBL_MIN << endl;
    cout << "DBL_MAX is " << DBL_MAX << endl;
 
    return 0;
}
cs

복붙해서 돌려봅시다. 아물론 다른 소스에 메인함수있으면 오류난다!!


산술연산자


다음은 산술연산자이다. 그렇다. 우리가 계산식에 쓰는 그 연산자이다.

+, -, *, /, % 다섯개다.

엥 왜 다섯개지? 4개아님? 하는 분들을 위해 설명하자면,


앞에 네 개는 우리가 아는 더하기, 빼기, 곱하기, 나누기가 맞다. 근데 %는 도대체 무엇이냐?


%는 나눈 나머지를 값으로 내놓는 연산자다. / 얘는 몫을 값으로 내놓는데 % 얘는 나머지가 나옴.


이해를 위해 예제를 가져왔다.


1
2
3
10 / 7 = 1 // 1.4285...를 기대했다면 호기심을 참고 글을 조금만 더 읽어보자. 아무튼 소숫점 다 짜르고 몫만 나옴.
 
10 % 7 = 3 //나머지 값 도출.
cs


같은 숫자인데 연산자가 다르니 출력값이 다르다.


근데 왜 1행은 1.4285..가 안나오고 왜 1만나왔어요? 해서 설명해준다.


Python의 경우 저렇게 계산시켜도 1.4285...가 나온다. 존나신기해. 근데 우리의 C++은 멍청이라서기계와 가까워서 같은 데이터 타입끼리만 계산할줄안다.


그래서 int형인 10을 int형인 7로 나누라고 하니까 계산결과도 int형으로 출력하는것이다.


그럼 소수점이 나오게 하려면 어떻게 해야하나요? 이렇게 하면된다.

1
10 / 7.0 = 1.428... // 둘중에 하나라도 실수형태로 입력해야 결과도 실수형으로 나온다.
cs


연산순서는 초등학교 수학할때 배웠던 혼합계산이랑 똑같다. 괄호부터 계산하고, 곱하기 나누기 먼저계산하고, 그다음 더하기 빼기 계산한다. 순위가 같으면 왼쪽부터 오른쪽으로 계산한다.


증강 대입 연산자


말이어렵다. 근데 코드로 보면 쉬움.


위에서 한번 보여준 x = x + 1 문장을 기억하는가? 이 문장을 아주 쉽게 나타내주는 연산자가 있다.


1
2
3
4
= x + 1;
 
+= 1;
//둘다 같은 뜻이다.
cs

개편하다. 저 +자리에 위에서 알아본 5가지 산술연산자를 넣으면 된다. 뜻은 1행이랑 똑같음.

연산 순서는 항상 제일 마지막에 한다.


증감 연산자


이름이 비슷한 연산자인데 하는 일은 전혀 다르다. 얘는 변수의 값을 1만큼 더해주거나 빼주는 연산자이다. 이렇게 생겼다.

1
2
3
4
5
++i; // 전위 증가. 
--i; // 전위 감소.
 
j++// 후위 증가.
j--// 후위 감소.
cs

이렇게 보면 서로 엄청 비슷하게 생겨서 헷갈린다. 그래서 주석 달아놓음.


전위 연산과 후위 연산의 차이점은


먼저 계산하고 출력하느냐


출력 먼저 하고 계산을 하느냐


라고 볼수있다. 이해가 잘 안된다. 예제를 보자.


1
2
3
4
5
6
7
8
9
10
11
int i = 10;
int newNum = 10 * i++;
cout << "newNum is " << newNum << ", i is " << i << endl;
 
// 결과: newNum is 100, i is 11
 
int j = 10;
int newNum = 10 * (++j);
cout << "newNum is " << newNum << ", j is " << j << endl;
 
// 결과: newNum is 110, j is 11
cs

변수 i와 j는 값이 서로 똑같고 계산도 비슷한데 값이 다르게 출력되었다.


이유는 2행과 8행에 있다. 지금부터 컴퓨터가 코드를 어떻게 읽는지 그대로 따라가보겠다.


1행에서 변수 i 가 선언이 되었고 2행에서 newNum 변수를 선언하면서 초기화를 할때 i를 후위증가 시켜주었다. 이때 2행의 해석은


"변수 newNum에 (10 * i)을 넣고 i에 1을 더한다." 이다. 


여기서 newNum에 대입되는 i값은 1행의 i값인 10이 되며, 그 이후 1을 더해준다는 뜻인것이다.


3행부터 i 값은 10이 아닌 11이 되며 출력될때 i의 값은 11이 되어 출력이 되는것이다.


반면 7행의 j는 8행까지 계산이 똑같다. 그러나 j는 전위 증가가 되었다.


그래서 8행의 해석은


"변수 newNum에 (10 * j)를 대입한다. 여기서 j는 7행의 j값인 10에 1을 더한 11로 j 값을 대입한다." 가 되어


10 * 10이 아닌 10 * 11이 되어 newNum은 110, j는 11이 되어 출력된다.


이것이 전위 연산과 후위 연산의 차이점이다. 확실히 숙지하여라. 왜냐하면 반복문 할때 많이 쓸거거든.


오늘은 여기서 글을 마치겠다. 미립자 꿀팁이 많으나 처음부터 너무 많이 배우면 오히려 머리가 꼬일수도 있으니까 여기서 줄이도록 하겠다.


최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함