#include <stdio.h> typedef struct abcd { int name; struct abcd* next; } Node; /* 보통 함수로 쪼갤때는 '동작' 하나를 함수로 구현하는것이 일반적이다 */ Node* init() { Node *t; t = (Node*)malloc(sizeof(Node)); t->name = 0; t->next = NULL; return t; } void init_v2( Node** a, Node** b ) { *a = (Node*)malloc(sizeof(Node)); (*a)->name = 0; (*a)->next = NULL; (*b) = (*a); } // Node* add( Node* t, int name2 ) { Node* temp; temp = (Node*)malloc(sizeof(Node)); temp->name = name2; temp->next = NULL; t->next = temp; return temp; } // void print_all( Node* hd ) { Node* temp; for( temp = hd->next ; temp != NULL ; temp = temp->next ) { printf("%d\n", temp->name ); } } // Node* delete_all( Node* hd ) { Node* pre; Node* post; post = hd; pre = hd->next; while( pre != NULL ) { post = pre; pre = pre->next; free( post ); } return hd; } int main() { Node* head; Node* tail; Node* temp; Node* post; Node* pre; // 초기상황 /* 위에 선언된 init 을 호출하여 초기상황을 만든다 head = init(); tail = head; init_v2( head, tail ); -- 이 방법으로는 왜 안되는지 정리하자. */ init_v2( &head, &tail ); // 아래의 함수 호출이 입력과정을 수행하도록 함수를 선언하세요. tail = add( tail, 10 ); tail = add( tail, 20 ); // print_all( head ); // tail = delete_all( head ); // 앞에서 부터 차례로 삭제하고 초기상황으로 돌림 free( head ); return 0; }
void init_v2( Node* a, Node* b ) {
...
}
init_v2( head, tail ); // 왜 안될까??
포인터의 메모리 주소는 &head, &tail 로 나타내야 하므로 이중 포인터를 사용한다.
이중 포인터가 a 가 head를 가리키고 head가 Node 를 가리키게 된다.
포인터 a가 가리키는 공간 => *a
포인터 a가 가리키는 공간의 값 => **a
add함수 동작과정
떠돌이 개와 개장수에 비유
class 시고르자브 { int 위장; } // public class Test073 { public static void main( String[] args ) { // 한마리의 개를 여러 이름으로 부르는 집이 3개 있다고 가정 시고르자브 mary = new 시고르자브(); 시고르자브 zzong = mary; 시고르자브 happy = mary; // mary.위장 = mary.위장 + 200; zzong.위장 += 200; happy.위장 += 200; // System.out.println( mary.위장 ); // 개에게 밥을 주던 집들이 이사를 간다면? mary = null; // 밥줄 하나 끊김: 2개 zzong = null; // 밥줄 하나 더 끊김 : 1개 happy = null; // 밥줄 다 끊김 : 유기견 - 자신을 가리키는 포인터가 0개 되는 순간 // 그 시점에서 Garbage Collector ( 개장수 ) 가 메모리를 회수한다. } }
가베지 콜렉션
: 자신을 가리키는 참조형 변수가 0개가 되는 순간 Garbage Collector 가 메모리를 회수한다. C 에서의 free() 를 대신하는 역할
C 는 free() 호출 시 곧바로 메모리를 회수하는데 java 는 보관하고 있다가 메모리가 부족할때 한꺼번에 회수한다.