전체 글 (93)
-
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..
-
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..
-
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() 함수를 라인 입력 전에 처리해줘야한다.
-
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; };..
-
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# 데이터 구조와 Object 타입2024. 9. 21. 17:32
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()
'Language > C#' 카테고리의 다른 글
구조체 메모리 할당 위치, 범위 고정시키기 (1) | 2021.05.11 |
---|---|
c# Color 와 Color32 색상 범위 차이 (0) | 2020.10.20 |
[C#] const, readonly 차이 (0) | 2020.10.08 |
List<T>.RemoveAll(Predicate<T>) 함수 개념 (0) | 2017.12.14 |
스마트 포인터와 RAII2024. 2. 26. 11:42
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));
'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 |
[C++] cin 입력 시 공백 포함 으로 입력 받기2024. 1. 17. 18:39
헤더파일 <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 |
[C++] 함수 객체와 임시 객체2023. 11. 23. 18:57
함수 객체 : ( ) 연산자 오버로딩을 사용해서 객체를 함수처럼 쓰는 문법
보통 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] = { 5, 1, 4 ,3, 2 };
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 |
[펌] 생성자 소멸자 관련2023. 8. 19. 21:39
일부 멤버 함수들은 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 |