2022.06.15
프로그램은 업무를 수행하기 위한 절차를 의미한다.
컴퓨터가 우리의 목적을 달성할 수 있도록 필요한 절차를 기술하는것(ing)
어떤일을 어떤 순서로 해야 원하는바를 이룰것 인가? == 프로그래밍
언어란? 사람간에 생각 주고받는 언어
프로그래밍 언어는 컴퓨터에게 내 생각을 전달할 수 있는 도구
언어에 규칙이 있는것 처럼 프로그래밍 언어에도 규칙이 있다.
이를 문법(Syntax)라고 한다.
문법을 지키지 않으면 컴퓨터와 소통할 수 없다.
프로그래밍 언어의 문법은 비슷하기 때문에 하나의 프로그래밍 언어를 통달한다면 다른 프로그래밍 언어를 익히기 수월하다.
문법에 맞춰 적어놓은 명령어
코드를 작성하는 것
코딩과 프로그래밍 은 다르다.
프로그래밍은 목적을 달성할 수 있게 논리적인 절차를 기술하는 것이고
코딩은 이 절차를 바탕으로 명령어로 옮기는 것이다.
프로그래밍 언어는
문법을 의미하는 코어와
문법을 이용해 편하게 프로그래밍 할 수 있도록 도와주는 라이브러리 가 있다.
- 프로그래밍은 무엇일까요? 프로그래밍에 대해서 정리해보세요.
- 프로그래밍 언어란 무엇일까요? 프로그래밍 언어에 대해서 정리해보고, 프로그래밍 언어에는 무슨 언어가 있는지 찾아보세요.
- 여러분은 이전에 코딩과 프로그래밍을 동일한 것으로 생각했나요? 그렇다면 수업을 듣고난 뒤 어떻게 생각이 바뀌었나요?
메모리, 입출력 장치, CPU로 구성
CPU : 우리가 입력한 명령어의 처리를 담당하는 부품 컴퓨터의 두뇌라 할 수 있다.
입력과 출력 : 컴퓨터로 데이터를 주는 것을 입력 컴퓨터가 우리에게 데이터를 주는 것 출력
데이터의 이동방향을 보면 된다.
메모리 : 비트가 저장되는 공간이다. 우리의 데이터가 저장되는 공간이다.
메모리는 여러 단독 주택이 모인 주택 복합 단지에 비유할 수 있는데,
각 집마다 **주소(Address)**가 있으며,
우리가 컴퓨터에 데이터를 저장할 때는 주소를 활용한다.
비트 : 컴퓨터가 사용하는 모든 데이터는 비트(Bit)로 저장된다. 2가지 상태를 나타낼 수 있는 수.
ex) 화재가 발생했다 / 발생하지 않았다, 왼쪽 / 오른쪽, 존재한다 / 존재하지 않는다
비트는 2가지밖에 나타닐 수 없다 그래서
이 비트를 묶어서 바이트(Byte) 로 표현한다.
8Bit == 1Byte
프로그램을 실행하면 프로세스 라는것이 된다 == 실행되고 있는 프로그램
프로세스는 프로그램을 실행하기 위한 여러 가지 데이터를 관리한다.
코드 : 명령어가 저장되는 공간
데이터 : 정적 데이터가 저장되는 공간
힙 : 동적 할당 영역 (동적할당 : 프로그램이 실행 중에 처리되는것)
스택 : 정적 할당 영역 (정적 할당 : 프로그램 실행되기 전에 처리되는것)
코드를 작성하기 위해 필요하다.
메모장, Vim, Visual Studio Code, Sublime Text 등이 있다.
문자를 작성할 수 있으면 상관없다.
코드를 작성했다면 컴퓨터가 실제로 이해할 수 있는 명령어로 바꾸는 과정이 있어야 한다.
이를 컴파일 이라 한다.
컴파일러(Compiler)는 컴파일을 하는 프로그램이다. 컴파일러는 프로그래밍 언어마다 다양하게 존재하며, 우리가 배우는 C++의 경우 GCC, Clang, MSVC 등이 있다.
사람이 하는것이기에 필연적으로 오류가 생긴다.
이런 오류를 버그(Bug)라고 한다.
디버거(Debugger)는 버그를 고칠 수 있게 진행상황을 확인할 수 있는 기능을 제공한다.
프로그램을 개발하기 위한 여러 가지 도구를 하나의 프로그램으로 만든 것을
통합 개발 환경(Integrated Development Environment)이라고 한다.
종류로는 Android Studio, IntelliJ IDEA, Xcode, Visual Studio 등이 있고,
우리는 그 중 Visual Studio 라는 도구를 사용한다.
C++에는 값, 객체, 레퍼런스, 함수, 열거형 등 여러가지 구성 요소가 있다.
iostream 은 헤더 파일(Header File)로 라이브러리가 들어있는 코드 모음이다.
라이브러리는 프로그래밍 하는 데 사용되는 여러 가지 유용한 유틸리티 모음이다.
#include는 전처리기(Preprocessor)라는 것으로 이름에서 알 수 있듯 무언가를 포함한다고 할 수 있다.
프로그래머끼리 정보를 남길 수 있는 도구다. 우리가 작성하는 프로그램에는 아무 영향을 끼치지 않는다.
모든 프로그램의 시작점이다.
" " 으로 묶어서 표현한다.
컴퓨터에게 명령어를 내리는 것
구문은 세미콜론(;) 으로 구분한다.
- 여러분의 이름을 콘솔 창에 출력해보세요.
- 좋아하는 영화나 책의 제목을 콘솔 창에 출력해보세요.
- main 함수를 2개 이상 작성하고, 어떤 오류가 출력되는지 확인해보세요.
- 빌드가 무엇이고, C++ 프로그램의 빌드 과정은 어떻게 일어나는지 정리해보세요.
- 프로그램의 오류에는 무엇이 있으며, 각 오류가 무엇이고, 각 오류에 대한 예제를 정리해보세요.
코드를 바탕으로 프로그램을 만드는 과정이다.
전처리 -> 컴파일 -> 어셈블 -> 링크
전처리 : 컴파일 이전에 일어나는 일들을 말한다.
컴파일 : 우리가 작성한 코드를 어셈블리어로 변환하는 과정을 말한다.
어셈블 : 어셈블리어를 CPU가 이해할 수 있는 기계어로 변환하는 과정을 말한다. 어셈블 이후에는 목적파일이 생성된다.
링크 : 각 목적파일을 연결해 하나로 묶어 실행파일로 만드는 과정이다.
컴파일 오류 : 가장 찾기 쉬운 오류, 문법 오류
링크 오류 : 링크 과정에서 발생한 오류(링크 실패), 어떤 이름에 대한 충분한 정보가 없을때
ex) 함수 선언만 하고 정의하지 않았을 때
런타임 오류 : 실행시간에 발생한 오류(로직 오류), 가장 찾기 어렵다.
타입과 이름으로 이루어진 메모리를 다루는 것
cin >> 입력.
입력한 데이터를 저장해야함 (메모리에)
메모리를 다루기 위해선 객체(Object)를 사용한다
객체를 만드는 방법은 타입과 이름을 적어주면 된다.
데이터를 저장하기 위해 메모리를 얼마나 사용할 것인지, 어떤 데이터인지 지정하는 것.
int integer; // int는 정수를 나나내며, 4바이트를 사용한다.
float realNumber; // float는 실수를 나타내며, 4바이트를 사용한다.
std::string str; // string은 문자열을 나타낸다.
이름의 경우 어떤 데이터인지 잘 나타내도록 명명해야 한다.
키워드를 제외하고 규칙에 맞춰 작성할 수 있다.
- 숫자로 시작할 수 없다.
- 대소문자를 구분한다
- 객체란 무엇인가요?
- 정수, 실수, 문자열을 입력받는 프로그램을 작성해보세요.
- 이름을 지을 때 규칙을 지키지 않으면 어떤 일이 발생하나요?
- 타입이란 무엇인가요?
- 타입중 기본 타입이 있습니다. C++의 기본 타입에는 무엇이 있는지 조사하고 정리해보세요.
프로그램의 실행 흐름에 변화를 줄 수 있는 구문
실행흐름에 분기를 만들어주는 구문
if / switch
진리값(Truth Value) : 비트가 모두 0이면 거짓, 아니면 참
int => 0
float => 0.0
std::string => ""
void* => nullptr
반복하는 구문
for : 반복횟수가 정해져 있을 때
while : 반복횟수가 정해져 있지 않을 때
do-while : 조건을 나중에 평가해야할 때
1에서 100까지 출력한다.
3의 배수는 숫자 대신 Fizz를 출력한다.
5의 배수는 숫자 대신 Buzz를 출력한다.
3과 5의 공배수는 FizzBuzz를 출력한다
#include <iostream>
using namespace std;
int main()
{
for (int a = 1; a <= 100; ++a)
{
if (a % 3 == 0 && a % 5 == 0)
{
cout << "FizzBuzz" << " ";
}
else if (a % 3 == 0)
{
cout << "Fizz" << " ";
}
else if (a % 5 == 0)
{
cout << "Buzz" << " ";
}
else
{
cout << a << " ";
}
}
}
똑같은 성질을 가진 다수의 데이터를 다루기 위한 것
메모리를 연속적으로 저장하는 것
메모리를 논리적으로 구분하여 사용할 수 있다.
10명의 학생들 점수를 받아서 그 반의 평균을 계산하는 프로그램을 작성해보세요
#include <iostream>
using namespace std;
int main()
{
// 10명의 학생들 점수를 받아서 그 반의 평균을 계산하는 프로그램을 작성해보세요
int student[10] = { 0 };
float num = 0.0f;
for (int i = 0; i < 10; ++i)
{
cout << i + 1 << "번째 학생의 점수를 입력하시오 : ";
cin >> student[i];
num += student[i];
}
num = num / 10.0;
cout << "10명의 학생의 평균은 " << num << " 입니다.";
}
#include <iostream>
using namespace std;
int main()
{
char map[10][10] = { 0 };
char a = '\n';
int u = 0;
int d = 0;
while (1)
{
for (int y = 0; y < 10; ++y)
{
for (int x = 0; x < 10; ++x)
{
map[y][x] = '#';
if (x == 8 && y == 8)
{
map[y][x] = 'E';
}
}
}
switch (a)
{
case 'w':
--u;
if (u == -1)
{
u = 0;
}
break;
case 'a':
--d;
if (d == -1)
{
d = 0;
}
break;
case 's':
++u;
if (u == 10)
{
u = 9;
}
break;
case 'd':
++d;
if (d == 10)
{
d = 9;
}
break;
}
map[u][d] = 'P';
for (int i = 0; i < 10; ++i)
{
for (int j = 0; j < 10; ++j)
{
std::cout << map[i][j];
}
std::cout << "\n";
}
std::cout << "\n";
if (u == 8 && d == 8)
{
std::cout << "탈출성공" << "\n";
break;
}
std::cout << "이동할 방향 키를 입력해주세요 : ";
std::cin >> a;
system("cls");
}
}
함수는 일련의 과정에 이름을 붙인 것
절차를 명확하게 작성하고 이중 많이 중복되는 것을 함수화 한다.
함수를 왜 쓰는가> => 모듈화(Modulation)
- 모듈 : 프로그램을 기능별로 분할한 논리적인 일부분 => 절차 중 한 단계를 의미한다.
- 프로그램을 여러 개의 모듈로 나누는 것을 모듈화라고 한다.
모듈화가 왜 필요한가?
- 모듈을 재사용할 수 있다. 즉, 코드의 중복을 줄일 수 있다.
- 관리 단위를 줄일 수 있다. 즉, 유지보수가 편해진다.
- 블록 범위 : 객체가 만들어진 순간부터 블록이 끝날 때까지
- 파일 범위 : 객체가 만들어진 순간부터 프로그램 끝까지
함수로 모듈화를 진행하면서 다른 함수의 객체에 접근해야 하는데, 접근할 수가 없음.
간접 참조 : 어떤 객체를 경유해서 원하는 객체에 접근하는 것. 다른 함수의 객체에 접근할 수 있다.
- 포인터 :
- 레퍼런스 :
- 함수에 인자를 전달할 때 크기가 큰 객체가 있다면 간접 참조를 통해서 비용(시간, 공간(메모리))을 절감할 수 있다. => call by reference
call by reference 와 call by value의 차이점
찾아보기
- 기호상수를 쓰는 이유 : (1) 가독성, (2) 재사용 때문에
- const(변경하지 못하도록 강제할 수 있다) / #define(선언 해 주는것) / 열거형(관련있는 기호 상수를 묶어서 사용할 수 있다.)
나만의 타입을 만들 수 있다.
고도화 된 모듈화 도구
설계하는 입장에선 어렵지만 사용하는 입장에선 쉬워진다. == 모듈화
- 데이터와 기능을 정의할 수 있음.
- 객체가 좀 더 많은 일을 할 수 있게 됨.
- 특징
- 상속 : 코드를 물려주어 재사용하는거
is a relationship
자식클래스 is a 부모클래스 가 성립되어야 함
- 데이터 == 필드
- 함수 == 메소드
타입을 인자로 전달할 수 있다.
코드를 작성하는데 전체적인 로직이 같은데 타입만 다를때 좀 더 간편히 사용하기 위해
- 타입에 관계 없이 일반적인 설계를 할 수 있음.
처음부터 템플릿으로 작업하지 않는다.
코드를 작성하고 테스트를 거쳐 문제가 없다면 템플릿을 쓴다.
입출력 라이브러리
- 파일 입출력 : 파일을 만들거나 삭제하거나 조작할 수 있음.
- 표준파일 입출력 : 콘솔 입출력
문자열 라이브러리
알고리즘 라이브러리
- 랜덤
시간 라이브러리
- 델타타임
컨테이너 / 컬렉션 라이브러리 : 자료구조
수학 라이브러리