Game!

전체 글 (93)

  1. 2024.09.21 C# 데이터 구조와 Object 타입

    C# 에서 사용하는 데이터 구조는 크게 2가지이다. ① 값 타입스택 영역에 할당된다복사 시, 값 자체가 복사된다 ② 참조 타입new 키워드를 사용하여 객체를 생성하고, 힙 영역에 할당된다복사 시, 객체를 가리키는 참조만 복사된다   오브젝트 타입C# 의 거의 모든 타입(자료형)은 class System.Object 타입을 상속받는다. class 등 참조 타입 뿐만 아니라, int, float 등 값 타입도 상속받는다. 오브젝트를 상속받는 데이터 구조 코드에서는 주로 object 식으로 작성한다.(namespace 생략됨 System.)Object o1; // object o1; 식으로 단순화할 수 있음object o2; class System.Object 은 내부적으로 4개의 함수를 가지고 있다.1. T..

  2. 2024.02.26 스마트 포인터와 RAII

    C++ 에서 동적 할당을 할 때는 일반적인 포인터를 사용했다. (전통적인 방법) 스마트 포인터 라는 것을 사용하면객체가 지워져야 할 때 굳이 delete 를 해주지 않아도 자동으로 잘 삭제해줄 수 있다. 스마트 포인터를 사용하려면 #include 를 해줘야 한다.스마트 포인터는 3가지 종류가 있다.unique_ptr, shared_ptr, week_ptr 기본적인 사용 방법unique_ptr(new int(5)); // 잘못된 사용 방법unique_ptr a = new int(5);위의 코드는 변환 생성자를 암시하고 있기 때문에 스마트 포인터에서는 변환 생성자를 묵시적으로 호출할 수 없다.그래서 반드시 아래의 형태로 사용해야한다.unique_ptr a(new int(5)); https://www.you..

  3. 2024.01.17 [C++] cin 입력 시 공백 포함 으로 입력 받기

    헤더파일 필요 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /* 공백을 받을 수 없다. */ string s; cin >> s; /* ================== */ int n; cin >> n; // 이전 입력에서 엔터 처리가 존재할 경우 ignore 함수를 먼저 처리해준다. cin.ignore(); /* 공백을 받을 수 있다. */ string s; getline(cin, s); // 해당 방식으로 공백 포함 입력 가능. cs cin.ignore() 이 없을 경우 cin >> n; 에서 엔터 처리가 들어가면서 즉시 getline 함수가 처리된다. 그래서 이전 입력에 엔터 입력이 있을 경우 cin.ignore() 함수를 라인 입력 전에 처리해줘야한다.

  4. 2023.11.23 [C++] 함수 객체와 임시 객체

    함수 객체 : ( ) 연산자 오버로딩을 사용해서 객체를 함수처럼 쓰는 문법 보통 operator( ) 오버로딩 함수 내부에 인라인화를 시켜서 호출 시에 임시 메모리에 들어가도록 의도한다. 하지만 미리 객체를 생성해놓고 필요할 때 사용하는 것이므로 Stack 영역이든 어디든간에 결국 메모리를 사용하는 구조이다. ▼ 함수 객체 예시 더보기 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 class CSortRule { public: virtual bool operator()(int a, int b) = 0; };..

  5. 2023.08.19 [펌] 생성자 소멸자 관련

    일부 멤버 함수들은 C++에서 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 자동으로 선언해주도록 되어 있습니다. 바로. 1. 복사 생성자(copy constructor) 2. 복사 대입 연산자(copy assignment operator) 3. 소멸자(destructor) 4. 기본 생성자 (선언 해놓지 않았다면) 가 있습니다. 컴파일러가 만드는 함수의 형태는 모두 기본형이다. 모두 public 멤버이며 inline 함수입니다. class Player {}; 이렇게 선언한 클래스와 아래와 같이 선언한 클래스가 대동소이하다는 것입니다. class Player { public: Player() // 기본생성자 {} Player(const Player& rhs) //복사 생성자 {} ~Player() //..

 

C# 에서 사용하는 데이터 구조는 크게 2가지이다.

 

① 값 타입

스택 영역에 할당된다

복사 시, 값 자체가 복사된다

 

② 참조 타입

new 키워드를 사용하여 객체를 생성하고, 힙 영역에 할당된다

복사 시, 객체를 가리키는 참조만 복사된다

 

 

 

오브젝트 타입

C# 의 거의 모든 타입(자료형)은 class System.Object 타입을 상속받는다. class 등 참조 타입 뿐만 아니라, int, float 등 값 타입도 상속받는다.

 

오브젝트를 상속받는 데이터 구조

 

코드에서는 주로 object 식으로 작성한다.

(namespace 생략됨 System.)
Object o1; // object o1; 식으로 단순화할 수 있음
object o2;

 

class System.Object 은 내부적으로 4개의 함수를 가지고 있다.

1. ToString()

2. GetType()

3. Equals 함수들

- Equals(object)

- Equals(object, object)

- ReferenceEquals(object, object)

4. GetHashCode()

 

 

 

C++ 에서 동적 할당을 할 때는 일반적인 포인터를 사용했다. (전통적인 방법)

 

스마트 포인터 라는 것을 사용하면

객체가 지워져야 할 때 굳이 delete 를 해주지 않아도 자동으로 잘 삭제해줄 수 있다.

 

스마트 포인터를 사용하려면 #include <memory> 를 해줘야 한다.

스마트 포인터는 3가지 종류가 있다.

unique_ptr, shared_ptr, week_ptr

 

기본적인 사용 방법

unique_ptr<int>(new int(5));

 

// 잘못된 사용 방법

unique_ptr<int> a = new int(5);

위의 코드는 변환 생성자를 암시하고 있기 때문에 스마트 포인터에서는 변환 생성자를 묵시적으로 호출할 수 없다.

그래서 반드시 아래의 형태로 사용해야한다.

unique_ptr<int> a(new int(5));

 

https://www.youtube.com/watch?v=DYSEulQoj8Q

'Language > C++' 카테고리의 다른 글

[C++] cin 입력 시 공백 포함 으로 입력 받기  (0) 2024.01.17
[C++] 함수 객체와 임시 객체  (0) 2023.11.23
[펌] 생성자 소멸자 관련  (0) 2023.08.19
[BT] 요약  (0) 2023.08.18
[C++] C++ 스타일 파일입출력  (0) 2022.11.12

 

헤더파일 <string> 필요

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/* 공백을 받을 수 없다. */
string s;
cin >> s;
 
/* ================== */
 
int n;
cin >> n;
 
// 이전 입력에서 엔터 처리가 존재할 경우 ignore 함수를 먼저 처리해준다.
cin.ignore();
 
/* 공백을 받을 수 있다. */
string s;
getline(cin, s); // 해당 방식으로 공백 포함 입력 가능.
cs

 

cin.ignore() 이 없을 경우

cin >> n; 에서 엔터 처리가 들어가면서 즉시 getline 함수가 처리된다.

그래서 이전 입력에 엔터 입력이 있을 경우

cin.ignore() 함수를 라인 입력 전에 처리해줘야한다.

 

 

'Language > C++' 카테고리의 다른 글

스마트 포인터와 RAII  (0) 2024.02.26
[C++] 함수 객체와 임시 객체  (0) 2023.11.23
[펌] 생성자 소멸자 관련  (0) 2023.08.19
[BT] 요약  (0) 2023.08.18
[C++] C++ 스타일 파일입출력  (0) 2022.11.12

 

함수 객체 : ( ) 연산자 오버로딩을 사용해서 객체를 함수처럼 쓰는 문법

보통 operator( ) 오버로딩 함수 내부에 인라인화를 시켜서 호출 시에 임시 메모리에 들어가도록 의도한다.

 

하지만 미리 객체를 생성해놓고 필요할 때 사용하는 것이므로

Stack 영역이든 어디든간에 결국 메모리를 사용하는 구조이다.

 

▼ 함수 객체 예시

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class CSortRule
{
public:
    virtual bool operator()(int a, int b) = 0;
};
 
class CAsendingSort : public CSortRule
{
public:
    bool operator()(int a, int b)
    {
        return a > b;
    }
};
 
class CDesendingSort : public CSortRule
{
public:
    bool operator()(int a, int b)
    {
        return a < b;
    }
 
};
 
void    Bubble_Sort(int iArray[], int _iSize, CSortRule& Functor)
{
    for (int i = 0; i < _iSize; ++i)
    {
        for (int j = 0; j < _iSize - 1++j)
        {
            if (Functor(iArray[j], iArray[j + 1]))    // 여기서 함수 객체가 사용된다.
            {
                //...
            }
        }
    }    
}
 
void main()
{    
    int iArray[5= { 514 ,32 };
 
    CAsendingSort        Asending;
    CDesendingSort        Desending;
 
    Bubble_Sort(iArray, 5, Desending);
 
}
cs

 

 

임시 객체 : 이름 없이 임시 메모리에 등록되는 객체. 그 라인이 끝나면 객체는 즉시 소멸된다.

일반 객체와 달리 메모리에 상주해있지 않는다. 

 

▼ 임시 객체 예시

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class CTest
{
public:
    CTest(const char* pStr)
    {
        strcpy_s(m_szStr, sizeof(m_szStr), pStr);
        cout << m_szStr << "_생성자 호출" << endl;
    }
    ~CTest()
    {
        cout << m_szStr << "_소멸자 호출" << endl;
    }
 
private:
    char        m_szStr[64];
};
 
 
void main(void)
{
    CTest        Temp("일반 객체");
 
    cout << "==============임시 객체 생성==============" << endl;
    CTest("임시 객체");
    cout << "==============임시 객체 소멸==============" << endl;
 
    cout << "_SUCY_" << endl;
 
 
}
cs

 

 

 

'Language > C++' 카테고리의 다른 글

스마트 포인터와 RAII  (0) 2024.02.26
[C++] cin 입력 시 공백 포함 으로 입력 받기  (0) 2024.01.17
[펌] 생성자 소멸자 관련  (0) 2023.08.19
[BT] 요약  (0) 2023.08.18
[C++] C++ 스타일 파일입출력  (0) 2022.11.12

일부 멤버 함수들은 C++에서 클래스 안에 직접 선언해 넣지 않으면 컴파일러가 자동으로 선언해주도록 되어 있습니다.

 

바로.

 

1. 복사 생성자(copy constructor)

2. 복사 대입 연산자(copy assignment operator)

3. 소멸자(destructor)

4. 기본 생성자 (선언 해놓지 않았다면)

가 있습니다.

컴파일러가 만드는 함수의 형태는 모두 기본형이다. 모두 public 멤버이며 inline 함수입니다.

 

class Player {};

이렇게 선언한 클래스와  아래와 같이 선언한 클래스가 대동소이하다는 것입니다.

class Player
{
public:
     Player() // 기본생성자
     {}
     
     Player(const Player& rhs) //복사 생성자
     {}
     
     ~Player() //소멸자 *소멸자는 항상 가상 소멸자가 좋습니다.
     {}

	 Player operator=(const Player& rhs) //복사 대입 연산자
     {}  

};

 

이들은 꼭 필요하다고 컴파일러가 판단할 때만 만들어지도록 되어 있지만, 필요한 조건이 대단하진 않습니다.

 

Player p1; //기본생성자 그리고 소멸자
Player p2(p1) // 복사 생성자

p1=p2; //대입연산자

 

 

하지만, 작성자가 기본 생성자를 선언하지 않고, 파라미터를 받은 생성자만 선언해놓았다면, 컴파일러는 기본 생성자를 만들지 않는다.

 

 

 

정리

* 컴파일러는 경우에 따라 클래스에 대해 기본 생성자, 복사 생성자, 복사 대입 연산자, 소멸자를 암시적으로 만들어 놓을 수 있습니다.

 

 

다른 또 하나의 방법으로는 

 

 

* 컴파일러에서 자동으로 제공하는 기능을 허용치 않으려면, 대응 되는 멤버 함수를 private선언한 후에 구현은 하지 않은 채로 두는 방법이다.

 

 

 

 

'Language > C++' 카테고리의 다른 글

[C++] cin 입력 시 공백 포함 으로 입력 받기  (0) 2024.01.17
[C++] 함수 객체와 임시 객체  (0) 2023.11.23
[BT] 요약  (0) 2023.08.18
[C++] C++ 스타일 파일입출력  (0) 2022.11.12
[C] C 스타일 파일입출력  (0) 2022.11.12