26일 차 교육 내용 메모를 옮겨 본다.
지난 교육에 이어서 클래스와 복사에 대한 교육이 이루어졌나 보다.
클래스 friend 선언
- 접근 지정을 파괴하는 아무 곳에서나 사용할 수 있도록 지원하는 키워드
- 함수 / class 지원
- 하지만 쓸 이유는 별로 없다.
함수의 반환되는 자료형에 따라 &, * 등에 대한 저장 되는 데이터의 규약을 신경 써야 한다.
- 반환이 필요한 것이면 &
- 전달하는 것이면 *
- 어떤 형식을 사용할 것인지 잘 판단 해야 한다.
메모한 내용이 이게 다다.
실습 위주로 교육된 하루 인지, 당일 메모를 부실하게 한 것인지 모르겠다.
아마도 전날 교육에 이어서 클래스 변수 복사를 통한 예제 위주로 진행됐을 거 같다.
2019년 4월 1일 월요일
2019년 3월 30일 토요일
국비 교육 : 게임 프로그래밍 025일
25일 차 교육 메모를 옮겨본다.
클래스에 대한 내용으로 메모가 작성되어 있다.
클래스 선언은 header로 뺄 수 있다.
클래스 함수는 선언과 함수가 같이 관리 되어야 한다.
클래스. 멤버 함수 선언 멤버 함수 작성을 여러 파일에 나누어 작성할 수 있다.
- 클래스 본체는 header에 멤버 함수 내용은 cpp에 분리해 관리
얇은 복사
- 클래스는 객체 간 기본 대입 연산자(=)를 지원한다.
- 지원되는 연산자로 객체 간 정보를 대입하는 행위를 의미한다.
- 단, 동적 할당한 포인터 변수의 경우 문제가 생긴다. (메모리 누수)
- 생성자, 소멸자를 이용해 동적 할당의 선언과 해제를 관리해야 한다.
- 방지법
1) 멤버 변수에 동적할당을 안 쓴다.
2) 문법적 객체 간 복사를 방지한다.
깊은 복사
- 대입 연산자와 복사 생성자를 오버로딩 한다.
- 초기화 및 대입에 대한 연산자 오버로딩을 구현한다.
- 동적 할당할 개체 → 신규 개체로 1:1 값 복사를 진행한다.
메모 내용을 이렇게 옮겨 적어 보니, 아주 어정쩡한 내용으로 작성됐다.
파일 관리 및 선언에 대한 내용과 함께 클래스에 대한 설명, 변수 복사와 관련된 내용이 교육된 거 같은데 정리된 내용으로는 아주 부실해 보인다.
클래스에 대한 내용으로 메모가 작성되어 있다.
클래스 선언은 header로 뺄 수 있다.
클래스 함수는 선언과 함수가 같이 관리 되어야 한다.
클래스. 멤버 함수 선언 멤버 함수 작성을 여러 파일에 나누어 작성할 수 있다.
- 클래스 본체는 header에 멤버 함수 내용은 cpp에 분리해 관리
얇은 복사
- 클래스는 객체 간 기본 대입 연산자(=)를 지원한다.
- 지원되는 연산자로 객체 간 정보를 대입하는 행위를 의미한다.
- 단, 동적 할당한 포인터 변수의 경우 문제가 생긴다. (메모리 누수)
- 생성자, 소멸자를 이용해 동적 할당의 선언과 해제를 관리해야 한다.
- 방지법
1) 멤버 변수에 동적할당을 안 쓴다.
2) 문법적 객체 간 복사를 방지한다.
깊은 복사
- 대입 연산자와 복사 생성자를 오버로딩 한다.
- 초기화 및 대입에 대한 연산자 오버로딩을 구현한다.
- 동적 할당할 개체 → 신규 개체로 1:1 값 복사를 진행한다.
메모 내용을 이렇게 옮겨 적어 보니, 아주 어정쩡한 내용으로 작성됐다.
파일 관리 및 선언에 대한 내용과 함께 클래스에 대한 설명, 변수 복사와 관련된 내용이 교육된 거 같은데 정리된 내용으로는 아주 부실해 보인다.
2019년 3월 28일 목요일
국비 교육 : 게임 프로그래밍 024일
24일 차 교육 내용 메모를 옮겨 적어 본다.
멤버 연산자와 연산자 오버로드에 대한 내용이 무지무지 간략히 작성되어 있다.
멤버 연산자
- 클래스의 연산을 위해 지원되지 않는 연산자를 제작할 수 있다.
연산자 오버로드
- 연산자로 지원하지 않는 멤버(클래스)의 연산을 위해 연산 기호 처리를 할 수 있도록 지원해 주는 함수 기능
여기까지가 메모 내용의 끝이다.
멤버 연산자를 제작해 클래스 변수들을 이용한 연산자 처리에 대한 내용이 강의 되지 않았나 생각 든다.
예를 들어 vector2 클래스를 제작하고 vector2 클래스 변수 간의 연산을 기호로 처리할 수 있도록 하는 프로그래밍을 하지 않았나 싶다.
멤버 연산자와 연산자 오버로드에 대한 내용이 무지무지 간략히 작성되어 있다.
멤버 연산자
- 클래스의 연산을 위해 지원되지 않는 연산자를 제작할 수 있다.
연산자 오버로드
- 연산자로 지원하지 않는 멤버(클래스)의 연산을 위해 연산 기호 처리를 할 수 있도록 지원해 주는 함수 기능
여기까지가 메모 내용의 끝이다.
멤버 연산자를 제작해 클래스 변수들을 이용한 연산자 처리에 대한 내용이 강의 되지 않았나 생각 든다.
예를 들어 vector2 클래스를 제작하고 vector2 클래스 변수 간의 연산을 기호로 처리할 수 있도록 하는 프로그래밍을 하지 않았나 싶다.
2019년 3월 27일 수요일
국비 교육 : 게임 프로그래밍 023일
23일 차 교육 내용 메모를 옮겨 본다.
클래스에 대한 내용이 메모로 작성되어 있다.
절차 지향 프로그래밍
- 위에서 아래로(절차식) 코드를 작성해 나간다.
개체 지향 프로그래밍
- 모든 데이터를 객체 단위로 처리하는 프로그래밍 방식
- 객체 : 데이터 + 기능
클래스 란.
- 사용자 정의 자료형
- 구조체의 확장형
- 데이터 + 기능
접근 제어 지정자
- private : 클래스 내부 접근
- protected : 상속한 클래스 접근
- public : 외부 사용 가능
this 포인터
- 멤버 함수 내에 존재한다.
- 호출한 변수의 주소를 저장하고 있는 상수 포인터
생성자 함수(생성자)
- 객체 생성 후 바로 자동으로 호출되는 함수
- 함수 오버로딩이 가능
- 반환 자료형이 없음
소멸자
- 객체가 소멸하기 직전에 자동 호출되는 함수
- 함수 오버로딩이 불가능
멤버 이니셜라이저
- 멤버변수 초기화 문법
- 일반 멤버 변수, const 상수 , 레퍼런스 변수
- 상속 관계에서의 부모의 생성자
- 자신의 다른 생성자(생성자 위임)
이상과 같이 기본적인 클래스의 선언 및 사용과 관련되어 필요한 문법적 내용이 작성되어있다.
클래스에 대한 내용이 메모로 작성되어 있다.
절차 지향 프로그래밍
- 위에서 아래로(절차식) 코드를 작성해 나간다.
개체 지향 프로그래밍
- 모든 데이터를 객체 단위로 처리하는 프로그래밍 방식
- 객체 : 데이터 + 기능
클래스 란.
- 사용자 정의 자료형
- 구조체의 확장형
- 데이터 + 기능
접근 제어 지정자
- private : 클래스 내부 접근
- protected : 상속한 클래스 접근
- public : 외부 사용 가능
this 포인터
- 멤버 함수 내에 존재한다.
- 호출한 변수의 주소를 저장하고 있는 상수 포인터
생성자 함수(생성자)
- 객체 생성 후 바로 자동으로 호출되는 함수
- 함수 오버로딩이 가능
- 반환 자료형이 없음
소멸자
- 객체가 소멸하기 직전에 자동 호출되는 함수
- 함수 오버로딩이 불가능
멤버 이니셜라이저
- 멤버변수 초기화 문법
- 일반 멤버 변수, const 상수 , 레퍼런스 변수
- 상속 관계에서의 부모의 생성자
- 자신의 다른 생성자(생성자 위임)
이상과 같이 기본적인 클래스의 선언 및 사용과 관련되어 필요한 문법적 내용이 작성되어있다.
국비 교육 : 게임 프로그래밍 022일
22일차 교육 시 작성된 메모를 작성해 본다.
표준 입출력과 파일 입출력에 대한 내용이 작성되어 있다.
표준 입출력
- cout → 출력 버퍼 → 모니터
- 키보드 → 입력 버퍼 → cin
- 이 때 버퍼를 stream 이라고 호칭한다.
파일 입출력
- 소스 코드 → 파일 버퍼 → 파일 : SAVE, 저장, 출력
- 파일 → 파일 버퍼 → 소스 코드 : LOAD, 불러오기, 입력
- 이 때 파일 버퍼를 fstream 이라 호칭 한다.
- #include<fstream> 을 포함
- ofstream 클래스 : 내보내는데 사용
- ifstream 클래스 : 들여오는데 사용
이런 입출력 구조를 가지고 Save/Load 되는 프로그램 작성 실습을 한 것으로 보인다.
이렇게 다시 정리해 보는데 교육 순서가 평범한 C++ 강의는 아닌 것 같다.
표준 입출력과 파일 입출력에 대한 내용이 작성되어 있다.
표준 입출력
- cout → 출력 버퍼 → 모니터
- 키보드 → 입력 버퍼 → cin
- 이 때 버퍼를 stream 이라고 호칭한다.
파일 입출력
- 소스 코드 → 파일 버퍼 → 파일 : SAVE, 저장, 출력
- 파일 → 파일 버퍼 → 소스 코드 : LOAD, 불러오기, 입력
- 이 때 파일 버퍼를 fstream 이라 호칭 한다.
- #include<fstream> 을 포함
- ofstream 클래스 : 내보내는데 사용
- ifstream 클래스 : 들여오는데 사용
이런 입출력 구조를 가지고 Save/Load 되는 프로그램 작성 실습을 한 것으로 보인다.
이렇게 다시 정리해 보는데 교육 순서가 평범한 C++ 강의는 아닌 것 같다.
국비 교육 : 게임 프로그래밍 021일
21일 차 교육 시 정리된 메모를 옮겨본다.
작성된 내용이 전처리기와 사용자 정의 타입에 관해서 설명되어 있다.
전처리기
- #if , #define 등에 대한 내용을 확인해 보도록 한다.
사용자 정의 타입
- struct { } , enum { } , union { } 등에 대한 내용을 확인해 보도록 한다.
구조체
- struct 이름 { }; 형태로 작성됨
- 패킹으로 인해 가장 큰 크기의 자료형으로 구조체의 크기가 선언된다.
- 이 때 사용되지 않은 빈 공간을 패딩 비트라 부른다.
이렇게 전처리기와 사용자 정의 타입에 대한 교육이 진행된 것 같다.
교육이 책에 작성된 내용 위주로 진행됐는지 메모 내용은 매우 적다.
작성된 내용이 전처리기와 사용자 정의 타입에 관해서 설명되어 있다.
전처리기
- #if , #define 등에 대한 내용을 확인해 보도록 한다.
사용자 정의 타입
- struct { } , enum { } , union { } 등에 대한 내용을 확인해 보도록 한다.
구조체
- struct 이름 { }; 형태로 작성됨
- 패킹으로 인해 가장 큰 크기의 자료형으로 구조체의 크기가 선언된다.
- 이 때 사용되지 않은 빈 공간을 패딩 비트라 부른다.
struct dataA
{
int index; ← 4 byte
double appValue; ← 8 byte
int count; ← 4 byte
};
struct dataB
{
int index; ← 4 byte
char rank; ← 1 byte (index의 남은 4 byte 영역으로 붙음)
double appValue; ← 8 byte
int count; ← 4 byte
};
dataA , dataB 구조체 모두 크기는 24 byte 다.이렇게 전처리기와 사용자 정의 타입에 대한 교육이 진행된 것 같다.
교육이 책에 작성된 내용 위주로 진행됐는지 메모 내용은 매우 적다.
2019년 3월 26일 화요일
국비 교육 : 게임 프로그래밍 020일
20일 차 교육 내용 메모를 옮겨본다.
저번 교육에 이어서 동적 할당에 대한 내용이 계속 교육되었다. 그리고 디버깅과 파일 분할 방식에 대한 내용이 교육되었다.
데이터를 정확히 제어하기 위해서는 소멸, 해제 등에 신경을 써야 한다.
동적 배열은 주소화 함께 길이 정보를 같이 알고 있기에 해제하면 관련된 메모리 영역이 초기화된다.
delete[] values;
values = nullptr;
항상 변수를 null로 초기화하는 습관을 들여야 한다.
버그
- 논리 오류 또는 코드적 오류
디버그
- 소스 코드의 버그를 찾는 행위
디버깅
- 디버그를 하는 행위
디버그 시작 → 단계별 코드 실행 → 중단점 BreakPoint
- VS에서 디버그의 라인별 실행은 F10을 주로 사용한다.
- F11은 내부정의까지 훑고 진행한다.
조사식
- VS에서 지정한 변수를 입력해서 디버깅 시 값을 확인할 수 있는 기능
파일 분할
- 여러 CPP 파일을 사용하는 것을 의미한다.
- 빌드하면 컴파일된 모든 파일은 1개의 파일로 합쳐진다.
- 컴파일되서 한자리에 모인 뒤 링킹을 진행한다.
- 이를 위해 전방선언(프로토타입)이 되어 있어야 한다.
전역 변수
- 두 파일에 동일한 전역 변수가 있을 경우 에러가 발생한다.
- 주 : 선언 , 부 : extern 선언의 방식으로 사용해야 한다.
정적 전역 변수는 해당 cpp 에서만 사용할 수 있다.
다른 cpp에서 선언해 사용할 수 없다.
전처리기(선행 처리기)
- 컴파일 이전에 실행되는 문법
- #이 붙어 선언
- 뒤에 ';'이 붙지 않음
- 한 줄에 하나의 전처리만 가능
- \기호를 사용해 하나의 전처리를 여러 줄에 선언하는 것이 가능
빌드 단계
- 코드 작성 → 컴파일 시작 → 전처리 → 컴파일 → 링킹 → 빌드
#include ○○○○
- < > 로 선언할 경우 지정된 VC++ 설정된 경로 기준
- " " 로 선언할 경우 현재 프로젝트의 경로를 기준
상대 경로
- 실행 파일이 있는 경로 기준
- data/abc.jpg
절대 경로
- 볼륨명(드라이브명)부터 시작하는 경로
- c:/data/abc.jpg
인텔리센스단축키 : ctrl + space bar
헤더 파일
- include를 하기 위한 목적 파일
- 함수 프로토타입을 정의
- define 이나 다른 전처리기를 모아둠
아마도 이날까지 한 개의 cpp 파일로 구현을 해왔고, 이를 헤더와 별개 cpp로 분할해 구현하는 방식이 교육된 것 같다.
저번 교육에 이어서 동적 할당에 대한 내용이 계속 교육되었다. 그리고 디버깅과 파일 분할 방식에 대한 내용이 교육되었다.
데이터를 정확히 제어하기 위해서는 소멸, 해제 등에 신경을 써야 한다.
동적 배열은 주소화 함께 길이 정보를 같이 알고 있기에 해제하면 관련된 메모리 영역이 초기화된다.
delete[] values;
values = nullptr;
항상 변수를 null로 초기화하는 습관을 들여야 한다.
버그
- 논리 오류 또는 코드적 오류
디버그
- 소스 코드의 버그를 찾는 행위
디버깅
- 디버그를 하는 행위
디버그 시작 → 단계별 코드 실행 → 중단점 BreakPoint
- VS에서 디버그의 라인별 실행은 F10을 주로 사용한다.
- F11은 내부정의까지 훑고 진행한다.
조사식
- VS에서 지정한 변수를 입력해서 디버깅 시 값을 확인할 수 있는 기능
파일 분할
- 여러 CPP 파일을 사용하는 것을 의미한다.
- 빌드하면 컴파일된 모든 파일은 1개의 파일로 합쳐진다.
- 컴파일되서 한자리에 모인 뒤 링킹을 진행한다.
- 이를 위해 전방선언(프로토타입)이 되어 있어야 한다.
전역 변수
- 두 파일에 동일한 전역 변수가 있을 경우 에러가 발생한다.
- 주 : 선언 , 부 : extern 선언의 방식으로 사용해야 한다.
정적 전역 변수는 해당 cpp 에서만 사용할 수 있다.
다른 cpp에서 선언해 사용할 수 없다.
전처리기(선행 처리기)
- 컴파일 이전에 실행되는 문법
- #이 붙어 선언
- 뒤에 ';'이 붙지 않음
- 한 줄에 하나의 전처리만 가능
- \기호를 사용해 하나의 전처리를 여러 줄에 선언하는 것이 가능
빌드 단계
- 코드 작성 → 컴파일 시작 → 전처리 → 컴파일 → 링킹 → 빌드
#include ○○○○
- < > 로 선언할 경우 지정된 VC++ 설정된 경로 기준
- " " 로 선언할 경우 현재 프로젝트의 경로를 기준
상대 경로
- 실행 파일이 있는 경로 기준
- data/abc.jpg
절대 경로
- 볼륨명(드라이브명)부터 시작하는 경로
- c:/data/abc.jpg
인텔리센스단축키 : ctrl + space bar
헤더 파일
- include를 하기 위한 목적 파일
- 함수 프로토타입을 정의
- define 이나 다른 전처리기를 모아둠
아마도 이날까지 한 개의 cpp 파일로 구현을 해왔고, 이를 헤더와 별개 cpp로 분할해 구현하는 방식이 교육된 것 같다.
국비 교육 : 게임 프로그래밍 019일
19일 차 교육 내용 메모를 옮겨본다.
C++의 메모리와 관련된 내용이 교육 된 것 같다.
정적 할당
- 지금까지 선언한 모든 변수 선언이 정적 할당
- 선언과 동시에 크기가 정해지며, 중간에 바꿀 수 없다.
- 소멸할 때 운영체제가 자동으로 할당한 메모리를 회수
동적 할당
- 포인터 변수를 선언한다.
- 임의의 공간을 원하는 만큼 할당받고 그 주소를 포인터에 저장한다.
- 포인터를 가지고 할당받은 메모리 공간을 사용한다.
- 다 쓰면 해제해야 한다.
메모리 영역
- 코드 : 소스 코드, 변경 불필요(필요하면 IDE 사용), 코드/함수/제어문
- 데이터 : 프로그램 생성→종료까지 살아 있는 항목, 상수/전역변수/static
- 스택 : 지역변수의 선언과 해제가 나타나는 곳, 지역변수/매개변수/함수의 호출 위치
- 힙 : 동적 할당 데이터를 저장하는 공간으로 실시간 변수 할당
동적 할당 기능을 이용해 지금까지 만들어온 과제들을 확장 가능한 구조로 개선하도록 한다.
이상과 같이 동적 할당 기능을 이용해 데이터의 자유로운 확장/축소가 가능한 프로그램 구현 방식에 대한 내용이 교육되었다. 그리고 지금까지 해온 과제를 동적 할당이 가능하도록 하는 시간으로 교육이 마무리된 거 같다.
C++의 메모리와 관련된 내용이 교육 된 것 같다.
정적 할당
- 지금까지 선언한 모든 변수 선언이 정적 할당
- 선언과 동시에 크기가 정해지며, 중간에 바꿀 수 없다.
- 소멸할 때 운영체제가 자동으로 할당한 메모리를 회수
동적 할당
- 포인터 변수를 선언한다.
- 임의의 공간을 원하는 만큼 할당받고 그 주소를 포인터에 저장한다.
- 포인터를 가지고 할당받은 메모리 공간을 사용한다.
- 다 쓰면 해제해야 한다.
메모리 영역
- 코드 : 소스 코드, 변경 불필요(필요하면 IDE 사용), 코드/함수/제어문
- 데이터 : 프로그램 생성→종료까지 살아 있는 항목, 상수/전역변수/static
- 스택 : 지역변수의 선언과 해제가 나타나는 곳, 지역변수/매개변수/함수의 호출 위치
- 힙 : 동적 할당 데이터를 저장하는 공간으로 실시간 변수 할당
동적 할당 기능을 이용해 지금까지 만들어온 과제들을 확장 가능한 구조로 개선하도록 한다.
이상과 같이 동적 할당 기능을 이용해 데이터의 자유로운 확장/축소가 가능한 프로그램 구현 방식에 대한 내용이 교육되었다. 그리고 지금까지 해온 과제를 동적 할당이 가능하도록 하는 시간으로 교육이 마무리된 거 같다.
2019년 3월 23일 토요일
국비 교육 : 게임 프로그래밍 018일
18일 차 교육 내용을 정리해 본다.
함수에 대한 추가 내용과 텍스트를 제어하는 데 사용 하는 기능이 작성되어 있다.
함수 오버로딩
- 반환 자료형과 관계없이 함수명은 같고, 매개변수가 다른 함수 정의법
- 궁극적으로 호출 형태가 다른 함수 정의법
디폴트 매개변수
- 함수 선언부에 매개변수의 기본값을 지정해 주는 것을 말함
- 디폴트 매개 변수는 오른쪽에서 왼쪽으로 선언된다.
int add(int a , int b = 0 , int c = 0);
- 함수 오버로딩 형태에 주의해야 함
int add(int a = 0 , int b = 0);
void add();
위와 같이 컴파일러가 선택하는 함수가 2가지 이상이 될 경우 사용 못 한다.
문자열 함수
- 문자열 = 문자 배열
- char sample[10] = "abc"
sample의 길이는 3, 크기는 10인 문자열
문자열 변수 사용
- 대입 : a = "Hello";
- 증감 : a = a + "done";
- 비교 : a == "bye";
- 문자열을 위와 같이 사용하고 싶은 경우 문자열 함수를 이용한다.
문자열 함수
- 대입(copy) a = "Hello"; strcpy_s(dest , 크기 , src);
- 증가(cat) a = a + "done"; strcat_s(dest , 크기 , src)
- 비교(cmp) a == "bye"; strcmp(dest , src);
- 길이(len) "hello" strlen(src);
그리고 과제로 대입, 증가, 비교, 길이를 측정할 수 있는 함수를 직접 제작해 보도록 시간이 주어진 것 같다.
이상과 같이 함수와 텍스트 제어와 관련된 내용이 설명되었고, 텍스트 제어와 관련된 과제를 프로그래밍하는 것으로 하루 교육이 진행된 것 같다.
함수에 대한 추가 내용과 텍스트를 제어하는 데 사용 하는 기능이 작성되어 있다.
함수 오버로딩
- 반환 자료형과 관계없이 함수명은 같고, 매개변수가 다른 함수 정의법
- 궁극적으로 호출 형태가 다른 함수 정의법
디폴트 매개변수
- 함수 선언부에 매개변수의 기본값을 지정해 주는 것을 말함
- 디폴트 매개 변수는 오른쪽에서 왼쪽으로 선언된다.
int add(int a , int b = 0 , int c = 0);
- 함수 오버로딩 형태에 주의해야 함
int add(int a = 0 , int b = 0);
void add();
위와 같이 컴파일러가 선택하는 함수가 2가지 이상이 될 경우 사용 못 한다.
문자열 함수
- 문자열 = 문자 배열
- char sample[10] = "abc"
sample의 길이는 3, 크기는 10인 문자열
문자열 변수 사용
- 대입 : a = "Hello";
- 증감 : a = a + "done";
- 비교 : a == "bye";
- 문자열을 위와 같이 사용하고 싶은 경우 문자열 함수를 이용한다.
문자열 함수
- 대입(copy) a = "Hello"; strcpy_s(dest , 크기 , src);
- 증가(cat) a = a + "done"; strcat_s(dest , 크기 , src)
- 비교(cmp) a == "bye"; strcmp(dest , src);
- 길이(len) "hello" strlen(src);
그리고 과제로 대입, 증가, 비교, 길이를 측정할 수 있는 함수를 직접 제작해 보도록 시간이 주어진 것 같다.
이상과 같이 함수와 텍스트 제어와 관련된 내용이 설명되었고, 텍스트 제어와 관련된 과제를 프로그래밍하는 것으로 하루 교육이 진행된 것 같다.
2019년 3월 22일 금요일
국비 교육 : 게임 프로그래밍 017일
17일 차 교육 메모를 옮겨 본다.
콘솔 프로그래밍의 출력 화면을 좀 더 다듬기 위해 C 문법의 입력/출력 제어 방식이 교육된 거 같다. 그리고 프로그램의 호출방식에 대한 내용이 작성되어 있다.
C형 출력으로는 printf 함수를 사용한다.
이스케이프 시퀀스
- 문자 중에 '\'가 붙은 문자들
- 출력되지 않고, 기능을 수행하는 문자
- 한 글자 1byte로 취급한다.
- '\n' : 개행
- '\t' : tab 가로 탭
- '\a' : beep 음 출력
- '\"' : " 출력
- '\0' : null 문자를 의미
- cout에 입력해도 적용된다.
서식 문자
- 출력 문자열에 특정 값을 대입하는 문자
- 앞에 % 가 붙음
- %d : 정수를 출력
- %f : 실수를 출력
- %s : 문자열
- 서식 문자 고급활용이 있으며, 각자 알아보도록 한다.
C형 입력으로는 scanf 함수를 사용한다.
- scanf 함수 보다는 scanf_s 함수를 사용하는 것을 권장한다.
- char형 입력 시 저장공간 길이를 넘쳐도 처리가 되도록 자체 방어 처리가 되어 있다.
- scanf("서식", &변수);
함수 : 명령의 모음
- 반환 자료형 함수명(매개 변수)
{
함수 몸통
}
함수는 전방 선언을 통해 이런 함수가 있다고 알릴 수 있다.
- 전방 선언 = 함수의 원형 = 프로토타입
- 선언 형태 : 반환 자료형 함수명(매개 변수);
매개 변수
- 호출 시 외부변수의 값으로 초기화하는 함수의 지역 변수
지역
- { } 로 구분되는 구역
- 구역 내 return; 는 함수의 종료를 의미
변수
- 지역 변수 : { } 안에 선언되는 변수로 지역이 끝나면 소멸
- 전역 변수 : { } 밖에 선언되는 변수로 프로그램 종료 시 소멸
재귀 호출, 재귀 함수
- 함수가 함수 내부에서 자기 자신을 호출하는 형태
- 장점 : 코드가 간편해진다. (특정 알고리즘에 한해서)
- 단점 : 느리다. (종료 프로세스 , 불필요한 조건)
: 용량 낭비가 심하다. (메모리에 함수를 보관)
: 디버깅이 어렵다.
- 주의점 : 종료 조건(재 호출조건)이 명확해야 한다.
호출 방식 : 호출 시 초기화 값에 대한 형태
- Call By Value : 값에 의한 호출 : 일반 변수
- Call By Address : 주소에 의한 호출 : 포인터 변수
- Call By Reference : 참조에 의한 호출 : 레퍼런스 변수
- 호출 방식의 구분은 외부 변수의 값을 함수 내부에서 변경하는지로 구분한다.
(Call By Address, Call By Reference 는 변경 가능)
Reference 변수
- 기존의 변수에 별칭을 새로 지정하는 문법
- 특성상 초기화와 동시 선언되어야 됨
- 데이터형 & 변수명 = 변수;
int count = 10;
int &num = count;
Call By Value
- 값에 의한 호출
- 매개 변수가 일반 변수들
- 초기화 값이 값의 형태
- 함수 내부에서 외부 변수를 변경할 수 없음
Call By Address
- 주소에 의한 호출
- 매개 변수가 포인터 변수일 경우
- 초기화 값이 주솟값
- 주소 값이 변경할 변수의 주소인 경우에만 변경 가능
Call By Reference
- 참조에 의한 호출
- 매개 변수가 레퍼런스 변수인 경우
-원격지의 변수가 되는 것이기에 값의 수정이 자유로움
그리고 가장 혼돈되는 개념들이 동시에 설명 됐다.
다시 봐도 Call By ~ 에 대한 내용은 하루 강의가 된다고 습득이 되지 않았을 것 같은데 이후 다시 설명되는지는 모르겠다.
콘솔 프로그래밍의 출력 화면을 좀 더 다듬기 위해 C 문법의 입력/출력 제어 방식이 교육된 거 같다. 그리고 프로그램의 호출방식에 대한 내용이 작성되어 있다.
C형 출력으로는 printf 함수를 사용한다.
이스케이프 시퀀스
- 문자 중에 '\'가 붙은 문자들
- 출력되지 않고, 기능을 수행하는 문자
- 한 글자 1byte로 취급한다.
- '\n' : 개행
- '\t' : tab 가로 탭
- '\a' : beep 음 출력
- '\"' : " 출력
- '\0' : null 문자를 의미
- cout에 입력해도 적용된다.
서식 문자
- 출력 문자열에 특정 값을 대입하는 문자
- 앞에 % 가 붙음
- %d : 정수를 출력
- %f : 실수를 출력
- %s : 문자열
- 서식 문자 고급활용이 있으며, 각자 알아보도록 한다.
C형 입력으로는 scanf 함수를 사용한다.
- scanf 함수 보다는 scanf_s 함수를 사용하는 것을 권장한다.
- char형 입력 시 저장공간 길이를 넘쳐도 처리가 되도록 자체 방어 처리가 되어 있다.
- scanf("서식", &변수);
함수 : 명령의 모음
- 반환 자료형 함수명(매개 변수)
{
함수 몸통
}
함수는 전방 선언을 통해 이런 함수가 있다고 알릴 수 있다.
- 전방 선언 = 함수의 원형 = 프로토타입
- 선언 형태 : 반환 자료형 함수명(매개 변수);
매개 변수
- 호출 시 외부변수의 값으로 초기화하는 함수의 지역 변수
지역
- { } 로 구분되는 구역
- 구역 내 return; 는 함수의 종료를 의미
변수
- 지역 변수 : { } 안에 선언되는 변수로 지역이 끝나면 소멸
- 전역 변수 : { } 밖에 선언되는 변수로 프로그램 종료 시 소멸
재귀 호출, 재귀 함수
- 함수가 함수 내부에서 자기 자신을 호출하는 형태
- 장점 : 코드가 간편해진다. (특정 알고리즘에 한해서)
- 단점 : 느리다. (종료 프로세스 , 불필요한 조건)
: 용량 낭비가 심하다. (메모리에 함수를 보관)
: 디버깅이 어렵다.
- 주의점 : 종료 조건(재 호출조건)이 명확해야 한다.
호출 방식 : 호출 시 초기화 값에 대한 형태
- Call By Value : 값에 의한 호출 : 일반 변수
- Call By Address : 주소에 의한 호출 : 포인터 변수
- Call By Reference : 참조에 의한 호출 : 레퍼런스 변수
- 호출 방식의 구분은 외부 변수의 값을 함수 내부에서 변경하는지로 구분한다.
(Call By Address, Call By Reference 는 변경 가능)
Reference 변수
- 기존의 변수에 별칭을 새로 지정하는 문법
- 특성상 초기화와 동시 선언되어야 됨
- 데이터형 & 변수명 = 변수;
int count = 10;
int &num = count;
Call By Value
- 값에 의한 호출
- 매개 변수가 일반 변수들
- 초기화 값이 값의 형태
- 함수 내부에서 외부 변수를 변경할 수 없음
Call By Address
- 주소에 의한 호출
- 매개 변수가 포인터 변수일 경우
- 초기화 값이 주솟값
- 주소 값이 변경할 변수의 주소인 경우에만 변경 가능
Call By Reference
- 참조에 의한 호출
- 매개 변수가 레퍼런스 변수인 경우
-원격지의 변수가 되는 것이기에 값의 수정이 자유로움
int i = 0;
char data[10] = {}; ← 초기화를 하면 0값 즉 \0 의 문자가 입력되어 있다.
cin >> data;
char *a = s;
while(*(a+i)) ← 문자열의 값이 들어가서 while이 정상 동작하고,
{ 끝의 \0 항목 도달 시 while이 종료된다.
코드 본체 이스케이프 문자 \0 는 0 과 같으며 false 처리됨
i++
}
위 코드는 즉 아래와 같이 처리된다.
char data[10] = {};
cin >> data;
for( int i = 0 ; data[i] != 0 ; i++ )
{
코드 본체
}
for를 이용한 반복문이 가능하며 char형에 대해 한시적으로 활용이 가능하다.
char형 배열을 이용한 반복문 활용이다.
이상과 같은 내용이 정리되어 있는데, 다른날에 비해 압도적으로 내용이 많다.그리고 가장 혼돈되는 개념들이 동시에 설명 됐다.
다시 봐도 Call By ~ 에 대한 내용은 하루 강의가 된다고 습득이 되지 않았을 것 같은데 이후 다시 설명되는지는 모르겠다.
2019년 3월 21일 목요일
국비 교육 : 게임 프로그래밍 016일
16차 교육 내용 메모를 정리해 본다.
C++에서 가장 난해한 개념이라 생각하는 포인터에 대해서 강의가 되었나 보다.
포인터
- 주소값을 저장, 변경할 수 있는 메모리 공간
- 값을 저장, 변경할 수 있는 메모리의 공간 = 변수
= 포인터 변수로 부를 수 있다.
메모리 주소를 저장할 수 있는 공간이며, 변수에 주소 위치가 저장된다.
주소 : 메모리상 변수 위치
주소값 : 포인터 변수에 저장된 값
포인터 관련 연산자
& : 변수가 위치한 주소
* : 해당 주소값에 위치한 변수
*(&value)는 value를 의미한다.
- &value : value의 주소
- *(value의 주소) : 주소에 위치한 변수 = value
포인터의 선언
- int *p; p주소값에 위치한 변수는 int 형
- int *p1, p2; p1은 int 포인터, p2는 int 형
- int **p; p에 들어가 있는 변수가 포인터형
다른 함수에서 멤버 변수를 수정할 수 있도록 해줌
- 함수에서 외부 변수를 변경하는데 사용
포인터 선언 -> 주소를 변수에 넘김 -> *를 붙여 주소의 '변수'를 호출해 제어
nullptr = null 포인터
- 주소값이 없다고 표현한다.
- int *p = nullptr; 로 선언한다.
예)
int *p = nullptr;
cout << p + 0 << endl; → 0000 0000
cout << p + 1 << endl; → 0000 0004
cout << p + 2 << endl; → 0000 0008
과 같이 자료형만큼 증가한다.
배열명은 배열을 시작하는 주소다
즉, 배열명[인덱스] = *(배열명 + 인덱스)로 치환된다.
1. 자료형과 const는 선언 위치와 관계가 없다.
- int const a = 3;
- const int a = 3; → 두 선언은 동일하다.
2. *과 const의 선언 위치의 관계성
- const * p → p 주소에 위치한 변수를 상수로 여긴다. (*p 상수 , p 변수)
- * const p → *p는 변수, p는 상수
- const * const p → *p는 상수, p는 상수
3. 자료형과 const 선언 위치의 관계성
- int const *p = &value;
- const int *p = &value; → 두 선언은 동일 하다.
문자열(string) = 문자 집합 = 문자 배열
문자열 입출력
- 문자 배열의 주소를 출력하면, 문자를 연속해서 출력한다.
- cout << name << endl;
- cout << name[0] << name[1] << name[2] << endl; → 두 선언은 동일 하다.
문자열 길이 + 1 = 문자열 크기 = 배열 선언 값
강의가 포인터로 시작해서, 문자열의 활용에 대한 내용까지 진행이 됐다.
다른 날에 비해 복잡한 내용이 하루 만에 처리된 느낌이 든다.
C++에서 가장 난해한 개념이라 생각하는 포인터에 대해서 강의가 되었나 보다.
포인터
- 주소값을 저장, 변경할 수 있는 메모리 공간
- 값을 저장, 변경할 수 있는 메모리의 공간 = 변수
= 포인터 변수로 부를 수 있다.
메모리 주소를 저장할 수 있는 공간이며, 변수에 주소 위치가 저장된다.
주소 : 메모리상 변수 위치
주소값 : 포인터 변수에 저장된 값
포인터 관련 연산자
& : 변수가 위치한 주소
* : 해당 주소값에 위치한 변수
*(&value)는 value를 의미한다.
- &value : value의 주소
- *(value의 주소) : 주소에 위치한 변수 = value
포인터의 선언
- int *p; p주소값에 위치한 변수는 int 형
- int *p1, p2; p1은 int 포인터, p2는 int 형
- int **p; p에 들어가 있는 변수가 포인터형
다른 함수에서 멤버 변수를 수정할 수 있도록 해줌
- 함수에서 외부 변수를 변경하는데 사용
포인터 선언 -> 주소를 변수에 넘김 -> *를 붙여 주소의 '변수'를 호출해 제어
nullptr = null 포인터
- 주소값이 없다고 표현한다.
- int *p = nullptr; 로 선언한다.
예)
int *p = nullptr;
cout << p + 0 << endl; → 0000 0000
cout << p + 1 << endl; → 0000 0004
cout << p + 2 << endl; → 0000 0008
과 같이 자료형만큼 증가한다.
배열명은 배열을 시작하는 주소다
즉, 배열명[인덱스] = *(배열명 + 인덱스)로 치환된다.
1. 자료형과 const는 선언 위치와 관계가 없다.
- int const a = 3;
- const int a = 3; → 두 선언은 동일하다.
2. *과 const의 선언 위치의 관계성
- const * p → p 주소에 위치한 변수를 상수로 여긴다. (*p 상수 , p 변수)
- * const p → *p는 변수, p는 상수
- const * const p → *p는 상수, p는 상수
3. 자료형과 const 선언 위치의 관계성
- int const *p = &value;
- const int *p = &value; → 두 선언은 동일 하다.
문자열(string) = 문자 집합 = 문자 배열
문자열 입출력
- 문자 배열의 주소를 출력하면, 문자를 연속해서 출력한다.
- cout << name << endl;
- cout << name[0] << name[1] << name[2] << endl; → 두 선언은 동일 하다.
- 주소 출력이 아닌 값이 출력되는 문자 배열만 특별히 처리해 준다.
문자열 길이 + 1 = 문자열 크기 = 배열 선언 값
강의가 포인터로 시작해서, 문자열의 활용에 대한 내용까지 진행이 됐다.
다른 날에 비해 복잡한 내용이 하루 만에 처리된 느낌이 든다.
2019년 3월 19일 화요일
국비 교육 : 게임 프로그래밍 015일
15일 차 교육 메모를 옮겨 본다.
이날은 메모한 내용이 거의 없다.
반복문의 처리와 콘솔에서의 컬러 설정하는 방식에 대한 내용이 주력으로 작성되어 있다.
반복문
- while : 조건에 의한 판단이 편한 경우 사용
- for : 반복 횟수에 의한 판단이 편한 경우 사용
#include <window.h> 를 이용해 콘솔에서 컬러를 출력할 수 있다.
SetConsoleTextAttribute() 함수와 SetConsoleCursorPosition() 함수를 이용해 내용을 출력하기 전에 색과 출력 위치를 지정할 수 있다.
이 내용이 끝이다.
내용이 적은 것으로 보아, 실습 및 과제로 시간을 보낸 것 같다.
이날은 메모한 내용이 거의 없다.
반복문의 처리와 콘솔에서의 컬러 설정하는 방식에 대한 내용이 주력으로 작성되어 있다.
반복문
- while : 조건에 의한 판단이 편한 경우 사용
- for : 반복 횟수에 의한 판단이 편한 경우 사용
#include <window.h> 를 이용해 콘솔에서 컬러를 출력할 수 있다.
SetConsoleTextAttribute() 함수와 SetConsoleCursorPosition() 함수를 이용해 내용을 출력하기 전에 색과 출력 위치를 지정할 수 있다.
이 내용이 끝이다.
내용이 적은 것으로 보아, 실습 및 과제로 시간을 보낸 것 같다.
국비 교육 : 게임 프로그래밍 014일
14일 차 교육 내용을 정리해 본다.
C++을 이용한 콘솔 프로그램에서의 입력 방식을 설명하고, 연산 및 연산자에 대한 설명이 이루어진 것 같다.
콘솔에서의 연속출력, 연속입력
cout와 cin 은 완전히 종료될 때까지 남아 순차적으로 수행된다.
1. cout << 1 + 1 << endl;
2. cout << 2 << endl;
3. cout << endl;
4. cout ;
1번부터 4번 순으로 동작한다.
연산 : 특정 기능의 수행
연산자 : 특정 기능을 수행하는 기호
연산자 사용
누가봐도 명확하게 가로를 쳐서 연산 우선 순위를 지정해 두어라
연산 방향에 관계없이 Line을 나누어 작성해라.
대입 연산자
- 우측의 연산 결과를 좌측의 변수에 저장(변경)한다.
- 우측의 값을 좌측의 변수에 저장한다.
- 좌측의 변수를 우측의 값으로 변경한다.
1. a = b = 10;
2. a = b;
3. a
1번부터 3번 순으로 동작
산술 연산자
- 사칙 연산 , % 나머지
- 계산된 값이 결과로 남는다.
복합 대입 연산자
- a += b; 형태의 연산자를 의미한다.
- a = a + b; 형태와 같은 처리
음수 부호 연산자
- 해당 값의 음수를 나타낸다.
전위 : 해당 명령 줄을 실행하기 전에 처리된다. ( 예 : ++a )
후위 : 해당 명령 줄이 끝나고 처리된다. ( 예 : a++ )
이런 내용들이 메모되어 있었다.
연산자의 처리에 대한 내용을 주력으로 강의가 된 거 같고, 전위/후위에 대한 연산자 처리 방식에 대한 내용이 강의 된 거 같다.
C++을 이용한 콘솔 프로그램에서의 입력 방식을 설명하고, 연산 및 연산자에 대한 설명이 이루어진 것 같다.
콘솔에서의 연속출력, 연속입력
cout와 cin 은 완전히 종료될 때까지 남아 순차적으로 수행된다.
1. cout << 1 + 1 << endl;
2. cout << 2 << endl;
3. cout << endl;
4. cout ;
1번부터 4번 순으로 동작한다.
연산 : 특정 기능의 수행
연산자 : 특정 기능을 수행하는 기호
연산자 사용
누가봐도 명확하게 가로를 쳐서 연산 우선 순위를 지정해 두어라
연산 방향에 관계없이 Line을 나누어 작성해라.
대입 연산자
- 우측의 연산 결과를 좌측의 변수에 저장(변경)한다.
- 우측의 값을 좌측의 변수에 저장한다.
- 좌측의 변수를 우측의 값으로 변경한다.
1. a = b = 10;
2. a = b;
3. a
1번부터 3번 순으로 동작
산술 연산자
- 사칙 연산 , % 나머지
- 계산된 값이 결과로 남는다.
복합 대입 연산자
- a += b; 형태의 연산자를 의미한다.
- a = a + b; 형태와 같은 처리
음수 부호 연산자
- 해당 값의 음수를 나타낸다.
전위 : 해당 명령 줄을 실행하기 전에 처리된다. ( 예 : ++a )
후위 : 해당 명령 줄이 끝나고 처리된다. ( 예 : a++ )
이런 내용들이 메모되어 있었다.
연산자의 처리에 대한 내용을 주력으로 강의가 된 거 같고, 전위/후위에 대한 연산자 처리 방식에 대한 내용이 강의 된 거 같다.
2019년 3월 16일 토요일
국비 교육 : 게임 프로그래밍 013일
13일 차 교육 내용을 옮겨 본다.
왠지 모르겠지만 C++ 문법의 처음부터 다시 작성되어 있다.
아무래도 따라가기 힘든 원생들이 있어서 기초부터 다시 설명이 되는 게 아닌가 싶다.
함수란 특정한 기능을 수행하고 설계된 독립적인 프로그램이다.
0. 기수법
- 0~9 아라비아 숫자 표시
1. 진수
- 자릿수 하나의 범위 (2진수는 1자리 속에 0 / 1 두 개가 들어감)
- 기계는 2진수 사람은 10진수가 기본
2. 진법 변환
- 2→10 , 10→2 진수 변화는 자주 사용된다.
3. 수의 범위
- 1byte = 8bit : 0~255의 범위를 가진다.
4. 음수
- 컴퓨터는 음수가 없이 마이너스라는 개념으로 처리된다.
- 0의 보수를 찾아 음수를 인식시킬 값을 찾는 방식으로 음수를 인식한다.
- MSB(최고 중요한 비트) 데이터 최상위 1bit를 부호로 사용한다.
변수 타입
- 정수형 : char , short , int , long
- 실수형 : float , double
- 논리형 : bool
- 기타 : auto
이상과 같이 C++ 프로그래밍을 하는데 필요한 기본 내용이 교육된 것 같다.
다시 기본 내용이 교육되는것을 보니 C++의 처음부터 다시 설명 되는거 같은데 옮겨 적으면서도 왜 그런것인지 잘 기억은 안난다.
왠지 모르겠지만 C++ 문법의 처음부터 다시 작성되어 있다.
아무래도 따라가기 힘든 원생들이 있어서 기초부터 다시 설명이 되는 게 아닌가 싶다.
함수란 특정한 기능을 수행하고 설계된 독립적인 프로그램이다.
0. 기수법
- 0~9 아라비아 숫자 표시
1. 진수
- 자릿수 하나의 범위 (2진수는 1자리 속에 0 / 1 두 개가 들어감)
- 기계는 2진수 사람은 10진수가 기본
2. 진법 변환
- 2→10 , 10→2 진수 변화는 자주 사용된다.
3. 수의 범위
- 1byte = 8bit : 0~255의 범위를 가진다.
4. 음수
- 컴퓨터는 음수가 없이 마이너스라는 개념으로 처리된다.
- 0의 보수를 찾아 음수를 인식시킬 값을 찾는 방식으로 음수를 인식한다.
- MSB(최고 중요한 비트) 데이터 최상위 1bit를 부호로 사용한다.
변수 타입
- 정수형 : char , short , int , long
- 실수형 : float , double
- 논리형 : bool
- 기타 : auto
이상과 같이 C++ 프로그래밍을 하는데 필요한 기본 내용이 교육된 것 같다.
다시 기본 내용이 교육되는것을 보니 C++의 처음부터 다시 설명 되는거 같은데 옮겨 적으면서도 왜 그런것인지 잘 기억은 안난다.
2019년 3월 14일 목요일
국비 교육 : 게임 프로그래밍 012일
12일 차 교육 내용의 메모를 정리해 본다.
2차원 배열 형태의 과제 풀이가 있었던 것 같다. 섞는 과정에서 배열 Index의 직접적인 교체에 대한 이야기가 나오는 것으로 봐서는 신경쇠약이 과제로 나왔던 것 같다.
2D 게임에서는 Target의 제어를 위해 posX, posY 두 변수를 활용한다.
int posX = 0;
int posY = 0;
형태의 변수를 두어 Target의 위치를 설정한 뒤 이를 배열 index로 지환해 활용한다.
index = WIDTH * posY + posX;
물론 index를 역산해 x, y좌표로 치환할 수도 있다.
숫자 퍼즐을 섞는 경우 각 배열의 index를 직접 교체하지 않는다.
이 경우 실제 이동 조작을 n회 수행해 퍼즐이 섞일 수 있도록 제어 해야 된다.
단순 index 교체는 실제 게임에서 발생 되지 않는 대각선 교체로 인해 섞은 결과 데이터의 오류가 발생 될 수 있다.
#include<conio.h>를 이용한 consol상에서의 키 입력받기
- kbhit(); 입력 버퍼에 값이 있는지를 확인할 수 있는 함수로 값이 있으면 1, 없으면 0 반환
- getch(); 입력 버퍼에서 문자 1개를 가져온다. 안에 저장값을 꺼내오는 move의 개념이다.
Enter없이 키 입력을 받아 화면을 갱신처리 하는 경우에 사용한다.
char 는 숫자로 저장되어 문자로 출력됨
switch문에서 case 'a': , case 'A': 형태로 사용이 가능 하다.
Sort에 대한 정보 확인해 보기
이상과 같은 내용이 적혀 있었고, 다시 보니 과제 풀이가 있었고, 과제 중 키 입력을 통한 정보 갱신 처리를 하는 방식이 설명 된거 같다. 아직 1차원 배열을 2차원으로 치환해 사용 하는 듯 싶다. 마지막에 sort 에 대한 정보 확인은 앞으로 정렬 알고리즘에 대한 교육이 있어 선행 교육을 과제로 내준것 같다.
2차원 배열 형태의 과제 풀이가 있었던 것 같다. 섞는 과정에서 배열 Index의 직접적인 교체에 대한 이야기가 나오는 것으로 봐서는 신경쇠약이 과제로 나왔던 것 같다.
2D 게임에서는 Target의 제어를 위해 posX, posY 두 변수를 활용한다.
int posX = 0;
int posY = 0;
형태의 변수를 두어 Target의 위치를 설정한 뒤 이를 배열 index로 지환해 활용한다.
index = WIDTH * posY + posX;
물론 index를 역산해 x, y좌표로 치환할 수도 있다.
숫자 퍼즐을 섞는 경우 각 배열의 index를 직접 교체하지 않는다.
이 경우 실제 이동 조작을 n회 수행해 퍼즐이 섞일 수 있도록 제어 해야 된다.
단순 index 교체는 실제 게임에서 발생 되지 않는 대각선 교체로 인해 섞은 결과 데이터의 오류가 발생 될 수 있다.
#include<conio.h>를 이용한 consol상에서의 키 입력받기
- kbhit(); 입력 버퍼에 값이 있는지를 확인할 수 있는 함수로 값이 있으면 1, 없으면 0 반환
- getch(); 입력 버퍼에서 문자 1개를 가져온다. 안에 저장값을 꺼내오는 move의 개념이다.
Enter없이 키 입력을 받아 화면을 갱신처리 하는 경우에 사용한다.
char 는 숫자로 저장되어 문자로 출력됨
switch문에서 case 'a': , case 'A': 형태로 사용이 가능 하다.
Sort에 대한 정보 확인해 보기
이상과 같은 내용이 적혀 있었고, 다시 보니 과제 풀이가 있었고, 과제 중 키 입력을 통한 정보 갱신 처리를 하는 방식이 설명 된거 같다. 아직 1차원 배열을 2차원으로 치환해 사용 하는 듯 싶다. 마지막에 sort 에 대한 정보 확인은 앞으로 정렬 알고리즘에 대한 교육이 있어 선행 교육을 과제로 내준것 같다.
2019년 3월 13일 수요일
국비 교육 : 게임 프로그래밍 011일
11일차 교육에 작성된 내용을 요약해 본다.
조건을 제어하는 방식과 1차원 배열을 가지고 2차원 배열의 효과를 볼 수 있는 방식에 대한 내용이 작성되어 있다. 아마도 과제로 낸 내용이 2차원 배열을 이용한 내용이었나 보다.
반복문에 조건을 설정해 "지정된 상태 시 밖으로 나가라"라는 형태로 구현을 할 수 있다.
바둑판 위의 그림은 2차원 좌표로 생각해라.
가로 값은 x를 for 문으로 돌리고 세로값은 y를 for 문으로 돌리면 된다.
이를 1차원 배열을 이용하면 다음과 같이 된다.
배열에 사용되는 index의 경우 -1로 초기화해 사용한다.
초기화 값이 지정되어 있지 않으면 0을 사용하기에 사용되는 0과 구분이 안 되는 경우가 발생한다.
이처럼 반복문 탈출과 2차원 배열 활용하기에 대한 내용이 작성됐다.
바둑판 모양의 2차원 배열을 이용한 신경쇠약과 같은 게임이 과제로 나오지 않았나 싶다.
조건을 제어하는 방식과 1차원 배열을 가지고 2차원 배열의 효과를 볼 수 있는 방식에 대한 내용이 작성되어 있다. 아마도 과제로 낸 내용이 2차원 배열을 이용한 내용이었나 보다.
반복문에 조건을 설정해 "지정된 상태 시 밖으로 나가라"라는 형태로 구현을 할 수 있다.
for(int i = 0 ; i < 5 ; i ++)
{
if (j < 0)
{
break;
}
}
위 코드에서는 j의 상태에 따라 for문을 벗어날 수 있다.바둑판 위의 그림은 2차원 좌표로 생각해라.
가로 값은 x를 for 문으로 돌리고 세로값은 y를 for 문으로 돌리면 된다.
0,0 0,1 0,2 0,3 | 0 1 2 3 | (4x0)+(0,1,2,3)
1,0 1,1 1,2 1,3 | 4 5 6 7 | (4x1)+(0,1,2,3)
2,0 2,1 2,2 2,3 | 8 9 10 11 | (4x2)+(0,1,2,3)
3,0 3,1 3,2 3,3 | 12 13 14 15 | (4x3)+(0,1,2,3)
이를 1차원 배열을 이용하면 다음과 같이 된다.
for(int y = 0 ; y < height ; y++)
{
for(int x = 0 ; x < width ; x++)
{
int arrayIndex = y * height + x;
}
}
height와 width로 높이와 너비를 지정하고 arrayIndex로 1차원 배열의 위치를 설정할 수 있다. 배열에 사용되는 index의 경우 -1로 초기화해 사용한다.
초기화 값이 지정되어 있지 않으면 0을 사용하기에 사용되는 0과 구분이 안 되는 경우가 발생한다.
이처럼 반복문 탈출과 2차원 배열 활용하기에 대한 내용이 작성됐다.
바둑판 모양의 2차원 배열을 이용한 신경쇠약과 같은 게임이 과제로 나오지 않았나 싶다.
국비 교육 : 게임 프로그래밍 010일
10일째 교육이 진행 됐다.
C++ 언어를 이용한 외부 함수 작성/사용에 대한 부분을 중심으로 지금까지 작성한 프로젝트(과제)의 기능들을 함수로 추출해 다시 구성하는 수업을 한 것으로 보인다.
정적 전역 변수와 정적 지역 변수에 대한 설명이 이루어졌다.
함수의 매개 변수 활용 및 선언 시 int , void의 반환 자료형 차이를 통해 값 반환에 대한 방식에 관해 설명 되었다.
Add() 함수의 전방 선언
그리고 전방 선언된 함수는 별도의 파일로 분리하여 관리할 수 있다.
계산기, 성적표, 하이로우 프로그램의 각각 기능들을 별도 함수로 제외하는 작업을 해보도록 한다.
이상과 같은 메모 내용을 보니 외부 함수 작성을 실습해 보면서 교육이 마무리된 것으로 보인다.
C++ 언어를 이용한 외부 함수 작성/사용에 대한 부분을 중심으로 지금까지 작성한 프로젝트(과제)의 기능들을 함수로 추출해 다시 구성하는 수업을 한 것으로 보인다.
정적 전역 변수와 정적 지역 변수에 대한 설명이 이루어졌다.
함수의 매개 변수 활용 및 선언 시 int , void의 반환 자료형 차이를 통해 값 반환에 대한 방식에 관해 설명 되었다.
Add() 함수의 전방 선언
int Add();
void main()
{
구현
}
int Add()
{
구현
}
전방 선언된 링크 작업 시 확인된다.그리고 전방 선언된 함수는 별도의 파일로 분리하여 관리할 수 있다.
계산기, 성적표, 하이로우 프로그램의 각각 기능들을 별도 함수로 제외하는 작업을 해보도록 한다.
이상과 같은 메모 내용을 보니 외부 함수 작성을 실습해 보면서 교육이 마무리된 것으로 보인다.
2019년 3월 10일 일요일
국비 교육 : 게임 프로그래밍 009일
9일 차 교육한 메모 내용을 정리해 본다.
지난 과제였던 로우/하이 프로그램에 대해서 각각의 구현 방식을 보고 검토가 이루어졌다.
구현에 사용한 셔플 알고리즘과 Rand()를 이용한 확률 계산 방법에 대한 구현 방식이 설명되었고, 함수에 대한 기초 설명이 이루어졌다.
로우/하이 의 구현
카드 정보를 배열로 선언 → 배열에 카드 정보 대입 → 정보를 섞는다.
정보를 섞는 방법
1. 배열 위치를 shift 시키기 : 최대 배열 수, 앞으로 이동시킴
2. rand()를 이용한 배열 간 swap 방식 : rand() 범위 및 temp를 이용한 값 변경
카드 선택에 사용되는 rand()의 활용으로 Rand()%정밀도를 이용한 확률 계산
const 선언을 이용한 심볼릭 상수 선언 방식
const int i = 5;
여기서 i 는 배열 선언 시 범위를 지정하는 데 사용 할 수 있다.
함수 기초
- 코드 집합으로 "메인 함수"인 "main()" 과 "표준 함수"인 "rand(), srand()" 그리고 사용자가 만들어 사용하는 "사용자 정의 함수"가 있다.
- 함수는 코드의 효율적인 재활용이 가능하므로 2회 이상 사용하는 기능의 경우 함수로 제외해 사용해라.
- 사용자 정의 함수를 만들 때 이름은 함수의 기능을 대표하도록 작성해라.
변수의 분류
선언 지역에 따른 구분
- 전역 변수 : 코드 내 { } 밖에 선언된다.
- 지역 변수 : 코드 내 { } 안에 선언되며, 선언된 범위를 벗어나면 소멸한다.
선언 방법에 따른 구분
- 일반 변수 : int a;
- 정적 변수 : static int a; / 생명 주기가 전역 변수처럼 된다.
이상과 같은 내용이 정리되어 있다.
지금에서 메모를 다시 보니 수업 중 주로 교육된 내용이 어떤 항목이었는지 궁금하다.
지난 과제를 풀이하는 시간이 주력으로 사용되고 이후 셔플 방식, Rnad()의 활용, 함수,변수 설명이 이루어지는 거 같다. 하지만 C++ 교재를 기반으로 교육하는 것 치고는 중구난방으로 강의 된 거 같다.
지난 과제였던 로우/하이 프로그램에 대해서 각각의 구현 방식을 보고 검토가 이루어졌다.
구현에 사용한 셔플 알고리즘과 Rand()를 이용한 확률 계산 방법에 대한 구현 방식이 설명되었고, 함수에 대한 기초 설명이 이루어졌다.
로우/하이 의 구현
카드 정보를 배열로 선언 → 배열에 카드 정보 대입 → 정보를 섞는다.
for( 섞을 횟수 )
{
// 0~51 사이의 수 위치를 지정
int source = rand()%52;
int destination = rand()%52;
// 두 카드의 숫자 정보를 변경
int temp = Array[source];
Array[source] = Array[destination];
Array[destination] = Array[source];
}
정보를 섞는 방법
1. 배열 위치를 shift 시키기 : 최대 배열 수, 앞으로 이동시킴
2. rand()를 이용한 배열 간 swap 방식 : rand() 범위 및 temp를 이용한 값 변경
카드 선택에 사용되는 rand()의 활용으로 Rand()%정밀도를 이용한 확률 계산
if( rand%1000 < 300 )
{
// 30%의 확률로 계산을 진행
}
const 선언을 이용한 심볼릭 상수 선언 방식
const int i = 5;
여기서 i 는 배열 선언 시 범위를 지정하는 데 사용 할 수 있다.
함수 기초
- 코드 집합으로 "메인 함수"인 "main()" 과 "표준 함수"인 "rand(), srand()" 그리고 사용자가 만들어 사용하는 "사용자 정의 함수"가 있다.
- 함수는 코드의 효율적인 재활용이 가능하므로 2회 이상 사용하는 기능의 경우 함수로 제외해 사용해라.
- 사용자 정의 함수를 만들 때 이름은 함수의 기능을 대표하도록 작성해라.
변수의 분류
선언 지역에 따른 구분
- 전역 변수 : 코드 내 { } 밖에 선언된다.
- 지역 변수 : 코드 내 { } 안에 선언되며, 선언된 범위를 벗어나면 소멸한다.
선언 방법에 따른 구분
- 일반 변수 : int a;
- 정적 변수 : static int a; / 생명 주기가 전역 변수처럼 된다.
이상과 같은 내용이 정리되어 있다.
지금에서 메모를 다시 보니 수업 중 주로 교육된 내용이 어떤 항목이었는지 궁금하다.
지난 과제를 풀이하는 시간이 주력으로 사용되고 이후 셔플 방식, Rnad()의 활용, 함수,변수 설명이 이루어지는 거 같다. 하지만 C++ 교재를 기반으로 교육하는 것 치고는 중구난방으로 강의 된 거 같다.
국비 교육 : 게임 프로그래밍 008일
8일차 교육 내용을 메모에서 옮겨 본다.
C++의 배열과 반복문, 분기문 에 대한 내용을 공부 했었고, 과제 프로그램이 있었다.
VS 단축키 팁으로
alt + drag 를 하면 블록 형태(세로)로 선택을 할 수 있다.
alt + shift + 키보드 방향키로 블록 형태(세로)로 선택을 할 수 있다.
프로그램의 구현 시 일반 변수와 상태 변수는 네이밍부터 나누어 관리해라.
tileNumber, isPlaying 식으로 구분이 되도록 작성하는 버릇을 들여야 한다.
배열 번호를 통해 다양한 데이터를 설정, 가져올 수 있다.
기준값(생성순번, 정수)이 있으면 이를 배열로 이용해 데이터를 관리 할 수 있다.
예)
기준값 | 학번[기준값] | 국어[기준값] | 영어[기준값] | 수학[기준값] | ...
배열의 번호, 배열관리 cout 용 변수, 배열 최대값 제어 변수 등에대한 숫자 개념을 확실히 파악해 두어야 된다. (배열은 0부터 시작 하고 최대수 -1 의 번호를 가진다.)
배열은 0~n 번으로 생성이 되며, 배열의 총 개수는 n+1로 관리 된다.
이를 배열[변수] 로 사용해 관리를 할 수 있다.
반복문
while(조건) { } - 0회 ~ n회
do { } while(조건); - 1회는 무조건 실행 이후 ~ n회
for(초기식 ; 조건 ; 증감식) { } - 조건에 맞추어 n회
while은 종료 조건이 명확한 반복문이고,
for는 반복 횟수가 명확한 반복문이다.
for(초기식 ; 조건 ; 증감식) { 명령 } 의 실행 순서는 다음과 같다.
- 초기식(1회 실행) → 조건 → 명령 → 증감식 → 조건 → 명령 ~
- 초기식 : 1회만 실행, 반복 변수를 선언하거나 값 대입
- 조건식 : 조건이 참이면 명령을 수행
- 증감식 : 반복 변수의 값을 증가
Countinue; - 이번 명령(실행)을 중지, 다음 반복을 수행
Break; - 이번 명령을 중지, 반복 중지와 함께 밖으로 이동
분기문
지정된 값이 오면 코드를 실행 하는 문법으로 아래와 같은 형태로 구현된다.
switch( 정수값 ) ← 정수값 영역에는 정수값/10 과 같이 수식이 사용 될 수 있다.
{
case 정수값:
명령
break;
default:
명령
break;
}
이상 강의된 내용을 토대로 52장의 트럼프 카드를 이용한 하이/로우 게임이 과제로 나왔다.
1. 랜덤을 이용해 1~52 사이의 카드를 컴퓨터 선택
2. 7을 기준으로 높은수 인지 낮은 수인지를 선택해 맞추는 게임
게임의 모양새를 가지고는 하이/로우를 콘솔로 제작하는 과제였다.
메모에는 없지만 아마도 숫자 입력에 대한 강의가 있었으며, while 문을 이용한 반복과 rand()를 이용한 난수 생성 그리고 배열 및 비교 과정이 포함되어 구현할 수 있는 과제였다.
C++의 배열과 반복문, 분기문 에 대한 내용을 공부 했었고, 과제 프로그램이 있었다.
VS 단축키 팁으로
alt + drag 를 하면 블록 형태(세로)로 선택을 할 수 있다.
alt + shift + 키보드 방향키로 블록 형태(세로)로 선택을 할 수 있다.
프로그램의 구현 시 일반 변수와 상태 변수는 네이밍부터 나누어 관리해라.
tileNumber, isPlaying 식으로 구분이 되도록 작성하는 버릇을 들여야 한다.
배열 번호를 통해 다양한 데이터를 설정, 가져올 수 있다.
기준값(생성순번, 정수)이 있으면 이를 배열로 이용해 데이터를 관리 할 수 있다.
예)
기준값 | 학번[기준값] | 국어[기준값] | 영어[기준값] | 수학[기준값] | ...
배열의 번호, 배열관리 cout 용 변수, 배열 최대값 제어 변수 등에대한 숫자 개념을 확실히 파악해 두어야 된다. (배열은 0부터 시작 하고 최대수 -1 의 번호를 가진다.)
배열은 0~n 번으로 생성이 되며, 배열의 총 개수는 n+1로 관리 된다.
이를 배열[변수] 로 사용해 관리를 할 수 있다.
반복문
while(조건) { } - 0회 ~ n회
do { } while(조건); - 1회는 무조건 실행 이후 ~ n회
for(초기식 ; 조건 ; 증감식) { } - 조건에 맞추어 n회
while은 종료 조건이 명확한 반복문이고,
for는 반복 횟수가 명확한 반복문이다.
for(초기식 ; 조건 ; 증감식) { 명령 } 의 실행 순서는 다음과 같다.
- 초기식(1회 실행) → 조건 → 명령 → 증감식 → 조건 → 명령 ~
- 초기식 : 1회만 실행, 반복 변수를 선언하거나 값 대입
- 조건식 : 조건이 참이면 명령을 수행
- 증감식 : 반복 변수의 값을 증가
Countinue; - 이번 명령(실행)을 중지, 다음 반복을 수행
Break; - 이번 명령을 중지, 반복 중지와 함께 밖으로 이동
분기문
지정된 값이 오면 코드를 실행 하는 문법으로 아래와 같은 형태로 구현된다.
switch( 정수값 ) ← 정수값 영역에는 정수값/10 과 같이 수식이 사용 될 수 있다.
{
case 정수값:
명령
break;
default:
명령
break;
}
이상 강의된 내용을 토대로 52장의 트럼프 카드를 이용한 하이/로우 게임이 과제로 나왔다.
1. 랜덤을 이용해 1~52 사이의 카드를 컴퓨터 선택
2. 7을 기준으로 높은수 인지 낮은 수인지를 선택해 맞추는 게임
게임의 모양새를 가지고는 하이/로우를 콘솔로 제작하는 과제였다.
메모에는 없지만 아마도 숫자 입력에 대한 강의가 있었으며, while 문을 이용한 반복과 rand()를 이용한 난수 생성 그리고 배열 및 비교 과정이 포함되어 구현할 수 있는 과제였다.
2019년 3월 9일 토요일
국비 교육 : 게임 프로그래밍 007일
7일 차 교육 내용을 정리해 본다.
C++ 문법 공부를 기반으로 배열에 대한 내용이 교육된 것으로 보인다.
메모가 너무 띄엄띄엄 되어 있어 정확한 학습 내용의 판단은 여전히 안 된다.
3자리 수에서 각 단위 숫자 추출 방법
- 100 으로 나누고 나온 몫을
- 10으로 나누고 나온 몫과 나머지를 통해 추출할 수 있다.
"상태 변수"를 두고 이를 통해 제어하는 조건 방식
While 문에 비교 값을 위한 변수 1개를 두고 내부에서 처리하는 방식이 가능하다
프로그램을 구현하는 단위 항목별로 [빌드] -> [실행] -> [확인] 과정을 꼭 수행 해라.
랜덤 : Min ~ Max 사이 임의 수 생성
- Rand()%(Max - Min + 1) + Min;
논리 연산자 && , ||
&& : AND : 양쪽 다 참이면 참
|| : OR : 양쪽 중 한 개라도 참이면 참
조건
- if{} else{}
- if{} else if{} else{}
일률적인 방향으로의 조건으로 위에서 내려오다 참이 나오면 밖으로 나오게 된다.
if(조건) {}
else if(조건) {}
else if(조건) {}
else if(조건) {}
else {}
배열
- 같은 코드인데, 적용될 변수가 달라서 쉽게 반복이 안 된다.
- 변수를 한 번에 여러 개 쓰고 싶다.
- 이와 같은 문제 해결에 사용된다.
변수를 단독주택이면 배열은 아파트로 생각하면 된다.
선언 : 무조건 재수가 정의되어야 된다.
- 자료형 배열명[개수];
초기화 : 선언과 동시에 초기화할 수 있다.
- 자료형 배열명[개수] = {0, 1, 2, ~ 개수};
- int 배열명[개수] = {}; 형태로 초기화할 수 있다.
사용
- 배열명[인덱스] = 10;
배열의 인덱스는 0부터 시작 한다. 인덱스의 최대 수는 "개수-1" 이다.
교육 내용이 책을 기반으로 해서 그런지 메모한 내용이 순서도 없고, 내용도 많이 부실한 상태다.
랜덤수, if else 조건, 배열에 대한 내용을 예제와 함께 교육 했을 것이라 생각 된다.
C++ 문법 공부를 기반으로 배열에 대한 내용이 교육된 것으로 보인다.
메모가 너무 띄엄띄엄 되어 있어 정확한 학습 내용의 판단은 여전히 안 된다.
3자리 수에서 각 단위 숫자 추출 방법
- 100 으로 나누고 나온 몫을
- 10으로 나누고 나온 몫과 나머지를 통해 추출할 수 있다.
"상태 변수"를 두고 이를 통해 제어하는 조건 방식
While 문에 비교 값을 위한 변수 1개를 두고 내부에서 처리하는 방식이 가능하다
while(isSame == 1)
{
isSame = 0;
if (num1 == num2)
{
isSame = 1;
}
if (num2 == num3)
{
isSame = 2;
}
}
프로그램을 구현하는 단위 항목별로 [빌드] -> [실행] -> [확인] 과정을 꼭 수행 해라.
랜덤 : Min ~ Max 사이 임의 수 생성
- Rand()%(Max - Min + 1) + Min;
논리 연산자 && , ||
&& : AND : 양쪽 다 참이면 참
|| : OR : 양쪽 중 한 개라도 참이면 참
조건
- if{} else{}
- if{} else if{} else{}
일률적인 방향으로의 조건으로 위에서 내려오다 참이 나오면 밖으로 나오게 된다.
if(조건) {}
else if(조건) {}
else if(조건) {}
else if(조건) {}
else {}
배열
- 같은 코드인데, 적용될 변수가 달라서 쉽게 반복이 안 된다.
- 변수를 한 번에 여러 개 쓰고 싶다.
- 이와 같은 문제 해결에 사용된다.
변수를 단독주택이면 배열은 아파트로 생각하면 된다.
선언 : 무조건 재수가 정의되어야 된다.
- 자료형 배열명[개수];
초기화 : 선언과 동시에 초기화할 수 있다.
- 자료형 배열명[개수] = {0, 1, 2, ~ 개수};
- int 배열명[개수] = {}; 형태로 초기화할 수 있다.
사용
- 배열명[인덱스] = 10;
배열의 인덱스는 0부터 시작 한다. 인덱스의 최대 수는 "개수-1" 이다.
교육 내용이 책을 기반으로 해서 그런지 메모한 내용이 순서도 없고, 내용도 많이 부실한 상태다.
랜덤수, if else 조건, 배열에 대한 내용을 예제와 함께 교육 했을 것이라 생각 된다.
피드 구독하기:
글 (Atom)
Unity - Firebase 연동 (Analytics, AdMob)
버전 : firebase_unity_sdk_6.5.0.zip 게임에서 통계 측정 및 광고 추적을 위해 Firebase 을 연동한다. 앞서 [Unity - GPGS 와 Admob 연동 및 배포 준비 작업] 연동 이후에 작업을 진행 한다. 유니...