[C++] 객체지향프로그래밍1 : C-language review (Chapter 3 - 7)
이 게시글은 대학교 객체지향프로그래밍1 (C++) 강의를 수강하며 교수님의 강의를 정리한 것입니다. 오직 개인적인 학습 기록으로 활용하기 위한 용도로 작성되었으며, 가독성이나 체계적인 정리가 부족할 수 있습니다.
(시험대비 간단 요약)
객체지향프로그래밍1 (C++)
1. C언어 복습 (part1,part2)
전처리 지시자: # 으로 시작되는 것들
#include, #define, #pragma . . .
컴파일러가 소스코드를 기계어 코드로 바꾸기 전에 처리하는 것.
함수 정의 ( function declaration)
반환타입, 함수 이름, 매개변수 목록을 함수 원형(prototype) 이라함.
- 반환타입
- 함수 이름
- 매개변수 목록
- 함수구현 (body)
형변환 (Type converson)
묵시적형변환 : 컴파일러에 의해 자동으로 형변환
명시적형변환 : 변수나 상수 앞에 (타입) 형태로 명시표현문 (Expresson Statement)
형태 : 표현식(expression) ;(세미콜론)
복합문 (Compound Statement)
형태 : { 변수정의들 문장들 }
함수 몸통처럼 생겼지만 이것 통째로 “ 단 하나의 문장 “
여러 문장을 써야 된다면 중괄호로 묶어서 복합문을 만들어버리면 됨.
if문, for문, case문, . . .
2. C언어 복습 (part3,part4)
포인터 (변수)
포인터 변수의 크기 : 8 byte
( 주소를 저장할 수 있는 크기 )
* (deference 연산자, 참조연산자)
* 는 이항 연산자로 쓰이면 곱하기, 단항 연산자로 쓰이면 참조 연산자
int * p; “ p 에는 메모리 주소가 담겨있는데, 그걸 “따라가면” int 가 나옴 “
따라가면 에 해당하는 것이 * 임 ( printf(“%d”, *p);
배열
배열의 이름 == 주소 상수
int array[] = { 1,2,3 };
*(array + 2) = 0 로 배열 원소에 접근 가능.
Call-by-Value
함수에 인자를 넘길 때 C는 값을 “ 복사 ‘ 해서 넘긴다.
Call-by-reference
서로 같은 메모리 주소를 쓰는데, 이름만 여러개 붙은 것일 경우 call by reference 라고 한다.
EOF
파일의 끝을 의미
처리할 파일의 끝일 뿐이지, 프로그램의 종료를 의미하지는 않는다.
파일 작업을 하다가 EOF 가 읽히면 파일 작업을 중단해야 한다.
Object 파일의 구조
.bss : 초기값이 없는 전역 변수 공간 ( 저장공간이 필요하다는 사실을 저장 )
.data : 초기값을 갖는 전역 변수 공간 ( 데이터를 저장 )
.rodata : 코드 안에서 사용된 문자열 상수 공간 ( “ Hello, World” 문자열 저장 )
.text or .code : 함수의 기계어 코드 표현 ( print main 과 같은 기계어 코드를 저장 )
메모리 적재될 때 변수의 주소 변경 문제
상대 주소를 사용 : 고정된 숫자가 아니라 “ 어떤 기준점 대비 몇바이트 떨어진 위치 “ 같은 형태로 저장
STACK
모든 지역 변수는 절대 주소가 아니라 상대 주소를 쓴다.
FRAME POINTER (FP) 로 부터 몇 바이트 떨어졌는지를 이용
함수가 호출되면 프레임포인터를 변경 시키고, 이제 호출된 함수는 변수 접근할 때마다 프레임포인터를 기준으로 상대 주소를 이용.
함수가 종료되면 프레임포인터를 원래대로 되돌린다.
LIFO 처럼 메모리 공간의 수명주기가 엄격하지 않고 원하는 시점에 할당하고 해제 가능한 방식이 필요함 –> HEAP
HEAP
메모리 할당 순서, 반환 순서 관계 없이 사용할 수 있는 메모리를 heap 이라고 한다.
즉, HEAP 은 할당과 해제의 순서에 관계 없이 필요할 때 할당하고 해제 되는 메모리
void *
타입과 관계 없이 주소 값을 저장하는 목적으로 사용한다.
1
2
void *ptr
ptr = &i;
malloc
할당할 전체 메모리 사이즈를 인자로 넘김
1
malloc (sizeof(int) * 4);
calloc
calloc 은 반환하는 메모리를 0 으로 초기화한다.
원소 개수, 각 원소의 크기를 명시해야 한다.
1
parray = calloc(4, sizeof(int));
realloc
기존에 할당 받은 메모리의 크기를 변경해서 새로 할당하고자 할 때 사용
기존 메모리의 내용을 새 메모리에 복사할 수 있는 만큼 복사하고, 기존 메모리는 해제
realloc = malloc + memcpy + free
free
malloc,calloc,realloc 으로 할당 받은 메모리를 해제
