2022. 6. 15. 16:04ㆍ카테고리 없음
프로그래밍(Progarmming)이란?
컴퓨터가 우리의 목적을 달성할수있도록 필요한 절차를 기술하는 것
프로그래밍은 목적을 달성할 수 있게 논리적인 절차를 기술하는것
프로그래밍 언어(Progarmming Lauguage)란?
사람 대신에 컴퓨터에게 내 생각을 전달할 수 있는 도구라고 할 수 있다.
프로그래밍 언어 또한 일정한 규칙이 있다. 이를 문법(Syntax)이라고 하며,
문법을 지키지 않으면 컴퓨터와 소통할 수 없다.
코드(Code) 문법에 맞춰 적어놓은 명령어를 의미한다.
코딩(Coding) 은 코드를 작성하는것.
코딩은 이 절차를 명령어로 옮기는 것이다.
프로그래밍이랑 코딩은 다르다.
프로그래밍은 컴퓨터에서 우리의 목적을 달성하기위해 논리적인 절차를 기술하는것이고 코딩은 절차를 명령어로 옮기는 것이다.
프로그래밍 언어는 문법을 의미하는 코어(Core) 부분과 문법을 이용해 많은 사람들이 편하게 프로그래밍 할 수 있도록 도와주는 라이브러리(Library) 부분으로 구성된다.
실습해보기
- 프로그래밍은 무엇일까요? 프로그래밍에 대해서 정리해보세요.
- 프로그래밍 언어란 무엇일까요? 프로그래밍 언어에 대해서 정리해보고, 프로그래밍 언어에는 무슨 언어가 있는지 찾아보세요.
- 여러분은 이전에 코딩과 프로그래밍을 동일한 것으로 생각했나요? 그렇다면 수업을 듣고난 뒤 어떻게 생각이 바뀌었나요?
컴퓨터의 동작 원리
크게 구성 요소 3가지 메모리,입출력 장치,CPU
-CPU
우리가 입력한 명령어의 처리를 담당하는 부품.
-입력과 출력
입력(Input) : 컴퓨터로 데이터를 주는 것
출력( Output) : 컴퓨터가 우리에게 데이터를 주는 것
-비트
컴퓨터가 사용하는 모든 데이터는 비트(Bit)로 저장된다.
2가지 상태를 나타낼 수 있는 수 (0,1)
비트에 저장할 수 있는 데이터는 무엇이든지 상관 없다.
8Bit == 1Byte
-메모리
비트가 저장되는 공간
컴퓨터에 데이터를 저장할 때는 주소를 활용한다.
프로세스 = 실행되는 프로그램
프로세스는 프로그램을 실행하기 위한 여러 가지 데이터를 관리하며 아래와 같이 4가지 영역이 존재한다.
- 코드(Code) : 명령어가 저장되는 공간이다.
- 데이터(Data) : 정적* 데이터가 저장되는 공간이다.
- 힙(Heap) : 동적* 할당 영역이다. (실행중) 동적 할당 수명조절이 가능하고 유연함이 있다. 단점 잘못 사용햇을 때는 메모리 누수와 같은 사고가 일어날수 있다.
- 스택(Stack) : 정적 할당 영역이다. (실행전) 정적 할당의 장점 편하다 단점 수명조절 X 유연함이 없다
실습해보기
- 컴퓨터는 어떤 부품으로 구성되어 있으며, 각 부품은 무슨 역할을 하나요?
- CPU :명령어 처리 , 입출력장치 : 데이터를 주는것과 받는것 , 메모리 : 비트가 저장되는 공간
- 비트에 담을 수 있는 데이터를 5가지 나열해보세요.
- char, int , double, float,long double
- 프로세스가 무엇인지 정리해보세요.
- 프로그램을 실행하기 위한 여러 가지 데이터를 관리해주는곳 == 프로그램실행과정
- 코드 : 명령어가 저장되는 공간
- 데이터 : 정적*데이터가 저장되는공간
- 힙 : 동적 할당영역 (실행중)
- 스택 : 정적 할당영역 (실행전)
프로그래밍 도구
기본적인 도구
텍스트 에디터
코드를 작성하기 위해 필요하다 . 예를 들어 메모장, Vim, Visual Studio Code, Sublime Text 등이 있다.
컴파일러
코드를 작성했다면 이를 컴퓨터가 실제로 이해할 수 있는 명령어로 바꾸는 과정이 필요하다.
바꾸는 과정 컴파일(Compile) 이라고 하고 바꾸는과정해주는 프로그램을 컴파일러(Compiler)라고 한다.
컴파일러는 EX) C++의 경우 GCC, Clang, MSVC 등이 있다.
디버거
우리가 모든 것에 대해 완벽하게 생각할 수 없기에 필연적 오류가 발생하게 된다.
이런 오류를 버그라고하고, 디버거는 버그를 고칠 수 있게끔 여러 가지 기능을 제공함.
IDE
상기된 것을 포함하여 프로그램을 개발하기 위한 여러 가지 도구를 하나의 프로그램으로 만든 것을 통합 개발 환경(Integrated Development Environment)
Ex) Android Studio, IntelliJ IDEA, Xcode, Visual Studio
우리는 Visual Studio 사용한다.
C++의 기본 개념
Hello World
C++에는 값, 객체, 레퍼런스, 함수, 열거형 등 여러 가지 구성 요소가 있다.
<iostream> 헤더 파일로 라이브러리가 들어있는 코드 모음
라이브러리(Library) 프로그래밍 하는 데 사용되는 여러 가지 유용한 유틸리티모음
#include는 전처리기(Preprocessor)라는 것으로 이름에서 알 수 있듯 무언가를 포함한다고 할 수 있다.
컴퓨터에게 명령어를 내리는 것을 구문(Statement)이라고 하며, 구문은 세미콜론(;)으로 구분한다.
주석(Comment)은 프로그래머끼리 정보를 남길 수 있는 도구다. 우리가 작성하는 프로그램에는 아무 영향을 끼치지 않는다.
Comments - cppreference.com
Comments serve as a sort of in-code documentation. When inserted into a program, they are effectively ignored by the compiler; they are solely intended to be used as notes by the humans that read source code. Although specific documentation is not part of
en.cppreference.com
모든 프로그램은 시작점이 있는데, 바로 main 함수이다.
int main()
{
}
빌드(Build)
코드를 바탕으로 프로그램을 만드는 과정을 빌드(Build)라고 한다.
- 전처리 : 컴파일 이전에 일어나는 일들을 말한다.
- 컴파일 : 우리가 작성한 코드를 어셈블리어로 변환하는 과정을 말한다.
- 어셈블 : 어셈블리어를 CPU가 이해할 수 있는 기계어로 변환하는 과정을 말한다. 어셈블 이후에는 목적 파일(Object File)이 생성된다.
- 링크 : 각 목적 파일을 연결해 하나로 묶어 실행 파일(Executable File)로 만드는 과정
오류에 대한 이해
오류에는 여러 종류가 있는데, 우리는 이에 대해 이해하고 있어야 이 오류를 고치기 위해 어디서부터 출발할지 알 수 있다.
- 컴파일 오류(Compile Error) : 가장 찾기 쉬운 오류로 문법 오류가 발생한 것이다.
- 링크 오류(Link Error) : 링크 과정에서 발생한 오류로 어떤 이름에 대한 충분한 정보가 없을 때 발생한다.
- 런타임 오류(Runtime Error) : 실행 시간에 발생한 오류로 버그가 발생한 것을 의미한다. 가장 찾기 어렵다.
실습해보기
- 빌드가 무엇이고, C++ 프로그램의 빌드 과정은 어떻게 일어나는지 정리해보세요.
전처리 -> 컴파일 -> 어셈블 -> 링크
전처리 필요없는 데이터를 제외해주고 컴파일에서 코드를 어셈블리어로 바꿔주고 어셈블에서 기계어로 바꿔주고 각 파일을 묶어 실행 파일로 만드는 과정
- 프로그램의 오류에는 무엇이 있으며, 각 오류가 무엇이고, 각 오류에 대한 예제를 정리해보세요.
객체
메모리를 어떻게 사용할 것인가?
입력하기
이전에 Hello, World 프로그램에서는 단순히 문자열을 출력했다.
메모리를 다루기 위해서는 객체를 사용된다.
객체를 만드는 방법은 타입과 이름을 적어주면 된다. 타입(Type)은 데이터를 저장하기 위해 메모리를 얼마나 사용할 것인지, 그리고 어떤 데이터인지 지정하는 것
int integer; // int는 정수를 나타내며, 4바이트를 사용한다.
float realNumber; // float는 실수를 나타내며, 4바이트를 사용한다.
std::string str; // string은 문자열을 나타낸다.
이름의 경우 어떤 데이터인지 잘 나타내도록 명명해야 한다.
실습해보기
- 객체란 무엇인가요?
- 정수, 실수, 문자열을 입력받는 프로그램을 작성해보세요.
- 이름을 지을 때 규칙을 지키지 않으면 어떤 일이 발생하나요?
가독성이 떨어져 무슨생각으로 만들었는지 이해하기가 힘들다.
- 타입이란 무엇인가요?
타입 중 기본 타입(Fundamental Type)이라는 것이 있습니다. C++의 기본 타입에는 무엇이 있는지 조사하고 정리해보세요.
산술 연산
# 제어문
프로그램의 실행 흐름에 변화를 줄 수 있는 구문 즉 명령어
-분기문 : 실행흐름에 분기를 만들어주는 구문
> if
> 진리값(truth Value) :
비트가 모두 0이면 거짓
아니면 참
int = > 0
float = > 0.0f
std::string >> " "
void* >> nullptr
> swich
-반복문 : 반복하는 구문
배열(array) 같은 타입으로 된 여러 개의 객체를 한 번에 다루고자 할 때 사용
> for : 반복횟수가 정해져 있을 때
/ while 반복횟수가 정해져 있지 않을 때:
/ do while : 조건을 나중에 평가해야 할 때
#Fizzbuzz 실습하기
1. 1~ 100까지 출력한다.
2. 3의 배수는 숫자 대신 Fizz를 출력한다.
3. 5의 배수는 숫자 대신 buzz를 출력한다.
4. 3과 5의 공배수에는 Fizzbuzz를 출력한다.
int main()
{
int loop = 1; // 1~ 100 까지 공배수 출력
while (loop < 101)
{
if (loop % 3 == 0 && loop % 5 == 0)
{
cout << "Fizzbuzz : " << loop << endl;
}
else if (loop % 3 == 0)
{
cout << "Fizz : " << loop << endl;
}
else if (loop % 5 == 0)
{
cout << "buzz : " << loop << endl;
}
else
{
cout << loop << endl;
}
loop++;
}
}
# 배열
똑같은 성질의 가진 다수의 데이터를 다루기 위한 것
실습1.
10명의 학생들 점수를 받아서 그 반의 평균을 계산하는 프로그램을 작성해보세요.
int main()
{
//학생 ,점수 , 평균
int student[STUDNET_COUNT] = { 0 };
float sum = 0.0f;
float number = 0.0f;
for (int i = 0; i < STUDNET_COUNT; i++)
{
cout << "학생의 점수를 입력해주세요 : ";
cin >> number;
student[i] = number;
sum += number;
}
cout << "평균 : " << sum / STUDNET_COUNT << endl;
}
실습2.
# 탈출게임(?)
1. 플레이어는 P로 표현한다.
2. 플레이어의 초기 위치는 (0, 0)이다.
3. 맵은 10x10으로 표현한다.
4. 탈출지점은 E로 표현한다.
5. 탈출지점의 위치는 (8, 8)이다.
6. 키입력은 w / a / s / d이다.P#########
##########
##########
##########
##########
##########
##########
##########
########E#
##########
이동할 방향 키를 입력해주세요 :
struct place
{
int x;
int y;
};
int main()
{
place player;
place finish;
player.x = 0;
player.y = 0;
finish.x = 8;
finish.y = 8;
int loop = 1;
char map[10][10] = { 0 }; // 맵 생성
char input = ' ';
while (loop)
{
system("cls");
for (int i = 0; i < STUDNET_COUNT; i++) // 세로
{
for (int j = 0; j < STUDNET_COUNT; j++) //가로
{
map[i][j] = '#';
map[player.x][player.y] = 'P'; //
map[finish.x][finish.y] = 'E';
cout << map[i][j];
}
cout << endl;
}
cout << "키입력을 해주세요 : ";
cin >> input;
if ((input != 'w') && (input != 's') && (input != 'a') && (input != 'd'))
{
continue;
}
switch (input)
{
case 'w':
{
if(player.x > 0)
{
player.x--;
}
break;
}
case 's':
{
if (player.x < 10)
{
player.x++;
}
break;
}
case 'a':
{
if (player.y > 0)
{
player.y--;
}
break;
}
case 'd':
{
if(player.y < 10)
{
player.y++;
}
break;
}
default:
break;
}
if (map[player.x][player.y] == map[finish.x][finish.y])
{
loop = 0;
}
}
cout << "탈출 성공";
}
헷갈린 부분 swich 부분 2차원 배열만들고 써야하는데 x,y좌표 look up table 사용 클래스랑 같이사용 예외처리 해결
해결방법 or부분 and로 바꾸고 할당연산자으로 유무처리 해결
# 함수 <- 쓰기전에 구현부터 잘해보자!
함수는 일련의 과정에 이름을 붙인 것.
- 함수를 왜 쓰는가? => 모듈화(Modulation)
>- 모듈 : 프로그램을 기능별로 분할한 논리적인 일부분 => 절차 중 한 단계를 의미한다.
> - 프로그램을 여러 개의 모듈로 나누는 것을 모듈화라고 한다.
-모듈화가 왜 필요한가?
1. 모듈을 재사용할 수 있다. 즉, 코드의 중복을 줄일 수 있다.
2. 관리 단위를 줄일 수 있다. 즉, 유지보수가 편해진다.
범위 : 객체가 유효한 영역을 일컬음
> - 블록 범위 : 객체가 만들어진 순간부터 블록이 끝날 때까지 ,지역변수
> - 파일 범위 : 객체가 만들어진 순간부터 프로그램 시작부터 끝까지 ,전역변수
-함수로 모듈화를 진행하면서 다른 함수의 객체에 접근해야 하는데, 접근할 수가 없음
- 간접 참조 : 어떤 객체를 경유해서 원하는 객체에 접근하는 것
> - 포인터
> - 레퍼런스
> - 함수에 인자를 전달할 때 크기가 큰 객체가 있다면 간접 참조를 통해서 비용(실행 시간,메모리 공간)을 절감할 수 있다.
=> call by reference
128바이트 => 자원을 꽤 소모하게 된다.
간접 참조를 하면 8바이트를 소모하게 된다.
포인터가 아닐경우는 메모리를 복사할당을 해버린다.
-기호 상수 : 상수에다가 이름을 붙인 것 , 다시 말해이름이 있는 상수 (매직넘버 쓰지말자 상대방이 알아보기힘들다)
> - 기호 상수를 쓰는 이유는 (1) 가독성, (2) 재사용 때문이다.
> - const / #define / 열거형
const : 붙이면 붙일수록 프로그램은 안정화된다 . -> 붙이다가 수정이 필요한 부분이 있으면 때도록 하자
-나만의 타입을 만들 수 있다.
C++에서는 class란 것으로 나만의 타입을 만들 수 있다.
사용자ㅣ 정의 타입
-클래스
클래스
클래스는 사용자 정의 타입으로 아래와 같은 멤버(Member)를 가질 수 있다. 멤버는 클래스의 구성 요소를 의미한다.
- 데이터 멤버
데이터를 저장한다. 다시 말해 객체다.
필드라고도 한다.
- 멤버 함수
타입의 기능 부분이다.
메소드(Method)라고도 한다.
- 내부 타입(Nested Type)
클래스 안에 다른 클래스를 만들거나,열거형,혹은 타입 별칭을 지정할 수 있다.
- 멤버 템플릿
템플릿을 작성할 수도 있다. 템플릿은 후술한다.
> - 데이터와 기능을 정의할 수 있음.
> - 객체가 좀 더 많은 일을 할 수 있게 됨.
상속 클래스 쓸때 객체지향적 사고를 방식으로 코드를 짜야된다.
is - a relationship
자식 클래스 is a 부모 클래스 :
Person is a Name = > X , 설계를 잘못한 것
객체지향적 설계를 하면 반복문이 보기 힘들다.
일반화 프로그래밍(Generic Programming)
C++에서는 템플릿이라는 기능으로 지원하고 있다.
템플릿 : 타입을 인자로 전달할 수 있다.
> - 타입에 관계 없이 일반적인 설계를 할 수 있음.
입출력 라이브러리
> - 파일 입출력 : 파일을 만들거나 삭제하거나 조작할 수 있음.
| > - 표준파일 입출력 : 콘솔 입출력
> - 문자열 입출력
-문자열 라이브러리
-알고리즘 라이브러리
| - 랜덤
- 시간 라이브러리
| - deltatime
- 컨테이너 / 컬렉션 라이브러리 : 자료구조
| - 좋은거 쓰자
- 수학 라이브러리
| - 컨텐츠 구현