← back to posts

[문제해결및실습:C++] 2주차 변수와 연산자

세종대학교 2026-1 문제해결및실습:C++ 강의 정리노트

C++

C++ 표준 입출력

C++ 에서도 C와 동일하게 scanf, print로 입출력 가능하긴 한데, C++ 의 표준 입출력은 iostream 에 정의되어있는 cin, cout 이다.

네임스페이스

이름 충돌을 방지하기 위해 식별자(변수, 함수, 클래스 등) 을 논리적으로 묶는 공간

왜 필요한가?

프로젝트가 커지면서 서로 다른 라이브러리나 코드에서 같은 이름을 사용하는 경우가 생길 수 있어서 네임스페이스로 분리한다!

cout

C++ 표준 출력은 cout 스트림 객체를 사용한다.

cout 스트림 객체?

C++ 표준 출력 스트림(Standard Output Stream) 객체로, 콘솔에 데이터를 출력할 때 사용한다

구성 요소설명
std::cout이 속한 네임스페이스
coutCharacter Output의 약자, 출력 스트림 객체
<<삽입 연산자(insertion operator), 데이터를 스트림에 흘려보냄
std::endl개행(\n) + 버퍼 플러시

cin

C++ 표준 입력은 cin 스트림 객체를 사용한다.

cin 스트림 객체

cin은 C++ 표준 입력 스트림(Standard Input Stream) 객체로, 키보드로부터 데이터를 입력받을 때 사용한다.

구성 요소설명
std::cin이 속한 네임스페이스
cinCharacter Input의 약자, 입력 스트림 객체
>>추출 연산자(extraction operator), 스트림에서 데이터를 꺼냄

cin 주의사항

1. 공백 포함 문자열 입력 불가

string name;
cin >> name;
// 입력: "Hong Gildong"
// name = "Hong"  ← 공백 이후는 버려짐

공백 포함 입력은 getline() 을 사용해야 한다.

string name;
getline(cin, name);
// 입력: "Hong Gildong"
// name = "Hong Gildong" ✅

2. cin 후 getline 사용 시 버퍼를 비워줘야 한다.

cin 으로 변수를 입력받으면 변수 + 엔터가 입력되고, 버퍼에 '\n' 이 남아있다!

그래서 getline(cin, name) 하면 name 에 \n이 저장되고, 이를 막기 위해 cin.ignore(); 한번 호출해서 버퍼를 비워줘야 한다.

3. 잘못된 타입 입력 시 스트림 오류

int age;
std::cin >> age;
// 입력: "abc" (정수가 아닌 값)
// cin이 fail 상태가 되어 이후 입력이 모두 무시됨

// 해결법
if (std::cin.fail()) {
    std::cin.clear();        // 오류 상태 초기화
    std::cin.ignore(1000, '\n'); // 버퍼 비우기
}

흐름 방향 (cout, cin 비교)

// cout: 데이터를 콘솔로 내보냄
[변수] → << → [cout] → [콘솔 화면]

// cin: 콘솔에서 데이터를 가져옴
[키보드 입력] → [cin] → >> → [변수]

자료형

C++ 에서의 자료형

크게 5가지로 분류한다.

1. void

형식이 없음을 표현하는 키워드로, 변수 선언에는 사용하지 않는다.

함수 리턴값이 없거나 파라미터가 없을 때, 제네릭 포인터 에 사용한다

2. bool

참, 거짓만 가질 수 있는 자료형
true, false 를 가진다

3.1 char

C/C++ 에서 문자, 문자열을 다룰 때 사용하는 대표 자료형

1byte 데이터 저장이 가능하고, 영문자는 1byte 로 표현 가능하여 아스키코드로 정의해 사용한다.

3.2 wchar_t

와이드 문자를 저장하는 자료형

1byte 로 표현이 불가능한 문자를 와이드 문자라고 한다.
인코딩 방식에 따라 2byte char 를 사용하는 멀티바이트(MBCS), wchar_t 를 사용하는 유니코드(UNICODE)로 구별된다.

wchar_t 의 크기는 컴파일러마다 다르다.
visual studio 에서는 (cl) 2byte 로 정의, GCC에서는 4byte 로 정의

GCC 컴파일 옵션에서 -fshort-wchar 라는 옵션으로 wchar_t 를 2byte로 사용할 수 있다고 함

4. int, short, long, long

정수를 표현하는 자료형

표현할 수 있는 범위와 부호에 따라서 다른 자료형을 사용한다.

char(1byte), short(2byte), int(2, 4byte), long(4byte), long long(8byte)

int 는 환경에 따라 다르다!

16bit 시스템에서는 16bit(=2byte)
32bit 시스템에서는 32bit(=4byte)
64bit 시스템에서는 32bit(=4byte)

5. 부동소수점 float, double

실수를 표현하는 자료형

소수점 이하로 계속해서 반복되는 숫자를 한정된 데이터 크기로 표현하는 방법
소수점 아래가 n자리, 앞자리가 m자리 일때, 소수점 위치를 고정해버리면 효율적으로 값을 저장할 수 없다.

따라서 소수점을 고정하지 않고 필요에 따라 변경하며 사용할 수 있게 한게 부동소수점!

형변환

크기 작은 자료형의 값을 큰 자료형에 할당하면 유실 없음,
크기 큰 자료형의 값을 작은 자료형에 할당하면 유실 가능

자료형 계열이 다를 경우 변환 불가 혹은 잘못된 변환 발생!

  • string -> int, wchar_t -> double 등

변환 방식에 따른 구분

  • 암시적 형변환(implicit cast): 컴파일러가 자동으로 변경
  • 명시적 형변환(explicit cast): 개발자가 의도적으로 직접 변경
float val_float = 3.14159265358979f; // float 변수 선언
double val_double, val_double_two; // double 변수 선언

val_double = val_float; // 암시적 형 변환
val_double_two = double(val_float); // 명시적 형 변환

키워드와 리터럴

키워드

특별한 의미로 미리 정의해둔 식별자
변수 이름, 클래스 이름 등 식별자와 구별되는 예약어

C++20 기준 97개의 단어가 키워드로 예약되어있다!

리터럴

코드에 직접 표현된 변하지 않는 값 그 자체

접미사를 붙여 지정하는 리터럴

float value = 0.5f;
unsigned int value = 5u;
long value = 5L;

접미사를 붙여서 이 리터럴의 자료형을 명시적으로 지정해준다.

근데 리터럴에서 접미사는 optional 이라 생략해도 컴파일은 된다. 그러나 의도치 않은 정밀도 문제가 발생할 수 있다.

예를 들어 0.5 라는 값을 float 변수에 할당해도 컴파일러는 0.5를 double 로 처리한다.

float a = 0.5;  // double
float b = 0.5f; // float

문자열 표현 방식

C에서 사용하는 것처럼 char 배열을 생성하거나 문자 포인터를 시작 주소로 사용할 수 있다.

char *str = "Hello";
char str[] = "Hello";

사용이 더 편리한 std::string 클래스도 있다.

<string> 에 들어있는데, <iostream>에 이미 포함되어있다.

왜 char[] 보다 std::string 을 더 많이 쓰는건가?

std::string 은 문자열을 다룰 때 다음과 같은 장점이 있다.

  • 길이를 쉽게 구할 수 있다.
  • 문자열끼리 +로 쉽게 이어 붙일 수 있다.
  • 특정 위치 문자 접근이 쉽다.
  • 부분 문자열 추출이 쉽다.
  • 크기가 자동으로 관리된다.