경일 메타버스 20220615 11주차 3일 수업내용. 프로그래밍 기초 with C++
프로그래밍(Programming) :
컴퓨터가 우리의 목적을 달성할 수 있도록 필요한 절차를 기술하는 것.
프로그래밍 언어(Programming Language) :
사람 대신에 컴퓨터에게 내 생각을 전달할 수 있는 도구.
문법(Syntax) :
프로그래밍 언어의 일정한 규칙.
문법을 지키지 않으면 컴퓨터와 소통할 수 없다.
코드(Code) :
문법에 맞춰 적어놓은 명령어.
코딩(Coding) :
코드를 작성하는 것.
프로그래밍과 코딩의 차이 :
프로그래밍은 목적을 달성할 수 있게 논리적인 절차를 기술하는 것이며, 코딩은 이 절차를 바탕으로 명령어로 옮기는 것이다.
프로그래밍 언어의 구성
코어(Core) : 문법을 의미.
라이브러리(Library) :
문법을 이용해 많은 사람들이 편하게 프로그래밍 할 수 있도록 도와준다.
구성 요소 : 메모리, 입출력 장치, CPU
CPU(Central Processing Unit) :
우리가 입력한 명령어의 처리를 담당하는 부품.
입력과 출력
입력(Input) : 컴퓨터로 데이터를 주는 것.
출력(Output) : 컴퓨터가 우리에게 데이터를 주는 것.
비트(Bit) :
컴퓨터가 사용하는 모든 데이터는 비트(Bit)로 저장된다.
Binary와 Digit의 합성어로, 2가지 상태를 나타낼 수 있는 수.
비트에 저장할 수 있는 데이터는 무엇이든지 상관 없다.
메모리(Memory) :
비트가 저장되는 공간. 다시 말해 우리의 데이터가 저장되는 공간.
각 메모리마다 주소(Address)가 있다.
프로세스(Process)
프로그램을 실행하면 프로세스(Process)라는 것이 된다.
프로세스는 프로그램을 실행하기 위한 여러 가지 데이터를 관리
프로세스의 4가지 영역
코드(Code) : 명령어가 저장되는 공간이다.
데이터(Data) : 정적 데이터가 저장되는 공간이다.
힙(Heap) : 동적 할당 영역이다.
스택(Stack) : 정적 할당 영역이다.
정적(Static) :
보통 프로그램 실행 전에 무언가를 한다는 것이다.
동적(Dynamic) :
보통 프로그램 실행 시간에 무언가를 한다는 것이다.
텍스트 에디터
코드를 작성. 메모장, Vim, Visual Studio Code 등.
컴파일러
컴파일(Compile) :
코드를 컴퓨터가 실제로 이해할 수 있는 명령어로 바꾸는 과정
컴파일러(Compiler) :
컴파일을 하는 프로그램.
디버거
버그(Bug) : 오류.
디버거(Debugger) :
버그를 고칠 수 있도록 여러 가지 기능을 제공
IDE
통합 개발 환경(Integrated Development Environment).
프로그램을 개발하기 위한 여러 가지 도구를 하나의 프로그램으로 만든 것.
헤더 파일(Header File) :
라이브러리가 들어있는 코드 모음.
라이브러리(Library) :
프로그래밍 하는 데 사용되는 여러 가지 유용한 유틸리티 모음.
전처리기(Preprocessor) :
#include - 무언가를 포함.
주석(Comment) :
프로그래머끼리 정보를 남길 수 있는 도구.
우리가 작성하는 프로그램에는 아무 영향을 끼치지 않는다.
main 함수 :
모든 프로그램의 시작점(Entrypoint) main.
main 함수는 딱 하나만 존재.
구문(Statement) :
컴퓨터에게 명령어를 내리는 것.
구문은 세미콜론(;)으로 구분한다.
반환문 return
빌드(Build) :
코드를 바탕으로 프로그램을 만드는 과정.
전처리(Preprocessing) :
컴파일 이전에 일어나는 일들을 말한다.
컴파일(Compile, Compilation) :
우리가 작성한 코드를 어셈블리어로 변환하는 과정을 말한다.
어셈블(Assemble) :
어셈블리어를 CPU가 이해할 수 있는 기계어로 변환하는 과정을 말한다. 어셈블 이후에는 목적 파일(Object File)이 생성된다.
링크(Link, Linking) :
각 목적 파일을 연결해 하나로 묶어 실행 파일(Executable File)로 만드는 과정이다.
프로그래밍 언어와 빌드 과정
https://st-lab.tistory.com/176?category=872072
컴파일 오류(Compile Error) :
가장 찾기 쉬운 오류로 문법 오류가 발생한 것이다.
링크 오류(Link Error) :
링크 과정에서 발생한 오류,
어떤 이름에 대한 충분한 정보가 없을 때 발생한다.
런타임 오류(Runtime Error) :
실행 시간에 발생한 오류로 버그가 발생한 것을 의미한다.
메모리를 다루기 위해 사용하는 것.
타입(Type) :
데이터를 저장하기 위해 메모리를 얼마나 사용할 것인지,
그리고 어떤 데이터인지 지정하는 것.
이름 :
어떤 데이터인지 잘 나타내도록 명명해야 한다.
이를 위해 코딩 컨벤션(Coding Convention)이라는 것이 있다.
명명 규칙
키워드(Keyword)를 쓸 수 없다.
숫자로 시작할 수 없다.
대소문자를 구별한다.
프로그램의 실행 흐름에 변화를 줄 수 있는 구문.
분기문 :
실행 흐름에 분기를 만들어주는 구문.
if
switch
진리값(Truth Value) :
비트가 모두 0이면 거짓, 아니면 참
반복문 :
반복하는 구문
for :
반복 횟수가 정해져 있을 때
while :
반복 횟수가 정해져 있지 않을 때
do-while :
조건을 나중에 평가해야 할 때
똑같은 성질을 가진 다수의 데이터를 다루기 위한 것
다차원 배열 :
메모리를 논리적으로 구분하여 사용할 수 있다.
일련의 과정에 이름을 붙인 것.
함수를 왜 쓰는가? ⇒ 모듈화(Modulation)
모듈(Module) :
프로그램을 기능별로 분할한 논리적인 일부분 ⇒ 절차 중 한 단계
프로그램을 여러 개의 모듈로 나누는 것을 모듈화라고 한다.
모듈화가 왜 필요한가?
모듈을 재사용할 수 있다.
즉, 코드의 중복을 줄일 수 있다.
관리 단위를 줄일 수 있다.
즉, 유지보수가 편해진다.
범위(Scope) :
객체가 유효한 영역
블록 범위 :
객체가 만들어진 순간부터 블록이 끝날 때까지
파일 범위 :
객체가 만들어진 순간부터 프로그램 끝까지
함수로 모듈화를 진행하면서 다른 함수의 객체에 접근해야 하는데, 접근할 수가 없음.
간접 참조 : 어떤 객체를 경유해서 원하는 객체에 접근하는 것
포인터
레퍼런스
부수적 효과 :
함수에 인자를 전달할 때 크기가 큰 객체가 있다면
간접 참조를 통해서 비용을 절감할 수 있다.
⇒ call by reference
직접 참조를 통한 인자 전달
⇒ call by value
비용 ⇒ 실행 시간, 메모리 공간
전달되는 값은 스택에 복사하여 저장, 매개변수를 초기화함.
레퍼런스에 sizeof를 사용하면, 레퍼런스가 가리키는 타입의 크기가 나온다.
⇒ 이는 sizeof 함수의 동작 방식 때문.
레퍼런스의 크기 (주소값)은 8바이트가 맞다. (x64기준)
https://en.cppreference.com/w/cpp/language/sizeof
기호 상수 :
상수에 이름을 붙인 것. 다시 말해 이름이 있는 상수
기호 상수를 쓰는 이유
가독성
재사용
const
#define
열거형 enum
클래스
클래스는 사용자 정의 타입으로 아래와 같은 멤버(Member)를 가질 수 있다.
멤버는 클래스의 구성 요소를 의미한다.
데이터와 기능을 정의할 수 있다.
데이터 멤버
멤버 함수
내부 타입(Nested Type)
멤버 템플릿
객체가 좀 더 많은 일을 할 수 있게 된다.
템플릿
타입을 인자로 전달할 수 있다.
타입에 관계 없이 일반적인 설계를 할 수 있다.
표준 라이브러리
입출력 라이브러리
파일 입출력 : 파일을 만들거나 삭제하거나 조작할 수 있다.
문자열 입출력
문자열 라이브러리
알고리즘 라이브러리
시간 라이브러리
컨테이너 / 컬렉션 라이브러리 : 자료구조
수학 라이브러리