객체 생성
class Vector 
{
	int x;
	int y;
}

C++ 포큐아카데미

python이나 java 등 보편적인 언어는 클래스 객체 생성을 Heap 영역에 하는 반면 C++는 자유도가 높아 객체를 스택에도 생성할 수 있다. 물론 스택에 너무 큰 용량의 객체를 만들면 스택 오버플로우가 나니 조심해야 한다.

 

class Vector 
{
	int x;
	int y;
}

Vector v;

위의 예제처럼 객체를 만들면 8바이트(int 4 바이트라고 가정) 만큼 스택에 할당한다.

 

public class Vector 
{
	int x;
	int y;
}

Vector* v = new Vector();

C++ 포큐아카데미

위의 예제처럼 객체를 생성하면 스택영역의 변수 b에 Vector를 할당한 Heap영역의 메모리 첫번째 주소를 담는다.

 

 

객체 배열 생성

C++ 포큐아카데미

우측의 C++부터 보면 Heap영역에 Vector 객체 10개를 만들고(8바이트 * 10 = 80바이트) 그 첫번째 주소를 스택의 list 변수에 담는다. 그래서 list 변수의 타입은 Vector *이다.

 

반면에 Java의 경우 new Vector[10]을 해도 객체를 10개 만들지 않고 Vector 객체를 담을 수 있는 레퍼런스(주소)를 반환한다. (포인터가 4바이트라고 가정하면 4바이트 * 10 = 40바이트) 실제로 값을 담으려면 for문을 10번 돌면서 값을 생성해주면 된다.

 

 

C++ 포큐아카데미

정리하면, 힙에 Vector 10개를 바로 만드려면 Vector* list = new Vector[10]을 하면 되고, JAVA에서는 불가능하다. 왜냐하면 모든게 다 레퍼런스 즉 포인터라서.

 

C++에서 Java의 Vector 객체를 담을 수 있는 레퍼런스(주소) 10개를 반환하는 코드를 만드려면

Vector** list = new Vector*[10] 이렇게 하면된다.

 

list 타입을 설명하자면 처음의 * 포인터는 배열 그 자체 그러니깐 전체를 나타내는 것이고 두번쨰 * Vector는 각각의 배열은 Vector 객체를 가르키는 포인터를 담는다는 뜻이다. 

 

C++ 포큐아카데미

마지막으로 객체를 삭제할때다. C++에서 delete를 안해주면 큰일난다. Java처럼 자동으로 가비지컬렉터가 지워주지 않기때문이다. 반드시 삭제하도록 하자

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

C++ 정적 바인딩, 동적 바인딩  (1) 2020.04.09
C++ 멤버함수의 메모리 위치  (0) 2020.04.09
C++ 임시객체(이동 생성자) 중요!  (0) 2020.02.07
C++ 대입 연산자  (0) 2020.02.02
C++ 깊은복사 얕은복사  (0) 2020.02.02

+ Recent posts