[c++ lab] 6. value,pointer,reference

25
6. Value, Pointer, Reference (L) C++ 프프프프프 박박박

Upload: mingeun-park

Post on 20-Jun-2015

654 views

Category:

Documents


8 download

TRANSCRIPT

Page 1: [C++ lab] 6. value,pointer,reference

6. Value, Pointer, Reference

(L) C++ 프로그래밍박민근

Page 2: [C++ lab] 6. value,pointer,reference

Value

Page 3: [C++ lab] 6. value,pointer,reference

Value• 가장 일반적인 객체 ( 값 ) 의 생성

• 생성된 영역의 스택 메모리 공간에 할당

• 생성 영역에서 벗어나면 메모리에서 자동 해제

• 함수안의 지역 변수 -> 함수가 반환되면 메모리 해제

• 클래스 멤버 변수 -> 클래스가 소멸되면 같이 해제

• 전역 변수 -> 프로그램이 종료될 때 해제

함수의 인자나 , 배열에 대입할 때 , 값의 복사 (Copy) 가 일어 난다 .

Page 4: [C++ lab] 6. value,pointer,reference

Value 소멸

Page 5: [C++ lab] 6. value,pointer,reference

Value 복사

Page 6: [C++ lab] 6. value,pointer,reference

Value 복사

Page 7: [C++ lab] 6. value,pointer,reference

Value( 값 ) 복사

partyMember[3]

0 CCharacter

1 CCharacter

2 CCharacter

soeun

wonHyo

jinSang

객체의 멤버 변수 값만 복사 된다

Page 8: [C++ lab] 6. value,pointer,reference

Value( 값 ) 복사 결과

partyMember[3]

0 CCharacter

1 CCharacter

2 CCharacter

soeun

wonHyo

jinSang

값만 복사 (COPY) 했을 뿐 , 서로간에 아무런 관계가 없다서로는 완전히 별개의 객체이다 .

총 객체의 개수 = 6 개

Page 9: [C++ lab] 6. value,pointer,reference

Value( 값 ) 복사

Page 10: [C++ lab] 6. value,pointer,reference

복사 생성자

값이 복사될때는 기본 생성자가 아닌 ,

복사 생성자가 호출 되며 , 값이 복사 된다 .

Page 11: [C++ lab] 6. value,pointer,reference

Pointer

Page 12: [C++ lab] 6. value,pointer,reference

Pointer

전역 힙 (Heap) 메모리 공간에 동적 생성

영역을 벗어나도 해제 되지 않는다

• 포인터 변수의 실제 값은 할당된 메모리의 시작 주소

• 할당된 메모리를 해제하지 않을 경우 , 메모리 누수 (Leak) 가 발생한다

함수의 인자나 , 배열에 대입할 때 , 실제 메모리 주소만을 복사한다 .

Page 13: [C++ lab] 6. value,pointer,reference

Pointer 실습

Page 14: [C++ lab] 6. value,pointer,reference

partyMember[3]

0 CCharacter*

1 CCharacter*

2 CCharacter*

pJinWoo

pJongChan

pYoonSung

객체의 주소값만 복사된다

Reference( 참조 ) 복사

Page 15: [C++ lab] 6. value,pointer,reference

Value vs Pointer

Value

실제 데이터의 복사

일반 데이터 타입

타겟과 원본이 각각 별도의 메모리 공간을 차지함원본이 사라져도 관계 없음

VS

Pointer

참조 주소를 복사

포인터

타겟과 원본이 같은 메모리 주소를 참조함원본 데이터가 사라지면 , 포인터는 모두 무효 포인터가 된다 .

Page 16: [C++ lab] 6. value,pointer,reference

partyMember[3]

0 CCharacter*

1 CCharacter*

2 CCharacter*

pJinWoo

pJongChan

pYoonSung

객체의 주소값만 복사된다

포인터 ( 주소 ) 복사

이것들은 전부 바로가기 ( 포인터 ) 그럼 실제 데이터는 어디 있는가 ??

Page 17: [C++ lab] 6. value,pointer,reference

동적 할당

C 의 malloc() 과 같음

C C++ 차이

malloc new 클래스 , 구조체등의 타입에 맞는 사이즈 자동 할당생성자를 자동 호출

free delete 소멸자를 자동 호출

Page 18: [C++ lab] 6. value,pointer,reference

pJinWoo

pJongChan

pYoonSung

메모리를 가르키는 포인터

메모리를 가르키는 포인터

실제 메모리가 할당된 데이터

Page 19: [C++ lab] 6. value,pointer,reference

포인터 ( 주소 ) 복사

Page 20: [C++ lab] 6. value,pointer,reference

포인터 주의점 (1)

Player1 에 Player2 의 주소를 덮어씀

이제 두개의 포인터가 같은 주소를 가르킴

Player1 을 해제할 포인터가 없어짐

두 개의 delete 가 사실 같은 메모리를 두번 해제하는 버그 발생

Page 21: [C++ lab] 6. value,pointer,reference

포인터 주의점 (2)포인터 변수의 값 ( 주소 ) 이 복사 되어 지역 변수가 생성된다 .

함수내의 지역 변수의 복사가 일어날 뿐이다 .

함수에서 벗어나면 사라지는 지역 변수이다 .

이 포인터에 저장된 값은 변경되지 않는다

함수내의 로컬 변수가 변경된 것 뿐이기 때문이다 .

Page 22: [C++ lab] 6. value,pointer,reference

Reference

Page 23: [C++ lab] 6. value,pointer,reference

레퍼런스

• 존재 하는 객체를 참조 ( 레퍼런스 ) 한다 .

• 포인터와 달리 항상 존재하는 값만을 참조한다 . (NULL 이 될 수 없다 )

• 이미 존재하는 값을 복사가 아닌 참조하는 것으로 , 별명 (Alias) 라고도 한다

• 새롭게 할당하거나 복사하지 않는다 .

Page 24: [C++ lab] 6. value,pointer,reference

Value <-> Pointer

Page 25: [C++ lab] 6. value,pointer,reference

Value <-> Pointer

• Value 변수 앞에 & : 주소값을 반환 . Value -> Pointer

• 포인터 변수 앞에 * : 포인터에 저장된 값을 반환 . Pointer -> Value