C++: C++ 입문, 프로젝트, 입출력, 변수, 함수
C++: C++ 입문, 프로젝트, 입출력, 변수, 함수
1-1 프로그래밍 기초 (Programming basics)
C++
- C언어의 확장버전으로, C언어 기본 구조에 객체지향 프로그래밍(Object Oriented Programming), 제네릭등 다양개념이 합쳐짐.
- 가장 많이 사용되는 프로그래밍 언어중에 하나로, 언리얼 엔진에서 기본적으로 사용되는 언어.
IDE(Integrated Development Environment, 통합 개발 환경):
- 기존의 소스코드를 별도로 작성, 컴파일, 링크, 빌드하는 과정이 따로 있는 개발과정을 하나의 환경에서 할 수 있도록 통합한 개발환경
- Visual Studio
- Microsoft에서 제공하는 IDE 환경으로 프로그래밍 언어나 프로젝트에 상관 없이 대중적으로 쓰임.
- 오래 그리고 대중적으로 쓰였기에 환경 자체의 안정성은 좋은편.
- Community 버전은 개인, 교육, 소규모 기업 목적에서 무료로 사용 가능.
- 2019에선 비선호하는 사람들도 있었는데, 2022버전으로 올라가면서 꽤나 많이 좋아지면서 아래 Rider만큼 괜찬다고 하기도 함.
- Visual Studio Code
- Microsoft에서 제공하는 텍스트 에디터, 수많은 확장기능을 바탕으로 IDE처럼 사용 가능
- 간결한 구조와 커스터마이징은 독보적인 수준, 웹과 클라우드 개발에 강점이 있으며 다른 개발 환경에도 적용 가능
- Rider
- JetBrains에서 제공하는 IDE 환경
- 본디 C#, .NET 지원을 목적으로 하였으나, 지금은 다양한 언어를 지원하고, 유니티, 언리얼, Godot등 게임 개발용도로도 많이 쓰인다.
- 언리얼 블루프린트와의 연동, 빠른 체감속도(다만 메모리는 더 먹는편), 언리얼에 최적화된 리팩토링등 강점을 가져 VS보다 선호하는 사람들도 있지만 개인의 선호에 따라 다름. (처음 입문하며 설치하면 VS가 설치되기에 못접해보는 사람들도 있다. 팀과 회사마다 다를 수 있다.
- 상업 용도로 사용하게되면 유료로 가야하는것도 큰 단점.
- Visual Studio
- 기존의 소스코드를 별도로 작성, 컴파일, 링크, 빌드하는 과정이 따로 있는 개발과정을 하나의 환경에서 할 수 있도록 통합한 개발환경
프로젝트(Project)
- 함께 사용하는 여러 파일들을 모아놓은 하나의 작업공간
- 리소스 파일(Resource Files): 프로젝트 외부에서 가져와 참조될, 텍스트, 이미지, 오디오등 자원으로 사용되는 파일들
- 헤더 파일(Header Files): 코드의 선언부들을 포함시켜 코드의 시작부분 에서 미리 참조하도록 포함시키는 파일
- 라이브러리(Library): 특정한 기능을 수행하도록 설계되어 프로그램 내부에서 동작하는 서브프로그램(subprogram)이다. 코드의 구현까지 포함하는 경우가 많으며 기능 단위로 모듈화되어 코드에 포함시켜 사용할 수 있다.
- 사용자 정의 헤더(User defined header): 사용자가 개별적으로 구현한 헤더파일로, 소스코드에서 작성될 코드의 선언을 구현과 분리하여 저장한다. 함수나 클래스의 전방선언 역할을 함으로서 컴파일러에게 존재를 알리고 프로젝트 내에서의 코드 재사용을 가능하게함.
- 소스 파일(Source Files):실제 구현되는 코드의 내용들이 들어가는 파일.
기초적인 프로그램
1 2 3 4 5 6 7 8
#include <iostream> using namespace std; int main() { cout << "Hello, World" << endl; return 0; }
- 기본적인 문법은 C에서 달라지지 않지만 추가되는 것들이 있다.
- iostream: Input & Output Streaming, c++에서 추가되는 기본 입출력 스트림에 대한 기능을 제공하는 라이브러리
- using namespace std: 여러개의 클래스와 라이브러리를 사용하다보면 키워드나 이름이 겹치게 되어있는 경우가 있는데, 이 때 충돌을 방지하도록 std::cout 같이 어느 클래스의 것을 말하는지 지정해줘야한다. 이를 namespace(이름공간)이라 하며, 위 코드에선 std (standard library)의 것을 사용하는 것으로 간주하겠다고 선언했다. 이후 뒤에 나오는 cout, endl같은 명령어 앞에 별도의 지정 없이 사용할 수 있다.
- cout: console out, 콘솔 화면으로 뒤이어 오는 값들을 출력하겠다는 명령어. printf()와 같은 역할이며, 반대 역할인 명령어로는 cin (console in)이 있다.
- «: 비트 이동 연산자와 같게 생겼으나, 여기서는 cout과 함께 쓰이도록 기능이 오버로딩(overloading, 덮어쓰기)된 다른 기능의 연산자이다. 여기서는 cout에게 뒤에 오는 데이터 스트림을 삽입하는 기능을 한다.
- endl: end line, 문자중에 ‘\n’와 유사한 기능인데, 명령어로서 출력 버퍼의 초기화까지 같이 수행한다.
변수(Variable)
- 변할 수 있는 값(Value), 코드에서 작동하는 중에 사용될 값들이 저장된다.
- 메모리 상의 위치에 배치되며, 어떤 값을 나타내는지와 얼마나 공간이 필요한지를 나타내기위해 자료형을 가진다.
- 정수: int
- 실수: float, double
- 참거짓: bool
- 문자: char
- 문자열: string (string 헤더 필요)
- 선언과 동시에 값을 초기화할 수 있으며, 후에도 대입을 통해 새로운 값으로 변할 수 있다.
1 2 3 4 5 6 7
int main() { int val = 13; cout << val << endl; //13 val = 1; cout << val << endl; //1 }
- 입력을 받을 때는 cin, 출력할때는 cout을 사용한다.
- 입력에 있어 get(), getline(), scanf()등 여러 방법이 추가적으로 있다.
- cin.get(): char 변수를 저장(문자 1개), iostream에 있는 맴버 함수
- cin.getline() : char* 변수를 저장, iostream에 있는 맴버함수
- getline(): string 변수를 저장, std에 있는 기본함수
- scanf(): c언어와 동일한 scanf, 넣어놓은 형식 지정자에 따라 변수를 저장.
- scanf_s(): VS에서 제공하는 보안강화버전, scanf()와 동일하나 버퍼크기를 함께 전
- C++의 경우 cin, getline()을 많이 쓰게될 것이나, 게임 엔진의 경우 별도의 콘솔 입출력 함수가 존재하여 많이 안 쓰게 될 수 있음.
1 2 3 4 5 6 7
int main() { int val; cout << "값을 입력하세요: "<< endl; cin >> val; // val에 입력값 저장 cout << "입력한 값: " << val << endl; //입력값 출력 }
- 입력에 있어 get(), getline(), scanf()등 여러 방법이 추가적으로 있다.
- sizeof()를 이용해 변수의 크기를 구할 수 있다.
1 2 3 4 5 6
int main() { float temp; int val = sizeof(temp); cout << val << endl; //temp의 사이즈->float의 사이즈->4 }
- 기본적인 연산자의 대상이 된다.
- 대입: =
- 사칙연산: +, -, *, /, %
- 비교: <, <=, >, >=, ==, !=
- 전위연산(실행 전 연산)과 후위연산(실행 후 연산)이 있다. (++, –)
1 2 3 4 5 6 7 8
int main() { int val = 1; cout << val++ << endl; // 1 출력 후 2로 증가 cout << ++val << endl; // 3으로 증가 후 3 출력 cout << val-- << endl; // 3 출력 후 2로 감소 cout << --val << endl; // 1로 감소 후 1 출력 }
- 간단한 덧샘 계산기 코드 예시
1 2 3 4 5 6 7 8 9 10
int main() { int val1; cout << "첫번 째 값을 입력하세요: "; cin >> val1; // val1에 입력값 저장 int val2; cout << "두번 째 값을 입력하세요: "; cin >> val2; // val2에 입력값 저장 cout << val1 << " + " << val2 << " = " << val1 + val2 << endl; //입력값들의 합 출력 }
1-2 프로그래밍 기초 (2) (Programming basics 2)
배열
- 같은 자료형의 값을 여러개 묶어놓은 저장 공간, 첨자(index)를 통해 접근
- 선언 후 초기화, 초기화 후 사용 모두 가능
- 일반 변수처럼 cin, cout으로 입출력 가능
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
int main() { int nums[5] = {1,2,3,4,5}; for(int i = 0; i < 5; i++) { cout << nums[i] << " "; //줄바꿈안하고 계속 출력 //1 2 3 4 5 } cout << "\n" << "새로운 3번째 값을 입력해주세요: "; cin >> nums[3] nums[4] = 100; for(int i = 0; i < 5; i++) { cout << nums[i] << " "; //줄바꿈안하고 계속 출력 //1 2 (임의의 값) 4 100 } }
- 배열을 한번에 복사하여 할당하는건 불가능, 이렇게 사용하고 싶으면 std에 정의된 std::array 혹은 std::vector가 더 나음. (구조체 안에 배열이 포함된 경우엔 구조체 복사시 같이 복사)
1 2 3 4 5 6
int main() { int Nums[5] = {1,2,3,4,5}; int OtherNums[5]; OtherNums = Nums; //에러! }
- 간단한 학생 성적 관리 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
int main(){ int score[5]; cout << "1번째 학생의 성적을 입력해주세요: " << endl; cin >> score[0]; cout << "2번째 학생의 성적을 입력해주세요: " << endl; cin >> score[1]; cout << "3번째 학생의 성적을 입력해주세요: " << endl; cin >> score[2]; cout << "4번째 학생의 성적을 입력해주세요: " << endl; cin >> score[3]; cout << "1번째 학생의 성적을 입력해주세요: " << endl; cin >> score[4]; int total = score[0] + score[1] + score[2] + score[3] + score[4]; int average = total / 5; cout << "점수합: " << total << ", 점수 평균: " << average << endl; }
함수
- 특정한 작업을 수행하도록 모아놓은 일련의 명령어들
- 입력값과 출력값을 가질수 있음(없어도 됨)
- 반복적인 작업을 함수로 대체함으로서 코드의 재사용성과 가독성에 기여.
1 2 3 4 5 6 7 8 9 10 11 12
//반환자료형 함수이름(매개변수형 매개변수명) int addNum(int val1, int val2){ int newVal = val1 + val2; return newVal; } int main() { int Num1 = 10; int Num2 = 20; int Sum = addNum(Num1, Num2); cout << Sum << endl; //30 }
- 전달 방식
- 값 전달(pass by value)
- 값을 통한 변수 전달
- 동일한 값을 메모리 임의의 공간에 새로 생성하여 전달하는 방식으로, 원본 변수에 영향을 끼지치 않음.
- 주소값 전달(pass by address)
- 포인터를 통한 변수 전달
- 포인터에 주소값을 저장하여 전달하며, 주소값의 역참조를 통해 변수를 수정하면 메모리 주소에 있는 값을 수정하는 것이기에 원본 변수가 수정됨.
1 2 3 4 5 6 7 8 9 10
void incrementNum(int* val){ (*val)++; } int main() { int Num1 = 10; cout << Num1 << endl; //10 incrementNum(&Num1); cout << Num1 << endl; //11 }
- 참조자 전달(pass by reference)
- 참조자를 통한 변수 전달
- 함수에서 변경된 변수는 참조자가 가리키는 원본 변수에도 저장
- 주소값 전달과 유사하지만, 역참조 없이 사용되고, null값을 넘겨줄 수 없는등 문법에 있어서 차이가 존재.
1 2 3 4 5 6 7 8 9 10
void incrementNum(int& val){ val++; } int main() { int Num1 = 10; cout << Num1 << endl; //10 incrementNum(Num1); cout << Num1 << endl; //11 }
- 값 전달(pass by value)
This post is licensed under CC BY 4.0 by the author.