[문제해결및실습:C++] 2주차 변수와 연산자
세종대학교 2026-1 문제해결및실습:C++ 강의 정리노트
C++ 표준 입출력
C++ 에서도 C와 동일하게 scanf, print로 입출력 가능하긴 한데, C++ 의 표준 입출력은 iostream 에 정의되어있는 cin, cout 이다.
네임스페이스
이름 충돌을 방지하기 위해 식별자(변수, 함수, 클래스 등) 을 논리적으로 묶는 공간
왜 필요한가?
프로젝트가 커지면서 서로 다른 라이브러리나 코드에서 같은 이름을 사용하는 경우가 생길 수 있어서 네임스페이스로 분리한다!
cout
C++ 표준 출력은 cout 스트림 객체를 사용한다.
cout 스트림 객체?
C++ 표준 출력 스트림(Standard Output Stream) 객체로, 콘솔에 데이터를 출력할 때 사용한다
| 구성 요소 | 설명 |
|---|---|
std:: | cout이 속한 네임스페이스 |
cout | Character Output의 약자, 출력 스트림 객체 |
<< | 삽입 연산자(insertion operator), 데이터를 스트림에 흘려보냄 |
std::endl | 개행(\n) + 버퍼 플러시 |
cin
C++ 표준 입력은 cin 스트림 객체를 사용한다.
cin 스트림 객체
cin은 C++ 표준 입력 스트림(Standard Input Stream) 객체로, 키보드로부터 데이터를 입력받을 때 사용한다.
| 구성 요소 | 설명 |
|---|---|
std:: | cin이 속한 네임스페이스 |
cin | Character 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 은 문자열을 다룰 때 다음과 같은 장점이 있다.
- 길이를 쉽게 구할 수 있다.
- 문자열끼리
+로 쉽게 이어 붙일 수 있다. - 특정 위치 문자 접근이 쉽다.
- 부분 문자열 추출이 쉽다.
- 크기가 자동으로 관리된다.