Home [C++ 프로그래밍] 1강 - C++언어의 소개
Post
Cancel

[C++ 프로그래밍] 1강 - C++언어의 소개

💡해당 게시글은 방송통신대학교 이병래 교수님의 'C++프로그래밍' 강의를 개인 공부 목적으로 메모하였습니다.



학습 목표


  1. C++ 프로그램을 구성하는 소스 파일의 용도 설명 가능
  2. 선행 처리, 문장, 함수 등 C++ 언어의 기본 요소들로 구성된 최소한의 프로그램을 작성 가능
  3. 통합 개발환경을 통해 프로그램을 작성하고 빌드하여 실행 프로그램 개발 가능

주요 용어


  • 소스 파일
    • 프로그래밍 언어의 문법에 따라 작성된 프로그램을 저장하고 있는 파일
  • 헤더 파일
    • 여러 소스 파일에 공통적으로 선언되는 내용을 담고 있는 파일로 그 헤더 파일의 내용이 필요한 소스 프로그램 파일에 삽입된 후 컴파일 됨
  • 빌드(build)
    • 프로그램의 소스 파일을 실행 가능한 프로그램 파일로 변환하는 것을 의미
    • 컴파일이 필요한 소스 파일들을 컴파일하고, 그 결과와 라이브러리 등을 링크하는 처리가 이루어짐
  • 통합 개발 환경(integrated development environment, IDE)
    • 컴퓨터 프로그램을 만드는데 필요한 소스 파일 편집기, 컴파일러, 링커, 디버깅 도구 등 소프트웨어 개발에 필요한 도구를 모아 놓은 소프트웨어
  • 선행 처리기 지시어(preprocessor directives)
    • C++ 프로그램을 컴파일하기 전에 소스 프로그램을 가공하여 컴파일러가 실제로 번역할 소스 프로그램을 만드는 선행 처리를 지시하는 명령어
  • 스트림(stream)
    • 시간에 따라 순서대로 입력되거나 출력 되는 일련의 데이터
  • 백색 공백 문자(whitespace character)
    • 컴퓨터에서 수평 또는 수직 방향의 공간을 표현하는 문자
    • 공백 문자, 탭, 새줄 문자 등
  • 명칭 공간(name space)
    • 특정한 명칭들이 인식되는 프로그램의 부분
    • 다른 영역에 선언된 명칭과 무관하게 명칭 공간 내에서 자유롭게 명칭을 선언하여 사용할 수 있게 함



C++ 언어의 개요


C와 C++언어

  • 1979년 Bell 연구소의 Bjarne Stroustrup이 C 언어를 확장하여 만든 프로그래밍 언어
    • C with Classes
    • 1983년부터 C++라는 이름을 사용함
  • 주요 확장 내용
    • 객체지향 프로그래밍 : 클래스, 상속, 다형성, 동적 바인딩 등
    • 일반화 프로그래밍 : 템플릿
    • 예외 처리

C++ 언어의 표준

  • 국제 표준화 기구(ISO)의 C++ 표준화 연혁 image

C++프로그램의 작성 및 빌드


소스 프로그램 파일

  • 처리하고자 하는 작업을 수행하는 C++ 프로그램 명령어들을 담고 있는 파일
  • 파일의 확장자
    • .cpp
    • .cxx
    • .C

헤더 파일

  • 클래스, 함수의 원형, 매크로, 전역변수, 상수 등 여러 소스 파일에 공통적으로 선언되는 내용을 담고 있는 파일
  • 단독으로 컴파일 되지 않고, #include라는 선행 처리기 지시어에 의해 소스 프로그램 파일에 삽입되어 함께 컴파일됨
  • 확장자
    • .h
    • .hpp

프로그램의 빌드

  • 프로젝트 빌드 과정
    • image
      1. 소스 파일(.cpp) -컴파일(번역)→ 목적 파일(.obj)
      2. 목적 파일(.obj) +(링크)+ 라이브러리 = 실제 동작 가능한 실행 프로그램 파일(.exe)
  • 필요한 도구
    • 통합 개발 환경(IDE)
      • 소스 프로그램 및 GUI 등의 편집기
      • 컴파일러
      • 링커
      • 디버깅 도구

C++프로그래밍 첫걸음


C++ 소스 프로그램

  • FirstStep.cpp

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      #include <iostream>
        
      int main()
      {
      	// 표준 출력 스트림으로 문장을 출력함 -> 주석
      	std::cout << "나의 첫 번째 C++ 프로그램"
      						<< std::endl;
      	return 0;
      }
    

주석

  • C++에서 주석(comment)을 작성하는 방법
    1. /**/ 사이에 문장을 작성

      1
      2
      3
      4
      5
      6
      
       /* a와 b의 값 중에서
       	 더 큰 값을 출력한다. */
       if (a > b)
       	std::cout << a << std::endl;
       else
       	std::cout << b << std::endl;
      
    2. // 기입 시 그 행의 나머지는 주석

      1
      2
      3
      4
      5
      6
      
       // a와 b의 값 중에서
       // 더 큰 값을 출력한다.
       if (a > b)
       	std::cout << a << std::endl;
       else
       	std::cout << b << std::endl;
      

선행 처리

  • 선행 처리의 지시

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
      #include <iostream> 
        
      int main()
      {
      	// 표준 출력 스트림으로 문장을 출력함
      	std::cout << "나의 첫 번째 C++ 프로그램"
      						<< std::endl;
      	return 0;
      }
    
    • #include <iostream>
      • 선행 처리기 지시어
  • 선행처리란?
    • C++ 프로그램을 컴파일하기 전에 소스 프로그램을 가공하여 컴파일러가 실제로 번역할 소스 프로그램을 만드는 것
    • 선행처리기 지시어(preprocessor directives)로 처리 지시
      • 선행처리기 지시어는 #로 시작
      • 선행처리기 지시어 문장은 한 행에 한 개의 문장 작성함
    • 대표적인 선행처리
      • 헤더파일 삽입 : #include image

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        
          #include <iostream>
          /*
          	"" → 내가 만든 헤더 파일을 include 할 때
          	<> →  표준 라이브러리에서 제공하는 헤더 파일을 include 할 때
          */
                    
          int main()
          {
          	// 표준 출력 스트림으로 문장을 출력함
          	std::cout << "나의 첫 번째 C++ 프로그램"
          						<< std::endl;
          	return 0;
          }
        

        image

      • 매크로 선언 및 해제 : #define, #undef
      • 조건부 컴파일 : #if, #ifdef, #ifndef
  • 헤더파일 삽입 선행 처리

문장

  • C++ 프로그램의 문장

    1
    2
    
      std::cin >> a;
      aSquare = a * a;
    
    • 하나의 문장은 단어와 연산자, 숫자, 문자, 문자열, 문장 부호, 빈칸 등을 정해진 문법에 따라 나열하여 작성
    • 문장의 끝에는 세미콜론(;)을 기입해 다음 문장과 구분
  • 블록(block)

    1
    2
    3
    4
    5
    
      if (a > b) {
      	auto tmp = a;
      	a = b;
      	b = tmp;
      }
    
    • 한 개 이상의 문장을 중괄호({ }) 안에 나열하여 묶어 놓은 것
    • 여러 개의 문장을 하나의 문장처럼 취급하거나 함수의 몸체 구성하기 위해 사용

함수

  • 함수의 구성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      #include <iostream>
        
      int main() // 머리부
        
      // 몸체 블록
      {
      	// 표준 출력 스트림으로 문장을 출력함
      	std::cout << "나의 첫 번째 C++ 프로그램"
      						<< std::endl;
      	return 0;
      }
    
    • main()
      • 프로그램 시작점

입출력 스트림

  • std::out 객체

    1
    2
    3
    
      std::cout << "나의 첫 번째 C++ 프로그램";
        
      // "나의 첫 번째 C++ 프로그램"
    
    1
    2
    3
    4
    5
    
      int a = 10;
      std::cout << "a의 값은 ";
      std::cout << a << "입니다." << std::endl;
        
      // "a의 값은 10입니다."
    
    • 표준 출력 스트림 객체
    • 데이터를 문자열로 변환하여 출력함
    • 출력 연산자(삽입 연산자) : <<
  • std::cin 객체

    1
    2
    3
    4
    5
    6
    
      int a;
      char str[100];
      std::cin >> a >> str;
        
      // 사용자 입력 : 10 KNOU Computer Sci 
      // 입력 결과 : a = 10, str = "KNOU"
    
    • 표준 입력 스트림 객체
    • 문자열을 입력 변수의 자료형의 값으로 변환하여 입력
    • 입력 연산자(추출 연산자) : >>
    • 백색 공백 문자(빈칸, 탭, 새줄 문자)는 구분 문자로 취급

명칭 공간

  • 명칭 공간이란?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
      #include <iostream>
        
      namespace NameSpace1 { int a = 10; }
      namespace NameSpace2 { int a = 20; }
      int a = 30;
      namespace NameSpace1 { int b = 50; }
      int main()
      {
      	int a = 40;
      	std::cout << NameSpace1::a << std::endl;
      	std::cout << NameSpace2::a << std::endl;
      	std::cout << ::a << std::endl;
      	std::cout << a << std::endl;
      	std::cout << NameSpace1::b << std::endl;
      	return 0;
      }
      /*
      10
      20
      30
      40
      50
      */
    
    • 특정 명칭들이 인식되는 프로그램의 부분
      • 다른 영역의 명칭 선언과 무관하게 명칭 공간 내에서 자유롭게 명칭을 선언하여 사용 가능
    • 명칭공간의 정의

      1
      2
      3
      
        namespace myNSpc { // 명칭 공간의 이름 : myNSpc
        	int count; // 명칭을 선언하는 문장 나열
        }
      
      • 명칭공간 외부에서는 소속 명칭공간을 지정해 사용

        1
        
          myNSpc::count = 0;
        
    • 동일한 명칭이라도 서로 다른 명칭공간에서 정의되었다면 별개의 것으로 구분
      • 여러 프로그래머가 작성한 프로그램을 결합해 완성된 프로그램 만들 경우 각자 필요한 명칭을 독립적으로 만들어 사용 가능
    • 전역 명칭공간
      • 특정 명칭공간에 속하지 않는 기본 명칭공간
    • std 명칭공간
      • 표준 C++ 라이브러리의 명칭들이 정의되어 있는 명칭공간
  • using 이용한 명칭공간 사용

    1
    
      using namespace std;
    
    1
    2
    
      using std::cout;
      using std::endl;
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
      #include <iostream>
      using namespace std;
      namespace NameSpace1 { int a = 10; }
      namespace NameSpace2 { int a = 20; }
      int a = 30;
      namespace NameSpace1 { int b = 50; }
      int main()
      {
      	int a = 40;
      	cout << NameSpace1::a << endl;
      	cout << NameSpace2::a << endl;
      	cout << ::a << endl;
      	cout << a << endl;
      	cout << NameSpace1::b << endl;
      	return 0;
      }
    
    1
    2
    3
    4
    5
    6
    7
    8
    
      #include <iostream>
      int main()
      {
      	// 표준 출력 스트림으로 문장을 출력함
      	cout << "나의 첫 번째 C++ 프로그램"
      			 << endl;
      	return 0;
      }
    
    • 특정 명칭공간이나 명칭공간 내의 특정 이름을 자주 사용하는 경우 명칭공간 지정 간소화 가능
      • std::coutcout

실습 가이드


Visual Studio Community 설치

  1. Visual Studio 홈페이지 접속 → Community 2022 선택 → 다운로드

    image

  2. C++를 사용한 데스크톱 개발 체크 → 설치 → 로그인
  3. 새프로젝트 만들기 → 빈 프로젝트

    image

    image

  4. 프로젝트 구성 작성 → 만들기

    image

    • 프로젝트 이름 작성
    • 프로젝트 저장 폴더 지정
    • 솔루션(프로젝트를 담는 그릇) 이름 작성
  5. 생성된 솔루션, 프로젝트 확인

    image

  6. 프로젝트 마우스 우클릭 → 추가 → 새항목

    image

  7. C++ 파일 선택 → 소스 파일명 입력 → 추가

    image

    image

C++ 프로그램의 작성 및 빌드

  1. 소스 프로그램 입력

    image

    • 파일명 옆 * 표시
      • 수정된 파일이라는 뜻
  2. 상단 창 → 빌드 → FirstSetp 빌드

    image

  3. 콘솔창 로그 확인

image

1
- 프로젝트 빌드 성공

프로그램 실행

  1. 상단창 → 디버깅 → 디버깅 시작/디버깅하지않고 시작
    image

  2. 명령창 확인해 프로그램 실행 확인 image



연습문제


  • Q1. 헤더파일에 대한 올바른 설명은?

    1
    2
    3
    4
    
      1. 단독으로 컴파일되는 단위이다.
      2. 목적프로그램에 해당된다.
      3. 선행처리기 지시어 #include에 의해 소스 프로그램 파일에 삽입된다.
      4. 확장자는 .cpp를 사용한다.
    
    1
    2
    3
    4
    5
    
      3. 선행처리기 지시어 #include에 의해 소스 프로그램 파일에 삽입된다.
    
      헤더파일은 클래스, 함수의 원형, 매크로, 전역변수, 상수 등 여러 소스파일에 공통적으로 선언되는 내용을 담고 있는 파일이다. 
      헤더파일은 단독으로 컴파일되지 않고, ‘#include’ 명령으로 지시되는 위치에 선행처리기에 의해 소스 프로그램에 삽입되어 함께 컴파일된다. 
      일반적으로 사용되는 파일 이름의 확장자는 .h이다.
    
  • Q2. 다음 중 C++ 프로그램을 실행 가능한 프로그램으로 변환하는 것과 관련한 설명으로 올바른 것은?

    1
    2
    3
    4
    
      1. C++ 문법에 따라 작성한 프로그램을 목적 코드라고 한다.
      2. 링커는 소스 프로그램 파일을 목적 코드로 번역하는 작업을 수행한다.
      3. 컴파일러는 목적 코드를 소스 프로그램으로 변환한다.
      4. 통합개발환경(IDE)은 소스 프로그램의 편집기, 컴파일러, 링커, 디버깅 도구 등 소프트웨어 개발에 필요한 도구를 통합 제공하는 프로그램이다.
    
    1
    2
    3
    4
    5
    
      4. 통합개발환경(IDE)은 소스 프로그램의 편집기, 컴파일러, 링커, 디버깅 도구 등 소프트웨어 개발에 필요한 도구를 통합 제공하는 프로그램이다.
    
      C++ 문법에 따라 작성한 프로그램을 소스 코드라고 하며, 컴파일러는 이를 목적 코드로 변환하는 역할을 한다. 
      프로그래머가 작성한 프로그램은 링커(linker)를 이용하여 프로그램에서 사용한 라이브러리의 함수 등과 연결하는 링크 과정을 거쳐 실행 파일이 된다. 
      프로그램 개발에 필요한 이러한 도구들을 모아 통합 환경으로 제공하는 프로그램을 통합개발환경(IDE)이라고 한다.
    
  • Q3. 위 지문중 프로그램에서 (다)의 x에 10을 저장하기 위해 빈칸에 넣을 내용은?

    image

    1
    2
    3
    4
    
      1. x
      2. ::x
      3. A::x
      4. std::x
    
    1
    2
    3
    
      2. ::x
        
      main() 함수 내의 지역변수 x가 아닌 전역 명칭공간을 지정하기 위해서는 ::을 첨부한다.
    



학습 정리


  1. C++ 언어는 C 언어에 객체 지향 프로그래밍, 일반화 프로그래밍, 예외 처리 등의 기능을 추가하여 확장된 프로그래밍 언어임
  2. C++ 프로그램은 .cpp라는 확장자를 갖는 소스 프로그램 파일과 .h라는 확장자를 갖는 헤더 파일이라는 두 가지 종류의 소스 파일에 작성함
  3. 선행 처리기 지시어를 이용하여 소스 파일의 컴파일에 앞서 헤더 파일의 삽입, 매크로 선언, 조건부 컴파일 등의 선행 처리를 함.
  4. C++ 프로그램은 함수로 구성되며, 콘솔에서 동작하는 응용 프로그램의 경우 일반적으로 main()이라는 함수부터 프로그램 실행이 시작됨
  5. 명칭 공간 이용 시 프로그램을 구성하는 영역 별로 다른 영역과의 충돌 우려 없이 자유롭게 명칭 선언해 사용 가능공유 등

[멀티미디어 시스템] 1강 - 멀티미디어 개요

[C++ 프로그래밍] 2강 - C++언어의 기초