C++을 공부하면서 필요한 내용들을 코딩해 보았다..! 코드를 보는 것만으로도 이해는 되지만
책에 나온 개념을 직접 코딩해 보면 이해도 잘되고 코딩 실력도 훨씬 잘 느는 것 같다.
첫 글은 C++의 기본이 되는 자료형, 표현식과 문장에 대한 것이다.
당연히 알만한 것 들이지만 C언어 놓은지 한참 돼서..ㅎㅎ 감 좀 익히려고 이런 것도 해봤다.
•
기본 (입출력 + 연산)
#include <iostream>
using namespace std;
int main() {
int num1, num2, sum;
cout << "첫 번째 숫자 입력: ";
cin >> num1;
cout << "두 번째 숫자 입력: ";
cin >> num2;
sum = num1 + num2;
cout << "두 숫자의 합: " << sum;
return 0;
}
C++
복사
•
자료형, 상수, 변수 정의
#include <iostream>
using namespace std;
int main() {
// 상수 정의
const unsigned int pennyValue = 1;
const unsigned int nickelValue = 5;
const unsigned int dimeValue = 10;
const unsigned int quarterValue = 25;
const unsigned int dollarValue = 100;
// 변수 정의
unsigned int pennies, nickels, dimes, quarters, dollars;
// 전체 값을 나타내는 변수 선언
unsigned long totalValue; // long = long int (4바이트)
// 코인 입력받기
cout << "페니의 수: ";
cin >> pennies;
cout << "니켈의 수: ";
cin >> nickels;
cout << "다임의 수: ";
cin >> dimes;
cout << "쿼터의 수: ";
cin >> quarters;
cout << "달러의 수: ";
cin >> dollars;
// 전체 금액 계산
totalValue = pennies * pennyValue + nickels * nickelValue + dimes * dimeValue + quarters * quarterValue + dollars * dollarValue;
// 결과 출력
cout << "전체 금액은 " << totalValue << "페니입니다.";
return 0;
}
C++
복사
•
문자열 자료형
#include <iostream>
#include <string>
using namespace std;
int main() {
// 변수 선언
string first;
string initial;
string last;
string space = " ";
string dot = ".";
string fullname;
// 이름, 이니셜, 성 입력받기
cout << "이름(firstname) 입력하기: ";
cin >> first;
cout << "이니셜(initial) 입력하기: ";
cin >> initial;
cout << "성(last) 입력하기: ";
cin >> last;
// 결합 연산자로 문자열 연결
fullname = first + space + initial + dot + last;
// 전체 출력
cout << "전체 이름(full name): " << fullname << endl;
return 0;
}
C++
복사
"A" : 문자(character)
"Hello" : 문자열(string)
<sizeof>
int = 4
char = 1
short = 2
long = 4
float = 4 -> 소수점 이하 6자리
double = 8 -> 소수점 이하 15자리
long double = 12
•
표현식
표현식은 특정 값을 가진 엔티티(개체)이며 메모리의 상태를 변경할 수도 있음.
•
괄호 표현식
#include <iostream>
using namespace std;
int main() {
// 변수 선언
int x = 4;
cout << "Value with parentheses:" << (x + 3) * 5 << endl;
cout << "Value without parentheses:" << x + 3 * 5 << endl << endl;
return 0;
}
C++
복사
•
단순 할당 연산자
#include <iostream>
using namespace std;
int main() {
// 변수 선언
int x;
int y;
cout << "리턴할 값: " << (x = 14) << endl;
cout << "x의 값: " << x << endl;
cout << "리턴할 값: " << (y = 87) << endl;
cout << "y의 값: " << y << endl;
return 0;
}
C++
복사
•
복합 할당
+=, %= …
•
암묵적 자료형 변환 - 피연산자에 자동으로 승격
<typeinfo>라는 헤더 파일을 추가해야 함.
typeid (표현식).name()
#include <iostream>
#include <typeinfo>
using namespace std;
int main() {
// 선언
bool x = true;
char y = 'A';
short z = 14;
float t = 24.5;
// bool to int
cout << "Type of x + 100: " << typeid (x + 100).name() << endl;
cout << "Value of x + 100: " << x + 100 << endl;
// char to int
cout << "Type of y + 1000: " << typeid(y + 1000).name() << endl;
cout << "Value of y + 1000: " << y + 1000 << endl;
// short to int
cout << "Type of z * 100: " << typeid(z * 100).name() << endl;
cout << "Value of z * 100: " << z * 100 << endl;
// float to double
cout << "Type of t + 15000.2: " << typeid(t + 15000.2).name() << endl;
cout << "Value of t + 15000.2: " << t + 15000.2 << endl;
return 0;
}
C++
복사
•
명시적 자료형 변환(캐스팅)
피연산자의 자료형을 원하는 형태로 강제로 변환하는 것을 명시적 자료형 변환 or 캐스팅(casting)이라고 부름.
static_cast <자료형> (표현식)
#include <iostream>
using namespace std;
int main() {
// 선언
double x = 23.56;
int y = 30;
cout << "Without casting: " << x + y << endl;
cout << "With casting: " << static_cast <int> (x) + y;
return 0;
}
C++
복사
•
오버플로우와 언더플로우
자료형의 최대값보다 크거나 최소값보다 작은 값을 저장하려고 하면 문제가 발생하는데,
이러한 문제를 오버플로우와 언더플로우라고 부름.
•
오버플로우와 언더플로우 예제 (부호 X)
#include <iostream>
#include <limits>
using namespace std;
int main() {
// max min 변수
unsigned int num1 = numeric_limits <unsigned int> ::max();
unsigned int num2 = numeric_limits <unsigned int> ::min();
// 변수 출력
cout << "maximum unsigned int값: " << num1 << endl;
cout << "minimum unsigned int값: " << num2 << endl;
// 오버플로우
num1 += 1;
num2 -= 1;
cout << "num1 + 1 오버플로우: " << num1 << endl;
cout << "num2 - 1 오버플로우: " << num2 << endl;
return 0;
C++
복사
•
오버플로우와 언더플로우 예제 (부호 O)
#include <iostream>
#include <limits>
using namespace std;
int main() {
// max min 변수
int num1 = numeric_limits <int> ::max();
int num2 = numeric_limits <int> ::min();
// 변수 출력
cout << "maximum signed int값: " << num1 << endl;
cout << "minimum signed int값: " << num2 << endl;
// 오버플로우
num1 += 1;
num2 -= 1;
cout << "num1 + 1 오버플로우: " << num1 << endl;
cout << "num2 - 1 오버플로우: " << num2 << endl;
return 0;
}
C++
복사
•
조정자
진법의 접두사를 붙이는 조정자 : default로 noshowbase. showbase를 사용하면 8진수 앞에 0, 16진수 앞에 0x가 접두사로 붙음.
숫자의 진법을 변경하는 조정자 : dec - 10진 (default), oct - 8진, hex - 16진
부동 소수점 조정자 : default로 fixed. showpoint를 사용하면 .00이 붙음.
•
변수 선언
단일 선언 - ex) int sum;
복수 선언 - ex) int first, second, third;
초기화 - ex) double average = 0.0, mean = 0.0;
상수 선언 - ex) const double PI = 3.1415926536;
•
3개의 변수를 입력받고 합계를 구하여 출력
#include <iostream>
using namespace std;
int main() {
// 변수 선언
int first, second, third, sum;
cout << "첫 번째 변수 입력: ";
cin >> first;
cout << "두 번째 변수 입력: ";
cin >> second;
cout << "세 번째 변수 입력: ";
cin >> third;
// 계산식
sum = first + second + third;
// 값 출력
cout << "모든 변수의 합: " << sum << endl;
return 0;
}
C++
복사
•
부동 소수점 분해
부동 소수점이 주어지면 이를 정수 부분과 소수점 아래 부분으로 분리.
ex) 123.78 입력 -> 123, 0.78 출력.
#include <iostream>
#include <iomanip>
using namespace std;
int main() {
// 변수 선언
double num;
int intPart;
double fractPart;
// 입력
cout << "숫자를 입력하세요: ";
cin >> num;
// 처리
intPart = static_cast <int> (num);
fractPart = num - intPart;
// 출력
cout << fixed << showpoint << setprecision(2);
cout << "숫자: " << num << endl;
cout << "정수 부분: " << intPart << endl;
cout << "소수점 아래 부분: " << fractPart << endl;
return 0;
}
C++
복사
•
정수 첫 번째 자릿수 추출
정수가 주어졌을 때, 첫 번째 자릿수를 추출하는 프로그램.
ex) 6259 입력 -> 9 출력
#include <iostream>
using namespace std;
int main() {
// 변수 선언
int num, first;
// 입력
cout << "정수를 입력하세요: ";
cin >> num;
// 처리
first = num % 10;
// 출력
cout << "입력 정수: " << num << endl;
cout << "첫 번째 자릿수: " << first << endl;
return 0;
}
C++
복사
•
시, 분, 초 분해
초 단위의 시간을 123,456 처럼 입력받는다고 가정, 이때 이 시간이 몇 시간, 몇 분, 몇 초인지 계산하는 프로그램.
#include <iostream>
using namespace std;
int main() {
// 변수 선언
int time, h, m, s;
// 입력
cout << "초단위 시간을 입력하세요: ";
cin >> time;
// 처리
h = time / 3600; // 3600L은 3600바이트 크기의 정수값을 이야기함.
m = (time - (h * 3600)) / 60;
s = time - (h * 3600) - (m * 60);
// 출력
cout << "입력 시간: " << time << endl;
cout << h << "시간 ";
cout << m << "분 ";
cout << s << "초 입니다." << endl;
return 0;
}
C++
복사
• 총점, 평균, 분산 구하기
#include <iostream>
#include <iomanip> // setprecision, setw
using namespace std;
int main() {
// 변수 선언
int n1, n2, n3;
int sum; // 합
double avg; // 평균
double dev1, dev2, dev3; // 편차(deviation)
// 입력
cout << "첫 번째 정수 입력: ";
cin >> n1;
cout << "두 번째 정수 입력: ";
cin >> n2;
cout << "세 번째 정수 입력: ";
cin >> n3;
// 처리
sum = n1 + n2 + n3;
avg = static_cast<double>(sum) / 3;
dev1 = n1 - avg;
dev2 = n2 - avg;
dev3 = n3 - avg;
// 출력
cout << fixed << setprecision(2) << showpos; // fixed : 소수점 출력, setprecision(2) : 소수점 둘째자리, showpos : 부호출력
cout << "합: " << sum << endl;
cout << "평균: " << avg << endl;
cout << "첫 번째 정수의 편차: " << setw(9) << dev1 << endl; // setw(9) : 9칸 확보 후 dev1을 출력
cout << "두 번째 정수의 편차: " << setw(9) << dev2 << endl;
cout << "세 번째 정수의 편차: " << setw(9) << dev3 << endl;
return 0;
}
C++
복사
<궁금했던 내용>
•
using namespace std; 를 써주는 이유
C는 절차지향, C++는 객체지향 언어. 객체지향 언어의 특징은 대표적으로 이식성이 좋다는 것.
어느 프로그램의 함수와 기능을 다른 프로그램에 이용하고 싶을 때, 함수 충돌, 변수 충돌 등의 문제없이 사용 가능하다는 점.
이는 클래스라는 개념과 namespace 덕분에 가능한데,
using namespace std; 를 쓰는 이유는 cout, cin, endl, string과 같이 필요한 함수의 이름을 가져오기 위해 사용함.
만약 위에 선언하지 않으면 std::cout, std::cin 처럼 써야함.