C++ 5일차 - 1

JUSTICE_DER·2023년 2월 7일
0

C++

목록 보기
5/20

이전 4일차로부터 일/월 해서 2일을 쉬었는데,
다시 1일차 처음부터 복습해본다.

C에서는 char이 정수형 자료형 1바이트이고,
1비트를 제외하여 127개의 아스키코드 문자를 표현할 수 있다.
실제 메모리에 저장되는 값은 숫자 2진수로,
unsigned char을 한다면, 00000000~11111111까지
2진수로 0~255까지의 표현이 가능하고,
그냥 char을 한다면, -128~0~127까지의 표현이 가능한 것이다.

음수를 2진수로 표현하기 위해선, MSB를 1로 두어야 하고,
양수와의 합이 0000 0000으로 비트가 구성되도록 만들어야한다.
2의 보수법으로, 양수의 비트를 반전시킨 후, 1을 더하면 음수표시가 된다.

실제로 메모리에 들어있는 값은 같아도,
자료형이 붙은 변수를 읽는다면, 해당 자료형에 맞게 각 비트가 해석이 된다.

실수형도 정수형과 다른 방식으로 해석이 되고,
10진수의 0.5에 0.5를 한 번 더 더하면 1.0으로 자릿수가 바뀌듯이,
2진수의 0.1에 0.1을 한 번 더 더하면 1.0으로 2진수 자릿수가 바뀌기 때문에, 10진수의 0.5와 2진수의 0.1은 같은 수에 대한 표기로 보고, 10진수 실수의 정수부분은 그대로 정수형처럼 2진수로 표기하고,
소수부분은 0.5, 0.25, 0.125, 0.0625를 조합하여 표기하게 된다.

논리연산자에서 0은 false를 의미하고,
0이 아닌 다른 모든 수는 true를 의미한다.

C++ 변수의 종류는 4가지
1. 지역변수
2. 전역변수
3. 정적변수 (static)
4. 외부변수 (extern)

1 - 지역변수는 함수 내에서만 동작하는 함수이고, 스택영역에 존재하게 된다.
2 - 전역변수는 해당 파일 내에서만 동작하는 함수이고, 데이터 영역에 존재하게 된다.
3 - 정적변수는 해당 변수가 자신이 설정된 위치에서만 동작하는 변수로, static만 붙여주면 되고, 데이터 영역에 존재하게 된다.
쓰이는 위치에 따라서 다른 기능을 갖는데,
지역변수처럼 쓰인다면, 해당 함수 내에서 초기화가 1회 실행되고,
함수가 완료되어 스택영역에서 사라져도, 데이터영역에 존재하기 때문에 사라지지 않고 값을 그대로 유지한다.
전역변수처럼 쓰인다면, 다른 파일에서 같은 이름이 존재해도, 문제가 없게 된다.
4. 외부변수는 정말로 모든 파일에서 사용할 수 있는 전역변수 그 자체이고, 한 파일에서 초기화했다면, 다른 파일에서도 사용이 가능하다.

C++ 메모리영역은 4가지
1. 스택영역
2. 데이터 영역
3. 읽기 전용(코드, ROM)
4. 힙 영역

1 - 스택영역은 함수가 호출되면서 쌓이는 영역이고,
호출된 함수가 끝나면, 위부터 메모리가 해제된다.
2 - 데이터영역은 프로그램 시작하는 동시에 생성되며, 끝나면 사라진다.
3 - 읽기전용메모리는 코드 자체를 저장해두고, 코드상 변수에 값을 대입할 때, R-Value에 대한 값을 따로 저장해놓기 위해서 두는 메모리로,
const wchar_t* d = L"abcdef"; 문자열자체를 포인터의 주소로 받을 수 있고, 접근할 수 있는데, 해당 공간이 읽기전용공간이다.
4 - 힙 영역은 malloc이나 new를 통해 사용자가 동적으로 생성하는 메모리의 영역으로, 사용자가 만든만큼, 사용자가 해제해줘야 한다.

배열의 특징
1. 메모리가 연속적인 구조이다.
2. 배열의 이름은 배열의 시작 주소이다.
그렇기에 포인터로 인덱스접근이 가능하다.

const는 상수화 시키는 것으로,
변할 수 없는 값을 의미하는데,
포인터와 접목하여 쓸 수 있다.

const-포인터는 포인터가 참조한 원본 값을 바꾸지 못하고,
포인터-const는 포인터가 가리키는 주소를 바꾸지 못한다.
방어적인 코딩으로 사용하곤 한다.

void포인터는 자료형이 없는 포인터로, 주소값만 담을 수 있다.
사용자가 해석하는 방법인 자료형을 직접 명시해야한다.

문자는 딱 하나의 글자만 받을 수 있는데,
문자열은 여러 문자들을 받을 수 있다.
자료형인데 가변적이기 떄문에, 문자열의 끝은 0으로 채운다.
이를 문자형으로 아스키코드 해석하면 null이다.

문자형을 위해서 2바이트인 wchar_t를 사용해야하는 이유는,
윈도우의 멀티바이트셋 방식 때문인데,
윈도우가 자동으로, 한글을 2바이트로 바꿔버린다. 문자마다 다른 가변적인 바이트 떄문에 문제가 된 것이고,
그냥 애초에 2바이트로 고정 선언하는 wchar_t를 쓰는 것이 바람직하다.

동적할당은 malloc으로 바이트수를 입력하여 하고,
free로 해당 포인터를 해제한다.

배열의 선언부 중 크기부분에는 변수가 들어갈 수 없어서,
가변배열을 따로 만들어주어야 하고, 이를 malloc방식으로
동적할당하여 구현할 수 있게 된다.

리스트도 동적할당으로 구현이 가능하다.
리스트는 다음 노드의 주소만 알고 있으면 되기 떄문에,
가변배열처럼 malloc의 크기를 늘리는 행위를 하지 않아도 된다.

클래스는 생성자 소멸자 개념이 있는데,
생성자나 소멸자는 사용자가 만들지 않아도 자동으로 코드상 생성이 되며,
객체가 생길떄, 객체가 사라질떄 해당 기능이 각각 호출되어 실행된다.

클래스 내의 변수, 함수들을 멤버변수, 멤버함수라고 하는데,
해당 클래스의 이름을 붙여서 접근을 해야한다. (같은 이름의 여러 다른 함수가 존재할 수도 있으므로)

[헷갈릴 만한 것들]
1. 자료형 변수명 //포인터변수 선언
2.
포인터변수명 //포인터 역참조
3. &변수 //변수의 주소값
4. 자료형& 변수명 //레퍼런스변수 선언

레퍼런스변수라는 것은, 어떻게보면 포인터, 어떻게보면 상수와 비슷한 것으로,
in& cox = a; 이렇게 둔다면,
cox라는 변수명을, a 대신 쓸 수 있다.
cox = 100;을하면 a에 100이 들어간다.
대신 cox가 b를 레퍼런스 할 수는 없다. 그러므로 const-포인터 느낌이다.


이제 복습을 마치고 강의를 듣자.

profile
Time Waits for No One

0개의 댓글