Back-end/C++

21.03.17 - 객체 배열, 동적 객체, 개념 플러스(GC,Malloc,Cin)

giggs 2022. 3. 24. 18:11

 

객체 배열

  • 1~10까지의 int 형 정수들이 저장되어있는 배열이 아닌
  • Class를 통해서 만든 객체/객체/객체들이 저장되어있는 배열

 

 

Monster 클래스를 만들고 -> 그 클래스로 객체를 생성해서 -> 객체 배열을 만들 수 있다.

monster 10마리 생성하는 공간을 만들어 보자

 

 


 

 

Monster 클래스를 만들고

 

 

 

 

Monster 객체 배열 생성

  • Monster array [ 10 ];
  • 클래스로 배열을 만들려면 기본 생성자가 필요하다.

 

 

 

 

기본 생성자를 만들어 준 후 객체로 배열을 만들고 메모리 공간 어떻게 차지하고 있는지 확인

 

객체 배열을 만들기 위한 기본생성자
Monster 클래스타입의 객체 - 10개가 들어갈 공간 생성 - 기본 생성자가 호출되면서 만들어진다.
기본생성자가 호출되며 만들어진 객체배열의 메모리 공간 - 0~9번까지 저런식으로 차지하고있다.

 

 

 

이렇게 있는 객체 배열에 값을 넣고 싶으면 Init이라는 함수를 만들어서 초기화시킨다.

 

객체배열에 값을 넣어주기위해 만든 함수

 

 

 

함수와 for 문으로 배열 값 초기화 - Init( ) - 함수 활용

 

( . ) 피리어드 연산자로 접근 체크

 

 

 

함수와 for 문으로 배열 값들에게 명령 - move( ), attack( ), info( )

 

array[ i ]에 맞춰서 10번 씩 Move( ), Attatck( ), info( ) 실행 됨

 

 

 

정리

1. 객체 배열은 기본 생성자를 호출하면서 만들어진다. - 없어질 때 소멸자도 호출된다.

2. 객체 배열에 있는 애들을 초기화, 변경, 명령 내릴 시에는 함수를 이용 - for문과 피리어드(. ) 연산자

3. 각 객체들이 사용하는 함수들을 묶어서 한 번에 명령

 

 

 


 

 

 

동적 객체

 

 

 

기본 개념

  • 각각의 변수마다 자리 잡는 메모리 공간

 

먼저 메모리 공간 분류 각 공간별 위치하는 데이터들
CS - Code Segement 함수
DS - Data Segment 외부변수, 정적변수
Heap 동적변수, 동적객체
SS 자동변수

 

 

int golbal;  이나  int a; 같은 애들은 선언할 때 변수의 성격이 정해져 있다. - int형

즉, 공간의 사이즈가 정해져 있다 - int형 = 4byte - 변경 불가능

 

 


 

동적 메모리가 필요한 경우

 

 

프로그램 실행 중에 메모리 공간이 필요할 때가 있다 

 

 

 

 

실행 전에는 변수의 성격이나 사이즈를 알 수 없는 경우 

이럴 때 동적 메모리 사용!  

이 메모리는 heap 메모리 공간에 저장!

 

 

  • HDD에 있는 파일을 불러 들어야 하는데 사이즈가 몇인지 알 수 없다.
  • int a; 나 int golbal;처럼 사이즈를 fix 할 수 없다.
  • 몇 바이트를 읽어드릴지를 모르니까 미리 만들어 놓을 수 없다.
  • 실행 중에 메모리 공간이 필요할 때 동적 메모리 공간 사용
  • 동적 메모리는 heap 메모리 공간에 저장

 

 


 

 

동적 메모리 공간 할당받기

 

 

필요한 동적 메모리 공간 할당받을 때 new 연산자 사용!

==> new int;  - C에서는 malloc //// c++ 에는 new

 

 

new int; 의미-> 동적 메모리를 할당해 줘 - OS에 요청

 

 

빨간 네모 부분은 OS에서 동적메모리를 관리 하는 공간! - 관리대장을 참조하여 동적메모리 공간에 적절한 부분을, 동적메모리 요청한 곳에 할당해준다.

 

 

OS는 동적 메모리 관리 대장부를 가지고 있다. ( 문서 )

  • 몇 번지에서부터 얼만큼 할당해줬는지 가지고 있다.
  • 요청 들어오면 관리 대장부 쭉 보고 적절한 위치에 4byte 할당해준다.
  • 3000번지에서부터 4byte 할당해줬다고 반환해준다. return
  • 이 주소 값을 저장할 수 있는 변수를 만들어서 받아준다.
  • int* pa = new int; ( pa에 3000번지 저장 )
  • ( 이 주소 값을 가지고 할당받은 공간 접근 가능, 수정 가능 )
  • *pa = 1000; ( 주소 값에 포인터 연산자* 사용하면 할당받은 공간을 의미 수정 가능 )

 

 

 

 

동적으로 만든 공간은 언제 없어질까요?

  • 다 쓴 다음에 돌려주지 않으면, 컴퓨터를 껐다 켜야지 없어진다.
  • 동적으로 사용한 공간은 반드시 반환 필요
  • 반환 시에는 delete 연산자 사용

 

delete연산자의 역할

  • -OS에 3000번지 다 썼다고 OS에 전달
  • -OS는 주소 받고 관리 대장부에서 지운다

 

 


 

여기서부터는 +@ 개념 플러스

 

 

외부 변수는 프로그램이 종료될 때 사라진다.

 


 

 

java 언어에서의 동적 메모리 관리

 

c나 c++에서는 delete 필요하다. 기본적으로는

But - java에서는 garbage collector라는 게 있어서 자동으로 해준다.

 

java 언어 차원에서 참조 카운트를 이용하여 동적 메모리 관리!

 

GC - Garbage Collector 작동 기본 원리 :

  • 동적 메모리 공간 할당받으면 pa - 참조 카운트 1 체크
  • pa를 사용했다 - ppa 하면 카운트 +1 해서 - 2 체크
  • ppa 사라지면 참조 카운트 -1 해서 - 1 체크
  • pa 도 사라졌다 하면 참조 카운트 -1 해서 - 0 체크
  • GC가 메모리들을 가끔 돌면서 참조 카운트 0인 사용하지 않는 메모리들을 없애준다.

 

 


 

c언어에서의 동적 메모리 할당 함수 - malloc 

 

 

할당은 malloc // 해제는 free

 

C에서는 C++ 언어 기본적으로는 사용 불가능

C++에서는 C언어에 있는 함수 사용 가능

 

동적 객체를 new연산자 사용해야 한다..

  • Pig* pc = new Pig;

? new 연산자로 만들어야지 생성자를 호출해 주기 때문에

 

 

주소 값을 가지고 멤버 함수에 접근하는 방법 ( -> ) 화살표 연산자 사용

  • pc -> Speak();

 

동적으로 만든 애들이므로 delete 필요 소멸자( ~Pig() ) 호출되면서 객체 사라진다.

  • delete pc;

 

 

정리

  • C언어의  동적 메모리 할당 함수 - maloc, 해제는 - free
  • BUT!  maloc으로 객체 생성해주면 동적 메모리 안 생긴다.
  • C언어에서도 new연산자 사용
  • new 연산자로 객체를 만들면 생성자가 호출된다. - ( 동적 메모리 만들려면 기본 생성자 필요하다 )
  • delete 하면 소멸자가 호출된다.
  • 동적 객체 생성할 경우에는 반드시 new 연산자 사용

 


 

콘솔 창에서 사용자에게 입력받기 - Cin >>

 

 

 

 

cout << 과 cin >> 

  • cin >> count 해서 입력받은 값을 바로 변수에 넣어주는 부분이 인상적이다.

 

C에서 입력받는 부분을

  • int count = 0;
  • cin >> count;

 

자바에서 생각하면 이렇게 되는 것이겠지. 

  • Scanner sc = new Scanner(System.in);
  • int count = sc.nextInt();

 

이런 부분 찾는 것도 재미가 쏠쏠

 

 


 

 

 


review



이번 강의에서는 객체 배열과 동적 객체에 대해 배웠다.

클래스로 만든 객체들이 배열의 공간에 인접하여 위치하고 있는 객체 배열!
프로그램 실행 중에 메모리 공간이 필요할 때 동적 메모리 공간! - 사용하고 반납 필요!



이번 강의에서 내가 좋았던 점 2가지


동적 객체 부분에서 막연히 동적 객체를 만들 때는
new를 사용해서 만들어 준다고만 알았던 부분이었는데
이 new를 사용함으로써 OS에 어떤 요청이 들어가고
OS에서 어떤 작업이 이루어져서 할당을 해주고
할당받은 메모리 공간을 어떻게 사용하고 반납하는지를 알게 되어서 좋았다.

개념 플러스 부분 - 자바의 GC 작동의 기본원리
GC가 돌아다니면서 안 쓰는 동적 메모리를 알아서 삭제해주는 것은 알고 있었지만
어떻게 작업이 이루어지는지는 몰랐었는데 기본원리를 알게 되어서 좋았다.


+
객체 배열을 만들 경우
기본 생성자가 필요하다는 점과
객체 배열에 요소들의 값을 초기화시키거나 수정, 추가하려면
for문을 이용해서 함수로 사용하는 점 체크!