C ++ 기초 (1)

2024. 3. 22. 14:37C++

1. C++이란?

C언어 + 객체 지향 언어 = C++

▶ C언어의 모든것을 담고 있음

 

1.1. C++의 역사

Asembly → BCPL → B → C → C++ → Java/C++표준 변화  → C#

 

1.2. 객체 지향 프로그래핑이란?

클래스와 상속을 이용하여 소프트웨어의 재사용성을 높이고 개발과 관리를 쉽게하는 것

객체 지향의 특징으로는 클래스를 통해 캡슐화를 진행하며, 실체인 객체가 존재한다. 또한, 상속성과 다형성이 있다.

 

1.3. 표준 C++의 중요성

어떠한 C++ 버전이냐에 따라 특정 컴파일러에서만 컴파일이 진행된다.

즉, 표준 C++은 볼랜드, 비주얼, GNU등의 모든 컴파일러에 대해 컴파일이 되지만 비주얼 C++은 비주얼 컴파일러에 대해서만 실행파일이 제작된다. 

 

1.4. C++ 특징

(a) 호환성

(b) 객체 지향 개념

(c) 타입 체크 엄격, 효율성 저하 최소화

(d) C언어에서는 없는 추가 기능 존재 → 함수 중복, 디폴트 매개변수, 참조, new와 delete 연산자, 연산자 재정의, 제너릭 함수와 클래스

 

 

2. 기본

2.1. 주석문

#include <iostream>

/*주석*/
// 주석

2.2. main() 함수

#include <iostream> //전처리기, c++표준입출력을 위한 클래스와 객체 정보가 포함되어 있음

int main() // 시작점, void main()은 표준이 아님
{
	return 0; //c++ 표준에서는 main 내 return이 생략 가능함(편의상)
}

 

2.3. 화면 출력

#include <iostream> 

int main()
{
	std::cout<< "Hello\n"; 
    /*
       "cout": c++표준 출력 스티림 객체
       "<< 연산자": 스트림 삽입 연산자, 오른쪽 피연산자 데이터를 왼쪽 스트림 객체에 삽입됨
       "<< 연산자" 특징: 본래 정수르 왼쪽으로 shift하는 c++ 기본 연산자지만 출력 시스트림에서는 데이터를 삽입하는 삽입 연산자로 재정의되어 cout와 함께 사용됨
    */
	return 0;
}

 

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

\nstd::endl 두가지 방식으로 다음 줄로 넘어갈 수 있다.

 

[1] \n

  • << 연산자가 '\n' 문자를 cout의 스트림 버퍼에 단순히 삽입하고 끝난다.
  • 즉, 스트림 버퍼가 꽉 차거나 강제 출력 지시가 있는 경우, cout은 버퍼에 삽입된 \n을 해석하여 커서를 다음 줄로 넘긴다.

[2] std::endl

  • 'std::endl'은 <iostream> 헤더 파일에 작성되어 있는 함수다.
  • << 연산자가 ednl()함수를 호출한다.
  • endl() 함수는 '\n'을 cout 스트림 버퍼에 넣고 현재 스트림 버퍼에 있는 모든 데이터를 출력시킨다.

2.4. namespace와 std::

2.4.1. namespace

이름 충돌 때문에 생긴 것이다.

이름 공간(namespace) :: 이름(identifier) ▷ 여기서 ::은 범위 지정 연산자이다.

2.4.2. std::

std는 2003년 c++ 표준에서 정한 표준 이름 공간이다.

이에, c++ 표준 입출력 라이브러리에 포함된 cout나 endl은 앞에 std::를 붙여야 한다.

#include <iostream>

int main()
{
	std::cout << "Hello" << std::endl;
}

 

 

이때, using 지시어를 사용하면 std::를 생략할 수 있다. 

using 지시어와 namespace를 같이 사용하여 cout나 endl이 std 이름 공간에 선언된 이름임을 공표하여 생략하게 해준다. 

#include <iostream>

using namespace std;//using std::cout; 하면 cout에서만 생략됨 

int main()
{
	cout << "Hello" << endl;
}

 

 

2.5. 입력 받기

2.5.1. cin과 >> 연산자

cin과 >> 연산자를 이용하여 사용자로 부터 값을 입력받을 수 있다.

cin은 c++ 표준 입력 스트림 객체이다.

#include <iostream>

int main()
{
	int weight;
    cin >> weight;
}

 

입력 과정 

사용자가 값을 입력함 → ENTER 입력함 →  c++ 입력 시스템이 입력 완료를 인식함 → 입력받은 값이 cin 객체의 스트림 버퍼에 저장됨  → 응용프로그램은 cin 객체로부터 입력된 값을 읽음

 

2.6. 문자열

c++ 문자열에는 C-스트링과 string 클래스 두가지 방법으로 문자열 표현이 가능하다. 

2.6.1. C- 스트링

C-스트링은 null 문자로 끝나는 char 배열을 의미한다. 

C언어에서 사용한 문자열 방식이다. 

#include <iostream>

int main()
{
	char name[7] = {'N', 'o', 'm', 'i', 'n', 'g', '\0'}; //문자열
    char name[6] = {'N', 'o', 'm', 'i', 'n', 'g'}; //단순 문자 배열, 문자열 아님
    
    char name[10] = "Noming"; //마지막에 \0 추가를 위해 문자수 보다 1이 크면 되는거라 많아도 문자열이다. 알아서 남은 자리에 \0으로 다 채운다.
	char name[] = "Noming"; //알아서 7 크기로 할당함
}

 

이렇게 C-스트링으로 문자열을 구성하면 C 프로그래밍에서사용했던 strcpy(), strcmp(), strlen()등의 라이브러리 함수를사용할 수 있다.

 

C-스트링의 라이브러리는 표준으로는 <cstring> 헤더파일을 불러오는 것이 맞다. 하지만 <string.h>도 동일한 내용을 포함하기 때문에 헷갈릴수 있다. 그럼에도 C++ 표준에 맞춰 <cstring>을 사용하기 바란다.

#include <iostream>

int main()
{
	char name[7];
    
    cin >> name; //만약 Noming을 입력하면 마지막 7번째 배열에는 \0이 저장된다.
}

 

입력 크기 주의

위 코드처럼 name에 값을 입력받을 경우 영어는 동일하게 6자리까지 입력해주면 알아서 \0이 저장되어 문자열로 저장되지만, 한국어는 문자 하나당 2바이트이기 때문에 3자리까지만 입력해야한다. 

#include <iostream>
#include <cstring>
using namespace std;

int main()
{
	char name[7];
    
    while(True)
    {
    	cin >> name;
        if(strcmp(name, "noming")==0){ //C라이브러리 내 함수 사용가능
        	cout << "정답" << endl;
            break;
        }
    }
    return 0;
}

 

문자열을 cin으로 입력 받을때이 문제점

공백을 만나면 그전까지의 문자들만 문자열로 인식한다!!!

 

그래서 등장한 것이 cin.getline()이다.

getline() 멤버 함수는 공백이 포함된 문자열을 입력 받을 수 있다. 

cin.getline (char buf[], int size, char delimitChar)
//buf: 키보드로부터 읽은 문자열을 저장할 배열
//size : buf[] 배열의 크기
//delimitChar : 문자열 입력 끝을 지정하는 구분 문자

//예시
char address[100];
cin.getline(address, 100, '\n'); //South Korea이후 Enter하면 South +''+ Korea +'\0'으로 저장한다.
cin.getline(address, 100); //디폴트가 \n이여서 delimiChar을 생략 가능하다.

 

2.6.2. string 클래스

두번째 방법인 string 클래스는 c++ 표준 라이브러리에서 제공한다. 

C-스트링은 크기가 고정되어 있는 불편함이 있는 반면 string은 크기에 제약이 없다. 

사용하는 헤더파일은 <string>이다. 

#include <iostream>
#include <string> 
using namespace std;

int main()
{
	string name("noming");
    string name2;
    cin.getline(name2, "noming");
}

 

<iostream>

전처리기는 컴파일러에 의해 내부적으로 호출되며, 헤더파일의 확장을 완료한다. 

예를 들어 iostream은 istream을 내부적으로 호출하고 있으며, istream은 ostream을 내부적으로 호출한다. ostream또한 ios 헤더를 내부적으로 호출한다. 이렇게 모든 확장이 끝나는 전처리 과정을 걸치면, .cpp 파일이 생성된다.