프로그래밍 기초 복습 with C++

김동현·2022년 6월 15일
0

2022.06.15

프로그래밍에 대한 이해

프로그래밍

프로그램은 업무를 수행하기 위한 절차를 의미한다.

컴퓨터가 우리의 목적을 달성할 수 있도록 필요한 절차를 기술하는것(ing)

어떤일을 어떤 순서로 해야 원하는바를 이룰것 인가? == 프로그래밍

프로그래밍 언어

언어란? 사람간에 생각 주고받는 언어

프로그래밍 언어는 컴퓨터에게 내 생각을 전달할 수 있는 도구

문법

언어에 규칙이 있는것 처럼 프로그래밍 언어에도 규칙이 있다.

이를 문법(Syntax)라고 한다.

문법을 지키지 않으면 컴퓨터와 소통할 수 없다.

프로그래밍 언어의 문법은 비슷하기 때문에 하나의 프로그래밍 언어를 통달한다면 다른 프로그래밍 언어를 익히기 수월하다.

코드

문법에 맞춰 적어놓은 명령어

코딩

코드를 작성하는 것

코딩과 프로그래밍 은 다르다.

프로그래밍은 목적을 달성할 수 있게 논리적인 절차를 기술하는 것이고

코딩은 이 절차를 바탕으로 명령어로 옮기는 것이다.

코어(Core), 라이브러리(Library)

프로그래밍 언어는

문법을 의미하는 코어와
문법을 이용해 편하게 프로그래밍 할 수 있도록 도와주는 라이브러리 가 있다.

실습해보기

  1. 프로그래밍은 무엇일까요? 프로그래밍에 대해서 정리해보세요.
  1. 프로그래밍 언어란 무엇일까요? 프로그래밍 언어에 대해서 정리해보고, 프로그래밍 언어에는 무슨 언어가 있는지 찾아보세요.
  1. 여러분은 이전에 코딩과 프로그래밍을 동일한 것으로 생각했나요? 그렇다면 수업을 듣고난 뒤 어떻게 생각이 바뀌었나요?

컴퓨터의 동작 원리

구성요소

메모리, 입출력 장치, CPU로 구성

CPU : 우리가 입력한 명령어의 처리를 담당하는 부품 컴퓨터의 두뇌라 할 수 있다.

입력과 출력 : 컴퓨터로 데이터를 주는 것을 입력 컴퓨터가 우리에게 데이터를 주는 것 출력
데이터의 이동방향을 보면 된다.

메모리 : 비트가 저장되는 공간이다. 우리의 데이터가 저장되는 공간이다.

	메모리는 여러 단독 주택이 모인 주택 복합 단지에 비유할 수 있는데, 
    각 집마다 **주소(Address)**가 있으며, 
    우리가 컴퓨터에 데이터를 저장할 때는 주소를 활용한다.

비트 : 컴퓨터가 사용하는 모든 데이터는 비트(Bit)로 저장된다. 2가지 상태를 나타낼 수 있는 수.
ex) 화재가 발생했다 / 발생하지 않았다, 왼쪽 / 오른쪽, 존재한다 / 존재하지 않는다

비트는 2가지밖에 나타닐 수 없다 그래서
이 비트를 묶어서 바이트(Byte) 로 표현한다.
8Bit == 1Byte

프로세스

프로그램을 실행하면 프로세스 라는것이 된다 == 실행되고 있는 프로그램
프로세스는 프로그램을 실행하기 위한 여러 가지 데이터를 관리한다.

코드 : 명령어가 저장되는 공간
데이터 : 정적 데이터가 저장되는 공간
힙 : 동적 할당 영역 (동적할당 : 프로그램이 실행 중에 처리되는것)
스택 : 정적 할당 영역 (정적 할당 : 프로그램 실행되기 전에 처리되는것)

프로그래밍 도구

텍스트 에디터

코드를 작성하기 위해 필요하다.

	메모장, Vim, Visual Studio Code, Sublime Text 등이 있다.
    
    문자를 작성할 수 있으면 상관없다.
    

컴파일러

코드를 작성했다면 컴퓨터가 실제로 이해할 수 있는 명령어로 바꾸는 과정이 있어야 한다.
이를 컴파일 이라 한다.

컴파일러(Compiler)는 컴파일을 하는 프로그램이다. 컴파일러는 프로그래밍 언어마다 다양하게 존재하며, 우리가 배우는 C++의 경우 GCC, Clang, MSVC 등이 있다.

디버거

사람이 하는것이기에 필연적으로 오류가 생긴다.
이런 오류를 버그(Bug)라고 한다.

디버거(Debugger)는 버그를 고칠 수 있게 진행상황을 확인할 수 있는 기능을 제공한다.

IDE

프로그램을 개발하기 위한 여러 가지 도구를 하나의 프로그램으로 만든 것을
통합 개발 환경(Integrated Development Environment)이라고 한다.

	종류로는 Android Studio, IntelliJ IDEA, Xcode, Visual Studio 등이 있고, 
    우리는 그 중 Visual Studio 라는 도구를 사용한다.
    
    

C++의 기본 개념

Hello World

C++에는 값, 객체, 레퍼런스, 함수, 열거형 등 여러가지 구성 요소가 있다.

iostream

iostream 은 헤더 파일(Header File)로 라이브러리가 들어있는 코드 모음이다.
라이브러리는 프로그래밍 하는 데 사용되는 여러 가지 유용한 유틸리티 모음이다.

#include는 전처리기(Preprocessor)라는 것으로 이름에서 알 수 있듯 무언가를 포함한다고 할 수 있다.

주석

프로그래머끼리 정보를 남길 수 있는 도구다. 우리가 작성하는 프로그램에는 아무 영향을 끼치지 않는다.

main( )

모든 프로그램의 시작점이다.

문자열

" " 으로 묶어서 표현한다.

구문

컴퓨터에게 명령어를 내리는 것
구문은 세미콜론(;) 으로 구분한다.

실습해보기

  1. 여러분의 이름을 콘솔 창에 출력해보세요.
  1. 좋아하는 영화나 책의 제목을 콘솔 창에 출력해보세요.
  1. main 함수를 2개 이상 작성하고, 어떤 오류가 출력되는지 확인해보세요.
  1. 빌드가 무엇이고, C++ 프로그램의 빌드 과정은 어떻게 일어나는지 정리해보세요.
  1. 프로그램의 오류에는 무엇이 있으며, 각 오류가 무엇이고, 각 오류에 대한 예제를 정리해보세요.

빌드

코드를 바탕으로 프로그램을 만드는 과정이다.

전처리 -> 컴파일 -> 어셈블 -> 링크

전처리 : 컴파일 이전에 일어나는 일들을 말한다.
컴파일 : 우리가 작성한 코드를 어셈블리어로 변환하는 과정을 말한다.
어셈블 : 어셈블리어를 CPU가 이해할 수 있는 기계어로 변환하는 과정을 말한다. 어셈블 이후에는 목적파일이 생성된다.
링크 : 각 목적파일을 연결해 하나로 묶어 실행파일로 만드는 과정이다.

오류에 대한 이해

컴파일 오류 : 가장 찾기 쉬운 오류, 문법 오류
링크 오류 : 링크 과정에서 발생한 오류(링크 실패), 어떤 이름에 대한 충분한 정보가 없을때

    ex) 함수 선언만 하고 정의하지 않았을 때

런타임 오류 : 실행시간에 발생한 오류(로직 오류), 가장 찾기 어렵다.

객체

타입과 이름으로 이루어진 메모리를 다루는 것

입력하기

cin >> 입력.

입력한 데이터를 저장해야함 (메모리에)
메모리를 다루기 위해선 객체(Object)를 사용한다

타입

객체를 만드는 방법은 타입과 이름을 적어주면 된다.
데이터를 저장하기 위해 메모리를 얼마나 사용할 것인지, 어떤 데이터인지 지정하는 것.

	int integer; // int는 정수를 나나내며, 4바이트를 사용한다.
    float realNumber; // float는 실수를 나타내며, 4바이트를 사용한다.
    std::string str; // string은 문자열을 나타낸다.

이름의 경우 어떤 데이터인지 잘 나타내도록 명명해야 한다.
키워드를 제외하고 규칙에 맞춰 작성할 수 있다.

  1. 숫자로 시작할 수 없다.
  2. 대소문자를 구분한다

실습해보기

  1. 객체란 무엇인가요?
  1. 정수, 실수, 문자열을 입력받는 프로그램을 작성해보세요.
  1. 이름을 지을 때 규칙을 지키지 않으면 어떤 일이 발생하나요?
  1. 타입이란 무엇인가요?
  1. 타입중 기본 타입이 있습니다. C++의 기본 타입에는 무엇이 있는지 조사하고 정리해보세요.

제어문

프로그램의 실행 흐름에 변화를 줄 수 있는 구문

분기문

실행흐름에 분기를 만들어주는 구문

if / switch

진리값(Truth Value) : 비트가 모두 0이면 거짓, 아니면 참

int => 0
float => 0.0
std::string => ""
void* => nullptr

반복문

반복하는 구문

for : 반복횟수가 정해져 있을 때
while : 반복횟수가 정해져 있지 않을 때
do-while : 조건을 나중에 평가해야할 때

반복문 예제 FizzBuzz

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 부모클래스 가 성립되어야 함
- 데이터 == 필드
- 함수 == 메소드
    

템플릿

타입을 인자로 전달할 수 있다.
코드를 작성하는데 전체적인 로직이 같은데 타입만 다를때 좀 더 간편히 사용하기 위해

- 타입에 관계 없이 일반적인 설계를 할 수 있음.
처음부터 템플릿으로 작업하지 않는다.
코드를 작성하고 테스트를 거쳐 문제가 없다면 템플릿을 쓴다.

라이브러리

  • 입출력 라이브러리
    - 파일 입출력 : 파일을 만들거나 삭제하거나 조작할 수 있음.
    - 표준파일 입출력 : 콘솔 입출력

    • 문자열 입출력 : 문자열에서 데이터를 조작하거나 삭제할 수 있다.
  • 문자열 라이브러리

  • 알고리즘 라이브러리
    - 랜덤

  • 시간 라이브러리
    - 델타타임

  • 컨테이너 / 컬렉션 라이브러리 : 자료구조

  • 수학 라이브러리

profile
해보자요

0개의 댓글