ν λ³ν
- κ°μ μμ κ³Ό μΌμΉνλ νμ μ λ³μμ μ μ₯λμ΄μΌ ν¨
- μΌμΉνμ§ μλ κ²½μ° ν΄λΉ νμ μ λ§μΆμ΄ κ°μ΄ λ³κ²½
ν λ³ν λ°©λ²μ μ’ λ₯
- 묡μμ λ°©λ² : μ»΄νμΌλ¬κ° μλμΌλ‘ νμ λ³νμ μννλ λ°©λ². μΌλ°μ μΌλ‘ νμ κ°μ λ³νμ΄ μμ νλ€κ³ νλ¨λ λ λ°μ
- λͺ μμ λ°©λ² : νλ‘κ·Έλλ¨Έκ° μλμ μΌλ‘ νμ λ³νμ μννλ λ°©λ². μ΄λ₯Ό ν΅ν΄ λͺ ννκ² λ³νμ μ§μν μ μλ€.
묡μμ ν λ³ν
- μ°μ μμμμ μλ(implicit) ν λ³ν : data lossκ° μμ
- C++μμλ λ°μ΄ν° νμ κ°μ μλ λ³νμ΄ λ°μν λ, νΉμ μμμ λ°λΌ μ΄λ£¨μ΄μ§. μ΄ μμλ νμ κ°μ λ³ν μμ μ±μ κ³ λ €ν κ²
<μμ>
- bool, char, short, enum -> int -> unsigned
- int < unsigned < long < unsigned long < float < double < long double
#include <iostream>
int main() {
char c = 'A'; // ASCII 65
short s = 100;
int i = 200;
float f = 3.14f;
double d = 2.71828;
// charμ shortλ intλ‘ λ³νλ¨
auto result1 = c + s; // c(65) + s(100) = 165, κ²°κ³Όλ int νμ
std::cout << "char + short = " << result1 << std::endl;
// intμ floatλ floatλ‘ λ³νλ¨
auto result2 = i + f; // i(200) + f(3.14) = 203.14, κ²°κ³Όλ float νμ
std::cout << "int + float = " << result2 << std::endl;
// floatμ doubleμ doubleλ‘ λ³νλ¨
auto result3 = f + d; // f(3.14) + d(2.71828) = 5.85828, κ²°κ³Όλ double νμ
std::cout << "float + double = " << result3 << std::endl;
return 0;
}
< μλ£ μμ€(loss) κ°λ₯μ±κ³Ό μ»΄νμΌλ¬μ κ²½κ³ >
C++μμ 묡μμ ν λ³ν(implicit type conversion)μ μ’ μ’ μλμΌλ‘ μ΄λ£¨μ΄μ§λ©°, μ΄λ νλ‘κ·Έλ¨μ λμμ κ°μννμ§λ§ λλ‘λ λ°μ΄ν° μμ€μ μ΄λν μ μλ€. μ΄λ¬ν μμ€μ νΉν ν° νμ μμ μμ νμ μΌλ‘ λ³νλ λ λ°μν μ μμΌλ©°, μ»΄νμΌλ¬λ μ΄λ¬ν μν©μμ κ²½κ³ λ₯Ό μ 곡νκΈ°λ νλ€.
λͺ μμ ν λ³ν
λͺ μμ ν λ³νμ νλ‘κ·Έλλ¨Έκ° λͺ μμ μΌλ‘ νμ λ³νμ μννλ λ°©λ²
C++μμλ μ΄λ₯Ό μν΄ λ€μν μ°μ°μμ ν¨μλ₯Ό μ¬μ©ν μ μλ€.
λͺ μμ ν λ³νμ κ²½κ³ κ° μμΌλ―λ‘ μ£Όμν΄μΌ νλ€. -> λΈλ μ΄μ€ μ΄κΈ°νλ₯Ό ν΅ν΄ λ°©μ§ κ°λ₯
1. C-μ€νμΌ μΊμ€ν
C++μμ κ°μ₯ κΈ°λ³Έμ μΈ λͺ μμ ν λ³ν λ°©λ²
() μ°μ°μλ₯Ό μ¬μ©νμ¬ λ³νμ μν
#include <iostream>
int main() {
double d = 9.57;
int i = (int)d; // λͺ
μμ μΌλ‘ doubleμ intλ‘ λ³ν
std::cout << "Integer part: " << i << std::endl; // 9
return 0;
}
2. static_cast
static_castλ C++μμ νμ λ³νμ μννλ μμ νκ³ μΌλ°μ μΈ λ°©λ²
μ£Όλ‘ κΈ°λ³Έ λ°μ΄ν° νμ κ°μ λ³νμ΄λ, ν΄λμ€ νμ κ°μ λ³νμ μ¬μ©
#include <iostream>
int main() {
double d = 9.57;
int i = static_cast<int>(d); // static_castλ₯Ό μ¬μ©ν λ³ν
std::cout << "Integer part: " << i << std::endl; // 9
return 0;
}
3. dynamic_cast
dynamic_castλ μ£Όλ‘ ν΄λμ€ κ°μ μμ ν λ€μ΄μΊμ€ν (downcasting)μ μ¬μ©
λ°νμμ νμ μ΄ νμΈλλ©°, nullptrμ λ°ννκ±°λ μμΈλ₯Ό λμ§ μ μλ€.
#include <iostream>
#include <typeinfo>
class Base { virtual void dummy() {} };
class Derived : public Base {};
int main() {
Base* basePtr = new Derived();
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) {
std::cout << "Conversion successful!" << std::endl;
} else {
std::cout << "Conversion failed!" << std::endl;
}
delete basePtr;
return 0;
}
4. reinterpret_cast
reinterpret_castλ κ°μ₯ κ°λ ₯ν ν λ³ν μ°μ°μ
ν¬μΈν°μ νμ μ 무μνκ³ μ§μ μ μΌλ‘ λ³ν
μ΄ λ°©λ²μ μ£Όλ‘ ν¬μΈν° κ°μ λ³νμ μ¬μ©λλ©°, μνν μ μλ€.
#include <iostream>
int main() {
int i = 65;
char* c = reinterpret_cast<char*>(&i);
std::cout << "Character representation: " << *c << std::endl; // A (ASCII 65)
return 0;
}
μ격ν νλ³ν : λΈλ μ΄μ€ μ΄κΈ°ν Brace Initialization
λΈλ μ΄μ€ μ΄κΈ°ν(Brace Initialization)λ C++11μμ λμ λ κΈ°λ₯μΌλ‘, μ€κ΄νΈ {}λ₯Ό μ¬μ©νμ¬ κ°μ²΄, λ°°μ΄, λ° λ€λ₯Έ λ°μ΄ν° ꡬ쑰λ₯Ό μΌκ΄λκ² μ΄κΈ°ννλ λ°©λ²μ΄λ€. "μΌκ΄λ μ΄κΈ°ν(Uniform Initialization)"λΌκ³ λ λΆλ¦¬λ©°, λ€μν λ°μ΄ν° νμ μμ μ΄κΈ°ν ꡬ문μ νμ€ννλ€.
λΈλ μ΄μ€ μ΄κΈ°νλ₯Ό μ¬μ©νλ©΄ νμ μ΄ λ§μ§ μλ κ°μ μ΄κΈ°ννλ €κ³ νλ©΄ μ»΄νμΌ νμμ μ€λ₯κ° λ°μνλ€
λͺ μμ νλ³νμ μ»΄νμΌλ¬κ° μ€λ₯λ₯Ό λμ°μ§ μκΈ° λλ¬Έμ νμ μμ μ±μ μν΄ λΈλ μ΄μ€ μ΄κΈ°ν λ°©λ²μ μ¬μ©ν μ μλ€.
μ΄λ₯Ό ν΅ν΄ μ΄κΈ°ν κ³Όμ μμ νμ μ€λ₯λ₯Ό μ¬μ μ λ°©μ§ν μ μλ€.
ex) κΈ°λ³Έ νμ λ³μ, λ°°μ΄, κ°μ²΄, κ·Έλ¦¬κ³ std::vectorλ₯Ό λΈλ μ΄μ€ μ΄κΈ°νλ₯Ό μ¬μ©νμ¬ μ΄κΈ°ν νλ€.
#include <iostream>
#include <vector>
class Person {
public:
std::string name;
int age;
};
int main() {
// κΈ°λ³Έ νμ
μ΄κΈ°ν
int a{5};
double b{3.14};
// λ°°μ΄ μ΄κΈ°ν
int arr[]{1, 2, 3, 4, 5};
// κ°μ²΄ μ΄κΈ°ν
Person p{"John", 30};
// std::vector μ΄κΈ°ν
std::vector<int> vec{1, 2, 3, 4, 5};
// μΆλ ₯
std::cout << "a: " << a << std::endl;
std::cout << "b: " << b << std::endl;
std::cout << "Person: " << p.name << ", " << p.age << std::endl;
std::cout << "Vector elements: ";
for (int num : vec) {
std::cout << num << " ";
}
std::cout << std::endl;
return 0;
}