객체 배열
- 1~10까지의 int 형 정수들이 저장되어있는 배열이 아닌
- Class를 통해서 만든 객체/객체/객체들이 저장되어있는 배열
Monster 클래스를 만들고 -> 그 클래스로 객체를 생성해서 -> 객체 배열을 만들 수 있다.
monster 10마리 생성하는 공간을 만들어 보자
Monster 클래스를 만들고
Monster 객체 배열 생성
- Monster array [ 10 ];
- 클래스로 배열을 만들려면 기본 생성자가 필요하다.
기본 생성자를 만들어 준 후 객체로 배열을 만들고 메모리 공간 어떻게 차지하고 있는지 확인
이렇게 있는 객체 배열에 값을 넣고 싶으면 Init이라는 함수를 만들어서 초기화시킨다.
함수와 for 문으로 배열 값 초기화 - Init( ) - 함수 활용
함수와 for 문으로 배열 값들에게 명령 - move( ), attack( ), 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는 동적 메모리 관리 대장부를 가지고 있다. ( 문서 )
- 몇 번지에서부터 얼만큼 할당해줬는지 가지고 있다.
- 요청 들어오면 관리 대장부 쭉 보고 적절한 위치에 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문을 이용해서 함수로 사용하는 점 체크!
'Back-end > C++' 카테고리의 다른 글
22.03.21. 복사 생성자, const함수 (0) | 2022.04.02 |
---|---|
22.03.18 - 동적 객체 배열, C언어 형식 지정 문자열, 동적 객체 포인터 배열 (0) | 2022.03.25 |
22.03.16 - this 포인터, 네임맹글링(오버로딩), 배열 (0) | 2022.03.24 |
22.03.15 - 정적 멤버 변수, 정적 멤버 함수, 함수 호출 방식 (0) | 2022.03.18 |
22.03.14 - 포인터형, 참조형, const형 변수 (0) | 2022.03.18 |