[c++ lab] 6. value,pointer,reference
TRANSCRIPT
6. Value, Pointer, Reference
(L) C++ 프로그래밍박민근
Value
Value• 가장 일반적인 객체 ( 값 ) 의 생성
• 생성된 영역의 스택 메모리 공간에 할당
• 생성 영역에서 벗어나면 메모리에서 자동 해제
• 함수안의 지역 변수 -> 함수가 반환되면 메모리 해제
• 클래스 멤버 변수 -> 클래스가 소멸되면 같이 해제
• 전역 변수 -> 프로그램이 종료될 때 해제
함수의 인자나 , 배열에 대입할 때 , 값의 복사 (Copy) 가 일어 난다 .
Value 소멸
Value 복사
Value 복사
Value( 값 ) 복사
partyMember[3]
0 CCharacter
1 CCharacter
2 CCharacter
soeun
wonHyo
jinSang
객체의 멤버 변수 값만 복사 된다
Value( 값 ) 복사 결과
partyMember[3]
0 CCharacter
1 CCharacter
2 CCharacter
soeun
wonHyo
jinSang
값만 복사 (COPY) 했을 뿐 , 서로간에 아무런 관계가 없다서로는 완전히 별개의 객체이다 .
총 객체의 개수 = 6 개
Value( 값 ) 복사
복사 생성자
값이 복사될때는 기본 생성자가 아닌 ,
복사 생성자가 호출 되며 , 값이 복사 된다 .
Pointer
Pointer
전역 힙 (Heap) 메모리 공간에 동적 생성
영역을 벗어나도 해제 되지 않는다
• 포인터 변수의 실제 값은 할당된 메모리의 시작 주소
• 할당된 메모리를 해제하지 않을 경우 , 메모리 누수 (Leak) 가 발생한다
함수의 인자나 , 배열에 대입할 때 , 실제 메모리 주소만을 복사한다 .
Pointer 실습
partyMember[3]
0 CCharacter*
1 CCharacter*
2 CCharacter*
pJinWoo
pJongChan
pYoonSung
객체의 주소값만 복사된다
Reference( 참조 ) 복사
Value vs Pointer
Value
실제 데이터의 복사
일반 데이터 타입
타겟과 원본이 각각 별도의 메모리 공간을 차지함원본이 사라져도 관계 없음
VS
Pointer
참조 주소를 복사
포인터
타겟과 원본이 같은 메모리 주소를 참조함원본 데이터가 사라지면 , 포인터는 모두 무효 포인터가 된다 .
partyMember[3]
0 CCharacter*
1 CCharacter*
2 CCharacter*
pJinWoo
pJongChan
pYoonSung
객체의 주소값만 복사된다
포인터 ( 주소 ) 복사
이것들은 전부 바로가기 ( 포인터 ) 그럼 실제 데이터는 어디 있는가 ??
동적 할당
C 의 malloc() 과 같음
C C++ 차이
malloc new 클래스 , 구조체등의 타입에 맞는 사이즈 자동 할당생성자를 자동 호출
free delete 소멸자를 자동 호출
pJinWoo
pJongChan
pYoonSung
메모리를 가르키는 포인터
메모리를 가르키는 포인터
실제 메모리가 할당된 데이터
포인터 ( 주소 ) 복사
포인터 주의점 (1)
Player1 에 Player2 의 주소를 덮어씀
이제 두개의 포인터가 같은 주소를 가르킴
Player1 을 해제할 포인터가 없어짐
두 개의 delete 가 사실 같은 메모리를 두번 해제하는 버그 발생
포인터 주의점 (2)포인터 변수의 값 ( 주소 ) 이 복사 되어 지역 변수가 생성된다 .
함수내의 지역 변수의 복사가 일어날 뿐이다 .
함수에서 벗어나면 사라지는 지역 변수이다 .
이 포인터에 저장된 값은 변경되지 않는다
함수내의 로컬 변수가 변경된 것 뿐이기 때문이다 .
Reference
레퍼런스
• 존재 하는 객체를 참조 ( 레퍼런스 ) 한다 .
• 포인터와 달리 항상 존재하는 값만을 참조한다 . (NULL 이 될 수 없다 )
• 이미 존재하는 값을 복사가 아닌 참조하는 것으로 , 별명 (Alias) 라고도 한다
• 새롭게 할당하거나 복사하지 않는다 .
Value <-> Pointer
Value <-> Pointer
• Value 변수 앞에 & : 주소값을 반환 . Value -> Pointer
• 포인터 변수 앞에 * : 포인터에 저장된 값을 반환 . Pointer -> Value