[C++] 02. C++ 프로그래밍의 기본

SunowMin·2023년 9월 16일

C++

목록 보기
3/8

1. C++ 프로그램의 기본 요소와 화면 출력

main() 함수

  • C++ 프로그램의 실행 시작점이므로 반드시 하나의 main() 함수가 존재해야 함
  • C++ 표준에서 정한 main() 함수의 리턴 타입은 int
  • ina main() 함수에 대해서만 예외적으로 return 문을 생략 가능

✅ main() 함수가 return한 정수 값은 누구에게 전달되는가?
부모 프로그램은 자식 프로그램의 main() 함수에서 리턴한 정수 값을 알아내는 함수를 통해, 자식 프로그램의 종료 상태를 알게 됨.
개발자가 부모/자식 프로그램을 따로 나눠놓지 않는 이상, 부모는 운영체제-자식은 응용프로그램으로 설정됨 -> 특별한 종료 관계가 없기 때문에 0이 아닌 다른 정수를 리턴한다고 해도 아무 의미 없음



#include <iostream>

  • 전처리기(C++ Preprocessor)에 대한 지시문
  • <iostream> 헤더파일에는 C++ 표준 입출력을 위한 클래스와 객체가 선언되어 있음 (Input/Output Stream)


화면에서 다음 줄로 넘어가기

std::cout << "Hello" << '\n';
std::cout << "Hello" << std::endl;

처리 방법 차이

1. '\n' 문자

  • << 연산자가 '\n'문자를 cout 스트림 버퍼에 단순 삽입하고 끝
    -> 그 후 cout 스트림 버퍼가 꽉 차거나 강제 출력 지시가 있는 경우, cout은 '\n'를 해석하여 그 다음 줄로 넘김

2. endl 조작자(manipulator)

  • <iostream> 헤더 파일에 작성되어 있는 함수로 std::cout << "Hello" << std::endl; 코드 실행
    -> << 연산자가 endl() 함수 호출
    -> endl() 함수는 '\n'을 cout의 스트림 버퍼에 넣음
    -> cout에게 현재 스트림 버퍼에 있는 데이터를 즉각 장치에 출력하도록 지시
    => 개행 실행과 동시에 cout의 스트림 버퍼에 있는 모든 데이터를 출력

스트림과 버퍼

  • 스트림(stream)
    - 실제의 입력이나 출력이 표현된 데이터의 이상화된 흐름 = 운영체제에 의해 생성되는 가상의 연결고리(중간 매개자) 역할
  • 버퍼(buffer)
    - 스트림 내부에 있는 임시 메모리 공간
    • 입력된 문자를 한 번에 전달하므로, 전송 시간이 적게 걸려 성능 향상
    • 문자를 잘못 입력한 경우 수정 가능



2. namespace와 std::

namespace(이름 공간)

  • 이름 충돌이 발생할 때를 대비해 자신만의 고유한 이름 공간을 생성할 수 있도록 namespace 키워드 사용
  • ::는 범위 지정 연산자
// 이름공간 생성
namespace kitae{ // kitae라는 이름 공간 생성
 	.......... 	 // 선언되는 모든 이름은 kitae 이름 공간에 생성된 이름
}

// 이름공간 이용
이름공간(namespace) :: 이름(identifier)

std::

  • 표준 이름 공간 : 모든 C++ 표준 라이브러리는 std 이름공간에 만들어져 있음
  • std 이름 공간에 선언된 모든 이름에 대해 std::를 생락하고자 하면 namespace 키워드와 함께 using 지시어 사용
    usnig namespace std;



3. 키보드로 문자열 입력

문자열은 C++의 기본 데이터 타입이 아니라서 다음 두 방법으로 문자열 표현
① C-스트링 : C 언어에서 문자열을 표현하는 방법
② string 클래스 : 문자열을 객체로 다루는 방법(권장)

① C-스트링

char name1[6] = {'G','r','a','c','e','\0'}; // 문자열 'Grace'
char name2[5] = {'G','r','a','c','e'};      // 단순 문자 배열

// 문자열 리터럴을 직접 배열에 저장하여 문자열 생성
char name3[6] = "Grace";
char name4[] = "Grace"; //배열의 크기는 6으로 자동 설정
  • 널 문자('\0' 혹은 '0')로 끝나는 char 배열
  • C++ 응용 프로그램은 C 라이브러리 함수들을 그대로 사용할 수 있음(<cstring>이나 <string.h> 헤더파일 include 함으로써)
    - <cstring> 헤더파일은 내부적으로 <string.h>를 include하지만, C++ 표준에 따라 <cstring> include 하는 것이 바람직

cin을 이용한 문자열 입력

// name[] 배열에 문자열을 입력받는 코드
char name[6];  // 5개의 문자로 구성되는 문자열을 저장할 수 있는 char 배열
cin >> name;   // 키보드에서 문자열을 읽어 name 배열에 저장
  • name 배열의 크기가 6이기 때문에 5개 이하의 문자만 입력받을 수 있음(한글은 2개 이하)

✅ '>> 연산자'는 공백문자를 만나면 그 전까지 입력된 문자들을 하나의 문자열로 인식

cin.getline() : 공백이 포함된 문자열을 입력받기

cin 객체의 getline() 멤버 함수를 이용하면 공백이 포함된 문자열을 입력받을 수 있음

cin.getline(char buff[], int size, char delimitchat)

- buff : 키보드로부터 읽은 문자열을 저장할 배열
- size : buf[] 배열의 길이
- delimitchar : 문자열 입력 끝을 지정하는 구분 문자
  • 최대 size-1개의 문자를 입력받거나 delimitchar로 지정된 문자를 만나면 문자열의 입력이 종료
  • 입력된 문자열은 buf[]배열에 저장
  • delimitChar로 지정된 문자는 저장되지 않고 cin 버퍼에서도 사라짐
  • buf[ ] 배열에 널 문자('\0')가 덧붙여짐
  • delimitChar의 디폴트 값 : '\n'이므로 생략 가능


② string 클래스

  • C++ 표준 라이브러리에서 제공
  • C-스트링은 배열의 크기에 의해 문자열의 크기가 고정, string 클래스는 문자열의 크기에 제한이 없고, 객체 지향적이고, 문자열을 다루기 쉬움(문자열 연산을 위한 멤버 함수와 연산자 제공)
#include <iostream>
#include <string> // string 클래스를 사용하기 위한 헤더 파일
using namespace std;

int main() {
	string song("Falling in love with you"); // 문자열 song
	string elvis("Elvis Presley"); // 문자열 elvis
	string singer; // 문자열 singer

	cout << song + "를 부른 가수는"; // + 로 문자열 연결
	cout << "(힌트 : 첫글자는 " << elvis[0] << ")?";  // [] 연산자 사용

	getline(cin, singer); // 문자열 입력
	if(singer == elvis)  // 문자열 비교
			cout << "맞았습니다.";
	else
			cout << "틀렸습니다. "+ elvis + "입니다." << endl; // +로 문자열 연결
}

비교

#include <iostream>
#include <string>   // string 클래스를 사용하기 위한 헤더 파일
using namespace std;

int main() {
	// getline을 사용하여 문자열 입력 받기
	string input;
	cout << "문자열을 입력하세요. ";
	getline(cin, input);
	cout << "입력한 문자열" << input;

	// cin.getline을 사용하여 문자열 입력 받기
	char buffer[100];
	cout << "문자열을 입력하세요. ";
	cin.getline(buffer, 100);
	cout << "입력한 문자열" << buffer;
}





4. #include <iostream>

#include <iostream>와 전처리기

  • C++ 컴파일러는 컴파일 전에 전처리기(preprocessor) 실행시켜 #include문을 모두 처리
    - #include문에 지정된 <헤더 파일>의 텍스트를 #include문이 있던 그 자리에 삽입
    => 이를 헤더 파일의 확장이라고 함8u
    • 모든 헤더 파일의 확장이 완료되면 전처리기 종료
  • 전처리기가 종료되면 확장된 상태의 cpp파일이 컴파일 됨


헤더파일

  • <iostream> 헤더파일은 컴파일러가 설치된 폴더의 include 폴더에 존재
  • 표준 C++은 헤더파일에 확장자를 붙이지 않음!

헤더파일에는 무엇이 들어 있는가?

예를 들어 strcpy() 함수를 사용하려면

  • <cstring>을 include 하는데, 그 이유는 strcpy() 함수의 코드가 들어있기 때문 (X)
    - strcpy() 함수의 코드는 이미 컴파일된 기계어 형태로 C 라이브러리에 들어 있음
  • <cstring> 헤더파일에는 strcpy() 함수의 선언만(원형) 들어 있으며, 컴파일할 때 strcpy() 함수의 호출이 정확한지 판단하는데 사용

#include <헤더파일> vs #include "헤더파일"

  • #include <헤더파일>
    - 컴파일러가 설치된 폴더에서 '헤더 파일'을 찾으라는 지시
  • #include "헤더파일"
    - 개발자의 프로젝트 폴더에서 '헤더 파일'을 찾으라는 지시
    • 개발자 자신이 만든 헤더 파일을 사용하는 경우에 해당





해당 포스팅은 '황기태, 『명품 C++ Programming』, 생능출판사'를 참고하여 작성하였습니다.

0개의 댓글