728x90
반응형
1. C/C++에서의 객체의 메모리 위치
struct Point {
int x = 1;
int y = 1;
};
int main() {
Point pt1;
Point pt2 = pt1;
Point* p1 = new Point;
Point* p2 = p1;
delete p1;
}
- 위의 코드는 C#이 아닌 C++코드이다.
위의 코드에서 객체를 생성하면 메모리에 어떻게 되는지 보려한다.
우선 메모리에는 stack이라는 메모리와 heap이라는 메모리가 있다.
pt1과 pt2는 객체를 만들면 stack 메모리에 추가된다.
malloc이나 new키워드를 사용하면 heap에 추가해달라는 의미라
p1과 p2는 객체를 만들면 Heap에 추가되고 stack에는 그 주소정보를 갖게 된다.
그림으로 보면 아래와 같다.
① 메모리 구조와 객체의 위치
=> 크기가 작은 객체 : 스택
=> 크기가 큰 객체 : 힙
위의 내용을 보면 C/C++은 타입을 만드는 사람이 아닌 사용하는 사람이 결정하는걸 알 수 있다.
하지만 보통 타입을 사용하는 사람보다 만드는 사람이 결정해야 알맞게 만들 수 있지 않을까?
C#은 만드는 사람이 결정한다. 아래에서 확인해보자.
=> C/C++은 객체의 메모리 위치를 타입을 만드는 사람이 아닌 타입을 사용하는 사람이 결정한다.
2. C#에서의 객체의 메모리 위치
using System;
struct SPoint {
public int x;
public int y;
public SPoint(int xPos, int yPos) {
x = xPos;
y = yPos;
}
}
class CPoint {
public int x;
public int y;
public CPoint(int xPos, int yPos) {
x = xPos;
y = yPos;
}
}
class Program {
public static void Main() {
SPoint sp1 = new SPoint(1, 1);
CPoint cp1 = new CPoint(2, 2);
SPoint sp2 = sp1; // 객체 2개. 객체 자체를 복사
CPoint cp2 = cp1; // 참조(주소) 복사, 객체 한 개
sp2.x = 10;
Console.WriteLine(sp1.x); // 1
cp2.x = 10;
Console.WriteLine(cp1.x); // 10
}
}
위 코드는 단순하게 Point라는 Struct와 Class를 만들고 알기 쉽게 앞에 S와 C를 붙인 코드이다.
둘 다 생성자 초기화 할 수 되게 되어 있다.
① Struct vs Class
- 위 이미지는 Main함수의 5번째 라인까지 실행했을 때의 메모리 위치이다.
위 상태에서 sp2.x = 10; 과 cp2.x = 10;을 실행하면 아래 이미지가 된다.
728x90
반응형
'프로그래밍 > C#' 카테고리의 다른 글
[C#] 동등성 (Equality) (0) | 2020.02.04 |
---|---|
[C#] 값 타입 vs 참조 타입(2) (1) | 2020.01.30 |
[C#] System.Object (0) | 2020.01.21 |
[C#] 타입과 변수의 특징 (0) | 2020.01.20 |
[C#] 인터페이스 (interface) (1) | 2020.01.17 |