본문으로 이동
주 메뉴
주 메뉴
사이드바로 이동
숨기기
둘러보기
대문
최근 바뀜
임의의 문서로
미디어위키 도움말
Bitmap
검색
검색
계정 만들기
로그인
개인 도구
계정 만들기
로그인
로그아웃한 편집자를 위한 문서
더 알아보기
기여
토론
wiki.kuzeent.com 도메인은 더 이상 제공되지 않습니다.
언리얼 엔진 스터디/프로그래밍
편집하기 (부분)
문서
토론
한국어
읽기
편집
역사 보기
도구
도구
사이드바로 이동
숨기기
동작
읽기
편집
역사 보기
일반
여기를 가리키는 문서
가리키는 글의 최근 바뀜
특수 문서 목록
문서 정보
경고:
로그인하지 않았습니다. 편집을 하면 IP 주소가 공개되게 됩니다.
로그인
하거나
계정을 생성하면
편집자가 사용자 이름으로 기록되고, 다른 장점도 있습니다.
스팸 방지 검사입니다. 이것을 입력하지
마세요
!
== 기본 문법 == === 조건문 === ==== if ==== if 안에 들어가는 값이 참일 때 코드를 실행한다. <syntaxhighlight lang="cpp" line> #include <iostream> void main() { int a = 1; // 정수형 변수 a를 선언하고 1로 초기화 if(a == 1) { std::cout << a << std::endl; // a가 1이면 a의 값을 출력한다 } } /* 결과는 1 */ </syntaxhighlight> ==== else if ==== if의 조건이 맞지 않을 때 같은 변수로 다른 조건을 제시한다. <syntaxhighlight lang="cpp" line> #include <iostream> void main() { int a = 3; // 정수형 변수 a를 선언하고 3으로 초기화 if(a == 1) { std::cout << a << std::endl; // a가 1이면 a의 값을 출력한다 } else if(a == 3) { std::cout << a << std::endl; // a가 1은 아니고 3일 때 a의 값을 출력한다 } } /* 결과는 3 */ </syntaxhighlight> ==== else ==== if나 else if의 조건까지 다 맞지 않을 때 나머지 조건이 참일 때 실행함 <syntaxhighlight lang="cpp" line> #include <iostream> void main() { int a = 1; // 정수형 변수 a를 선언하고 1로 초기화 if(a == 3) { std::cout << a << std::endl; // a가 3이면 a의 값을 출력한다 } else { std::cout << "Else" << std::endl; // a가 3이 아니면 Else를 출력한다 } } /* 결과는 Else */ </syntaxhighlight> ==== switch-case ==== switch에 들어가는 어떤 한 변수에 대해서 case에 맞는 값일 때 코드를 실행하고 조건이 다 맞지 않는다면 default를 실행함 <syntaxhighlight lang="cpp" line> #include <cstdio> void main() { int a = 1; // 정수형 변수 a를 선언하고 1로 초기화 switch(a) { case 1: // if(a == 1) printf("a == 1"); break; case 2: // if(a == 2) printf("a == 2"); break; case 3: // if(a == 3) printf("a == 3"); break; default: // else printf("뭣도 아님"); } } /* 결과는 a == 1 */ </syntaxhighlight> === 반복문 === ==== while ==== while 내 조건이 true일 때 계속해서 반복한다. <syntaxhighlight lang="cpp" line> #include <iostream> void main() { int a = 0; // 정수형 변수 a를 선언하고 0으로 초기화 while(a <= 10) { // a가 10 이하인 경우 계속 반복 std::cout << a << " "; // a의 값을 출력 a++; // 매 반복마다 a에 1을 더함 } } /* 결과는 0 1 2 3 4 5 6 7 8 9 10 */ </syntaxhighlight> ==== for ==== 변수 선언, 변수의 범위, 변수의 증감을 직관적으로 일체화한 반복문 <syntaxhighlight lang="cpp" line> #include <iostream> void main() { for(int i=0; i<=10; i++) { // i는 0부터 10 이하까지 1씩 증가하며, 11번 반복한다 std::cout << i << " "; } // for문 사용 시 선언한 변수 i는 for문 외부에서 사용할 수 없음 } /* 결과는 0 1 2 3 4 5 6 7 8 9 10 */ </syntaxhighlight> ==== ForEach ==== 배열의 길이만큼 반복하며 n번째 반복 주기에서 n번째 배열 값을 반환한다. <syntaxhighlight lang="cs" line> // C#에서의 ForEach using System; // ... int[] numbers = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; // numbers라는 정수형 배열에 4, 5, 6, 1, 2, 3, -2, -1, 0의 값으로 구성 foreach(int n in numbers) { // System.Console.Write("{0} ", n); } /* 결과는 4 5 6 1 2 3 -2 -1 0 */ </syntaxhighlight> <syntaxhighlight lang="cpp" line> // C++에서의 ForEach (C++11부터 지원) #include <cstdio> int main(void) { int numbers[] = { 4, 5, 6, 1, 2, 3, -2, -1, 0 }; // numbers라는 정수형 배열에 4, 5, 6, 1, 2, 3, -2, -1, 0의 값으로 구성 for(int n: numbers) { // printf("{0} ", n); } return 0; } /* 결과는 4 5 6 1 2 3 -2 -1 0 */ </syntaxhighlight> === 클래스 === 클래스는 특정 기능을 모듈화 (또는 캡슐화)하여 하나의 단위로 묶는 것을 목표로 한다. 또한, 세부적인 부분을 외부로 드러나지 않게 하여 모듈 간의 결합도를 떨어뜨린다. 이렇게 겉보기로는 불편해보이게 프로그램을 작성하는 이유는 기능이 많아졌을 때 클래스끼리 정해진 방식대로 통신하지 않으면 나중에 그 기능을 수정할 때 수많은 코드를 탐색하고 다시 작성 (리팩토링)해야 할 수 있기 떄문이다. 다음은 HelloWorld라는 이름의 클래스를 만들고, NotHello라는 이름의 HelloWorld의 자식 클래스를 만드는 예제이다. <syntaxhighlight lang="cpp" line> // HelloWorld.h #include <cstdio> class HelloWorld { public: // 클래스의 외부에서도 직접 사용하고 수정할 수 있게 노출한다. HelloWorld() // 클래스가 생성되면 자동 실행되는 생성자 { priv = 0; } ~HelloWorld() // 클래스가 사라질 때 실행되는 소멸자 { printf("Destructor"); } void Hello() { printf("Hello World!"); } // private 변수에 접근할 때 void SetPriv(int value) // Setter { priv = value; } int GetPriv() // Getter { return priv; } // 함수 오버라이드 (동명의 부모 클래스의 함수와 자식 클래스의 함수의 가능 차별화시키기) virtual void DisplayClassName() { printf("Class HelloWorld"); } protected: // 이 클래스와 자식 클래스에서만 직접 사용하고 수정할 수 있게 노출한다. // 클래스 선언문이 길어지면 cpp 파일에 함수의 기능을 따로 작성할 수 있다. void HelloProtected(); private: // 이 클래스에서만 직접 사용하고 수정할 수 있게 노출한다. int priv; } class NotHello: public HelloWorld { public: void DisplayClassName override { printf("Class NotHello"); } } // HelloWorld.cpp #include "HelloWorld.h" HelloWorld::HelloProtected() { printf("Hello Protected"); } </syntaxhighlight> 생성된 클래스는 인스턴스라고 부른다. 다음은 클래스의 인스턴스를 만들고 클래스에 접근하는 방법에 대한 예제이다. <syntaxhighlight lang="cpp" line> #pragma once #include <cstdio> #include "HelloWorld.h" int main(void) { HelloWorld a; // a라는 이름의 클래스 인스턴스 생성 // 클래스 인스턴스에 접근할 때에는 .을 사용한다 int Priv = a.GetPriv(); a.HelloProtected(); // protected는 클래스 외부에서 사용할 수 없으므로 컴파일 오류 printf("%d", a.priv); // private는 클래스 외부에서 사용할 수 없으므로 컴파일 오류 } </syntaxhighlight> === 포인터 === 프로그래밍 언어를 막론하고 모든 변수, 클래스, 구조체 등의 정보는 RAM에 기록된다. 외장 SSD에도 C:\Windows와 같이 주소가 있는 것처럼 RAM에도 주소가 있다. 주소를 알아내는 방법은 다음과 같다. 변수 및 인스턴스 이름 앞에 &를 붙인다. <syntaxhighlight lang="cpp" line> int a; // 변수 선언 &a // a 변수의 주소 값 </syntaxhighlight> 포인터는 이 주소를 저장하는 변수이다. 포인터는 특정 타입의 데이터를 가리키도록 선언한다. <syntaxhighlight lang="cpp" line> int a; // 변수 선언 int* a_ptr = &a; // a 변수의 주소를 a_ptr 포인터에 할당 *a_ptr = 1; // a = 1과 동일 </syntaxhighlight> 포인터가 가리키는 주소에 필요한 것이 할당되어 있지 않다면 nullptr으로 간주한다. nullptr에 접근하는 것은 경우에 따라 프로그램에 심각한 문제를 초래할 수 있으므로 포인터에 접근할 때에는 포인터가 nullptr인지 확인한 후 접근하는 것이 좋다. <syntaxhighlight lang="cpp" line> int* a_ptr; // a_ptr 포인터 선언 *a_ptr = 1; // a_ptr은 어떠한 변수도 가리키지 않으므로 nullptr 상태인 포인터에 접근한 것이다. // 포인터가 nullptr인지 체크하고 아닐 때 포인터에 접근하는 방법 if(a_ptr) *a_ptr = 1; // 또는 if(a_ptr != nullptr) *a_ptr = 1; </syntaxhighlight>
요약:
Bitmap에서의 모든 기여는 크리에이티브 커먼즈 저작자표시-동일조건변경허락 라이선스로 배포된다는 점을 유의해 주세요(자세한 내용에 대해서는
Bitmap:저작권
문서를 읽어주세요). 만약 여기에 동의하지 않는다면 문서를 저장하지 말아 주세요.
또한, 직접 작성했거나 퍼블릭 도메인과 같은 자유 문서에서 가져왔다는 것을 보증해야 합니다.
저작권이 있는 내용을 허가 없이 저장하지 마세요!
취소
편집 도움말
(새 창에서 열림)
내용 폭 제한 전환