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

SunowMin·2023년 9월 16일
0

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개의 댓글