Post

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가 설치되기에 못접해보는 사람들도 있다. 팀과 회사마다 다를 수 있다.
          • 상업 용도로 사용하게되면 유료로 가야하는것도 큰 단점.
    • 프로젝트(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; //입력값 출력
            }
          
      • 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
              }
            
This post is licensed under CC BY 4.0 by the author.