C Programming Language/C++

C++ ν˜• λ³€ν™˜μ— λŒ€ν•΄ ν•™μŠ΅ν•˜κΈ°

567Rabbit 2024. 8. 14. 17:54

ν˜• λ³€ν™˜

- 값은 μžμ‹ κ³Ό μΌμΉ˜ν•˜λŠ” νƒ€μž…μ˜ λ³€μˆ˜μ— μ €μž₯λ˜μ–΄μ•Ό 함

- μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” 경우 ν•΄λ‹Ή νƒ€μž…μ— λ§žμΆ”μ–΄ 값이 λ³€κ²½

 

ν˜• λ³€ν™˜ λ°©λ²•μ˜ μ’…λ₯˜

- λ¬΅μ‹œμ  방법 : μ»΄νŒŒμΌλŸ¬κ°€ μžλ™μœΌλ‘œ νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” 방법. 일반적으둜 νƒ€μž… κ°„μ˜ λ³€ν™˜μ΄ μ•ˆμ „ν•˜λ‹€κ³  νŒλ‹¨λ  λ•Œ λ°œμƒ

- λͺ…μ‹œμ  방법 : ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ˜λ„μ μœΌλ‘œ νƒ€μž… λ³€ν™˜μ„ μˆ˜ν–‰ν•˜λŠ” 방법. 이λ₯Ό 톡해 λͺ…ν™•ν•˜κ²Œ λ³€ν™˜μ„ μ§€μ‹œν•  수 μžˆλ‹€.

 

 

 

λ¬΅μ‹œμ  ν˜• λ³€ν™˜

- μ‚°μˆ μ‹μ—μ„œμ˜ μžλ™(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;
}