수리 공작소

[명품 C++ Programming] 제 2장 C++ 프로그래밍 기본 요소 본문

Algorithm/C++

[명품 C++ Programming] 제 2장 C++ 프로그래밍 기본 요소

suleee 2024. 10. 9. 01:10

main

C++ main 함수 사용의 표준 형태

int main(){
	return 0;
}

 

  • void  main()도 가능 하지만 이는 C++은 아니다.
  • main 함수 한해서만 return 문 생략이 가능하다.
  • main 함수의 return 값은 어디에 사용이 되는지? 
    • return 문은 부모 프로세스로 하여금 자식 프로세스의 종료 상태를 알 수 있게 한다.
    • 일단 별도로 부모 자식 프로세스를 나누지 않은 상태에서 프로그램의 부모 프로세스는 운영체제이다. 
    • 따라서 위와 같은 상황에서 어떤 프로그램의 종료 상태(return 값)는 운영체제에 전달이 되게 된다.
    • 만약 종료 상태 번호에 대한 관계를 따로 설정해놓은 상태라면 의미가 있지만 그렇지 않다면 아무 의미 없다.

 

<iostream>, cout, <<, endl

C++ 에서 출력할 때 사용하는 cout과 << 모두 해당 헤더파일에 선언되어있다. (보충 필요)

  • cout : iostream 에 선언된 ostream 이라는 클래스의 인스턴스이다. 스크린 장치와 연결되어있다. 
  • cin : iostream 에 선언된 istream 이라는 클래스의 인스턴스이다. 키보드 장치와 연결되어있다.
  • << : 스트림 삽입 연산자, 오른쪽의 피연산자 데이터를 왼쪽 스트림 객체에 삽입하는 연산자이다.
  • endl : manipulator, 이 함수는 cout 스트림 버퍼에 '\n'을 넣고, 현재 스트림 버터에있는 데이터를 즉각 출력하도록 지시한다.
  • 본래의 << 연산자는 shift 연산자로 비트를 왼쪽으로 옮겨주는 연산을 실행하는데, 여기에서 오버로딩이 사용되었다.

 

namespace와 std::

namespace 는 이름 공간이다. 2반 나영이와 3반 나영이는 다른 것처럼, 같은 이름이라도 다른 이름공간에 있으면 구분이 된다. 

이 예시에서 알 수 있듯, namespace는 이름 충돌이 발생하는 경우를 없애기 위해 사용하는 개념이다. 

규모가 큰 프로젝트를 여러명에서 작업을 하다보면, 내가 구현한 함수의 이름과 다른 사람이 구현한 함수의 이름이 같아버리는 경우가 있을 수 있다. 이를 해결하기 위해 이름 공간을 나누어 사용하는 방식이 나왔다. 

 

namespace를 생성할 수 있는데, 생성 방법은 다음과 같다

namespace sulee {
	// 이 안에 구현
}

이를 사용할 때에는 sulee::구현한함수 이런식으로 하면 된다. 그런데 이렇게 사용할 때에는 선언된 모든 이름앞에 붙여야 하므로 이를 생략하기 위해선 using namespace sulee; 이런식으로 파일 상단에 선언하면 된다. 

여기에서 ::는 범위 지정 연산자이다. 

 

 C++ 에서 지원하는 모든 라이브러리는 std 이름 공간 안에 구현이 되어있다.

 

cin으로 입력받기

  • cin으로 입력을 받을 때 >> 를 사용 (스트림 추출 연산자)
  • 왼쪽 피연산자인 스트림 객체로부터 데이터를 읽어 오른쪽 피연산자의 변수에 삽입한다.
  • 이때 입력이 끝난지는 Enter가 구분해준다
    • 입력된 값들은 일단 cin의 스트림 버퍼에 저장이 된다. Enter가 입력되면 이 스트림 버퍼에서 키 값을 끌어내어 변수에 저장
    • 만일 입력 중 Backspace를 누르면 cin 스트림 버퍼에 입력된 키를 제거할 수 있다.

 

C++에서 문자열

C++에서 문자열은 기본 데이터 타입이 아니다. 문자열을 다룰 때에는 아래와 같은 2가지 방식 중 하나를 선택한다.

  1. C-스트링
  2. string 클래스

1번째 방법은 C언어에서 사용하는 방식인 널문자로 끝나는 char 배열을 말한다.

char name1[6] = {'G', 'R, 'A', 'P', 'E', '\0'};
char name2[5] = {'G', 'R', 'A', 'P', 'E'};
char name3[6] = "GRAPE";
char name4[] = "GRAPE";
char name5[10] = "GRAPE";

이 경우에 위의 name2는 문자열이 아니다. 그 이유는 널문자로 끝나지 않기 때문이다. 

그 외의 경우는 모두 널 문자로 종료되는 문자열로 취급된다.

name5 같은 경우에는 배열의 크기가 문자열의 길이보다 크지만 나머지 공간은 모두 '\0' 문자로 채워진다.

 

입력을 받을 때에도 사용할 수 있다.

char name[6];
cin >> name;

이런식으로 받을 때 주의할 점은, 입력하는 문자열의 문자 개수가 널을 포함해서 6개 이하여야 한다는 것이다. 

그렇지 않으면 런타임 에러가 난다.

 

그런데 cin 은 '공백 문자' 단위로 하나의 문자열로 인식한다.

"마 니 또" 를 입력하면 마, 니, 또 이렇게 나뉘게 된다는 이야기다.

만일 공백 문자를 포함한 문자열을 통째로 입력받고 싶다면

cin에 있는 getline() 함수를 사용하면 된다. -> cin.getline()

 

2번째 방법은 string 클래스를 사용하는 방법이다. 다음과 같은 장점이 있다.

  • 문자열의 크기에 제약이 없다.
  • 객체 지향적이다.
  • 문자열을 다루기 쉽다.

getline() 을 하면 된다.

 

헤더 파일 확장 

전처리기는  #include 문에 대한 '헤더 파일 확장'을 한다. 

'헤더 파일 확장'이란 include 문에 해당 하는 헤더파일의 텍스트를 그대로 그 자리에 붙여넣는 작업이다.

 

 

'Algorithm > C++' 카테고리의 다른 글

[명품 C++ Programming] 제 1장 C++ 개념 부분 정리  (0) 2024.10.06