9주차 요약

김서영·2021년 11월 2일
0

const char보단 std::string을 사용하는 것이 좋다.
클래스 안에서 만든 멤버함수는 자동 inline함수이지만, 밖에서 만든 것은 자동 inline함수가 아니다.

const 변수

전처리기 #define으로 컴파일 전에 변수값을 변경할 수 있다.
const는 변수에 상수의 의미를 갖게 하여 값을 변경할 수 없게 한다.
const는 자료형 앞에서 쓰며, 항상 상수로 바꿀 변수에 초기값을 넣어줘야 한다.
C++11부터는 {}로 초기화를 할 수 있다.

함수에 사용하는 const

매개변수가 const인 경우 함수 안에 const를 사용한다.
ex. void display(const int);
리턴값이 const며 reference(&)를 리턴하는 경우, 함수의 자료형 앞에 const를 사용한다.
ex. const int cat(int);
함수가 const며, 멤버변수를 변경하지 않는 경우, 함수 뒤에 const를 사용한다.
ex. int cat(int) const;

const 멤버

const형 멤버함수는 멤버변수를 변경하는 치환연산을 수행할 수 없다.
읽기 전용 함수인 get함수 뒤에는 const를 붙이는 것이 좋다.
(안 붙여도 사용이 가능하나, 붙이는 것이 좋다.)
생성자와 소멸자에서는 const를 사용할 수 없다.
멤버변수는 형 앞에 const를, 멤버함수는 함수의 괄호 다음에 const를 추가한다.

const 객체

객체가 const로 지정되면 const로 지정된 멤버함수를 호출하는 경우를 제외하고 해당 객체에 초기화된 데이터는 변경할 수 없다.

포인터

포인터는 주소를 저장하는 변수다.
메모리의 주소를 이용해 메모리의 내용을 직접 접근할 수 있다.
변수의 메모리의 주소는 변수의 앞에 &연산자를 사용하면 알 수 있다.
포인터는 메모리의 주소를 저장해준다.

포인터와 주소

메모리의 주소는 위치를 구분하기 위해 순서대로 붙어있는 번호다.

포인터 선언

자료형과 변수 사이에 구두점 을 더 쓰면 된다.
일반적으로 변수 앞에 구두점
을 쓴다.

참조 연산자 *

포인터 변수 앞에서만 사용할 수 있다.
실행문에서 사용하며, 포인터의 주소로 가서 값을 가져온다.
참조연산자이다.
곱하기 연산자*보다 우선순위가 높다.

* : 선언문(구두점) vs. 실행문(연산자)

선언문에서는 포인터를 선언할 때 사용한다.
실행문에서는 주소로 가서 값을 가져올 때 사용한다.

포인터 변수의 크기

대부분의 온라인 컴파일러는 8바이트이다.
Visual Studio는 기본적으로 4바이트이고 8바이트로 변경 할 수 있다.

포인터 변수의 자료형?

자료형 * 포인트 변수명;
변수가 자료형의 데이터를 참조하기 위해 작성한다.
int형인 경우 변수가 지시하는 곳에 int형의 데이터가 있다는 것을 알려준다.

포인터의 자료형과 대입할 수 있는 값

int *px; 의 int는 int형의 데이터를 참조하기 위한 포인터로, int형의 주소만 대입할 수 있다.

포인터의 초기화

자료형 *포인터_변수명=초기화 주소;
초기화 주소에 특정 번지값을 넣는 것은 위험하다.
변수의 주소로 초기화하는 것이 안전하다.

s[i]==*(s+i)

배열의 이름은 그 배열의 시작 주소를 저장하는 포인터와 같다.

지역(local) 변수와 전역(global) 변수

지역 변수는 해당 함수나 블록({ }) 내에서만 사용할 수 있고 전역 변수는 소스 전체에서 사용할 수 있다.
전역 변수는 값을 찾기 힘들기 때문에 되도록 사용을 자제하고 있다.

코드 영역과 데이터 영역

지역 변수는 stack영역을 사용한다.
정적 메모리 stack영역이 넓지 않기 때문에 동적 메모리인 heap영역을 할당받아 사용할 때가 있다.

컴퓨터의 프로그램 메모리 레이아웃

  • 지역변수는 자신의 지역({ }) 내에서만 유효하며, 함수가 반환되면 사라진다.
  • 전역변수는 프로그램이 끝날 때까지 값을 유지하고, 모든 부분에서 접근이 가능하지만, 이해하기 어렵고 유지 보수하기 어렵다.
  • 동적메모리할당은 지역변수이지만, 할당받은 메모리를 해제하기 전까지 값을 유지한다.

동적 메모리를 사용하는 이유

  1. 지역변수를 전역변수처럼 프로그램이 끝날 때까지
    값을 유지하고 싶은 경우
  2. 프로그램을 실행할 때(runtime) 메모리의 양을 결정해야 하는 경우
  3. 스택 공간이 부족하면 stack overflow 오류가 일어나기 때문에 heap에 할당해야 하는 경우

정적 vs. 동적 메모리 할당

정적 메모리 할당

컴파일 시 필요한 메모리를 할당한다.
너무 큰 메모리는 할당할 수 없다.

동적 메모리 할당

실행시 필요한 메모리(heap)를 할당한다.
필요한 만큼만 잡는다.
메모리의 주소를 사용(포인터 이용)하여 접근하기 때문에 포인터에 대한 이해가 필요하다.

동적 메모리할당: C vs. C++

C에서는 malloc()함수와 free()함수를 사용한다.
C++에서는 new와 delete를 사용한다.

new와 delete

new는 메모리를 동적으로 할당하고, 할당된 메모리에 대한 주소를 반환하는 연산자이다.
delete는 더 이상 필요 없는 메모리를 해제한다.
ex. int *pi=new int;

new와 delete의 장점

new는 지정된 형의 포인터(메모리 시작주소)를 자동으로 반환한다.
생성자를 자동으로 호출한다.
malloc.h나 stdlib.h를 포함할 필요가 없어진다.

Variable-length Array : 실행 가능?

visual stdio에서는 사용할 수 없다.
온라인 컴파일러에선 대부분 가능하지만, stack overflow가 발생할 수 있음으로 사용하지 않는 것이 좋다.


C++프로그래밍(21-2학기)한성현교수 강의 내용 변형 및 요약

0개의 댓글