본문 바로가기
방통대

방통대 C++ 수업 요약

by 보안매크로 2023. 9. 11.
728x90

- include는 선행처리기 지시어 - 선행적으로 먼저 처리하라는 명령어이다. 그러므로 내용이 아니므로 ;는 안붙인다.
- // 는 c와 동일하게 주석 처리이다.
- <<는 넣는다는 의미이다. std::cout(파이썬에서 print문)<< "출력 문자열" << std::endl(파이썬에서 \n과 동일 = 엔터);

프레임워크, 라이브러리는 보통 c로 만들어서 속도가 빠르다.
프레임워크 vs 라이브러리
프레임워크는 사진 틀에서 작업 하는 것으로, 어떠한 집합체에서 뭔가를 작업하는 것이다. 주체가 서비스 회사이다. 서비스 회사가 서비스 해주면 우리가 쓰는 것이다.
라이브러리는 도서관. 필요한 기능(함수)들 만들어 놓고 모아둔 것. 주체는 나다. 내가 필요한 것을 뽑아서 씀


- .h 는 c의 헤더파일이다. (실제 c++의 확장자 명은 .hpp 헤더++이다.이다.)
- 스트림(stream)이란? 흐름이다. 데이터를 흘러가는 모양이다. io 스트림이면 입출력의 흐름이다.
입력(ex.키보드) -> 와이파이, 케이블 등 을 통해 시스템버퍼에 키보드버퍼에 들어감 -> 램에 들어감 -> CPU에 전달해 프로세싱 하고 데이터를 처리함 -> 모니터, 프린터 등 출력장치에 출력, 이것을 총괄하는게 iostream이다. c에서는 stdio.h(스탠다드 io)
- std::cout - std안의 cout라는 함수. (파이썬 std.cout()와 같음), 
- c에서는 main을 무조건 시작함수 (파이썬 _init__과 동일), 
- {}의 의미 : 집합/셋 이다. 여러개의 데이터가 모여있는 
- 입출력은 무조건 문자열로 출력함. 그 사이에 시스템적(메모리상)으로 2진수 등 숫자로 처리됨.
- <<는 삽입 연산자라고 한다. 
- std::cin (in, 입력이다) - 입력 시 , 백색공간문자(빈칸, 탭, 새줄 문자)는 구분자로 취급된다. 읽지 않음.
- namespace myNSpc - '명칭공간이름'을 지정해준다. 겹치면 에러난다.

NameSpace

- NameSpace1과 2, 전역(전체)변수 a에 a값들은 서로 다른 변수이다.
- 전역변수 a 설정하고 main함수 안에서 a = 40으로 써주면 못바꿈, 모든 변수는 항상 가까운곳을 참조한다. 
- ::a는 전역변수, 그냥 a는 main 함수 안의 a변수값이다.
- ::는 스코프다.

- Using - using namespace std 을 이용한 명칭공간 사용, 사용 시 std:cout를 그냥 cout로 써도 써진다.
식별자 - 무언가를 유일하게 식별할 수 있는 문자, 보통 전문가들은 자신이 사용할 함수만 using std:cout 로 사용함.
자신이 쓰고있는 객체만 써야 햇갈리지 않음.

- 데이터는 > 메모리(램)/주소(고정값 = 상수)/os가 1byte 단위로 쪼개놨다. 공간을 구분하기 위해 메모리 공간 이름이 식별자이다. 변수 이름 ,함수 이름, 배열 이름 등이다. 실제 하드웨어단에서는 주소로 찾아가지만, 우리는 이름으로 찾아간다. 주소 대신 쓰는게 식별자이다. 우리가 식별자를 쓰면 식별자에 지정된 주소로 알아서 찾아가준다. 주소는 하드웨단에서 지정한다. > 숫자(공간)
- 상수란? 변하지 않는 고정 값, 주소이다. 숫자 상수, 문자 상수, 문자열 상수 등이 있다.
- 변수란? 변할 수 있는 값이 아닌, const int a = 10; 에서 a가 const(한정자, 값을 한경시킨다)변경할 수 없는 변수(변수상수)이다.
즉, 변수는 메모리 공간을 구별하기 위한 식별자이다.
- a, b, c and d, 마지막에 and 붙인다. 모든 언어가 그렇다.

변수의 초기화 - c++에서는 int total(0); 으로 쓴다. 이렇게 해야 컴파일러가 일을 한번 덜한다. (int total = 0;과 동일)
- ()는 하나, {}는 여러개 쓸 때 사용

 

최근 쓰이는 형식(오버플로 방지)


- int x(1.5) 는 1.5 double값이 1.0으로 바뀜. 아래 형식 3으로 하면 int 하위비트인 short 범위로는 축소 불가해서 변환이 따로 필요함. short x{(short)total} 해줘야 됨. 
- auto i(10); 하면 자료형을 자동으로 추론해 서 int i(10);으로 인식. 컴파일러에겐 안좋음. 사용자에게 어떤 데이터를 받을지 모를때만 써준다.
- const는 한정어로 처음에 초기화를 할떄에만 값을 설정한다. 변수의 값을 수정할 수 없게 함.
- c에서는 #define PI2 3.14 //replace다. 파이를 만나면 3.14로 바꿔줘 라는 것. 메모리를 안씀
- const double PI{ 3.141592 }; // 변수화를 해서 그 변수를 상수화 함. C++은 이렇게 씀

배열

배열

- 역참조 연산자(*)를 사용하면 특정 주소의 값에 접근할 수 있습니다.

#include <iostream>

int main()
{
    int x = 5;
    std::cout << x << '\n'; // print the value of variable x
    std::cout << &x << '\n'; // print the memory address of variable x
    std::cout << *&x << '\n'; /// print the value at the memory address of variable x

    return 0;
}
// prints:
// 5
// 0027FEA0
// 5


- int arr[3] =  { 1, 2, 3 };
에서 arr는 상수이다. 주소이기 떄문이다.  int(4바이트) 1(4byte), 2(4byte), 3(4byte) 각 4바이트씩 할당되어 있는 배열 a이다.
 lvalue는 왼쪽에는 값을 저장할 수 있는 메모리 공간이 와야한다. 오른쪽에는 값, 함수 등 모든게 와도 된다. 오른쪽 값이 왼쪽 메모리 공간으로 들어간다.
arr[0] = 100 에서 arr[0], arr[1], arr[2]이 변수인 것이다.
arr[0]++하면 102가 출력, ++는 변수에만 쓸 수 있다. arr++하면 못쓴다. arr은 상수이다.
*(arr + 1) 하면 arr[1] 값이 나온다. [] <-> *()를 서로 잘 변환 시켜야 한다.
arr + 1 은 처음에 arr[0]의 주소 위인 arr[1]의 주소를 가리킨다. 즉 주소값이다.
arr == &arr[0]이다. arr[0]의 주소가 arr이다. arr의 크기는 12바이트지만, 4바이트의 첫번째 주소를 가리킨다.
 
 - int* ptr =  &a; // 포인터 변수는 메모리 공간을 가리키는 특별한 변수, int a = 10이라 하고,
ptr = a하면 a는 주소가 아닌 식별자 값(변수)이기 때문에 오류남.
ptr = arr 하면 arr은 주소(상수)이기 때문에 오류가 안남.
cout << *ptr << endl; 하면 1이 출력됨. 자동으로 0번쨰 인덱스 값 출력

- 뭐지? - 
cout << *(ptr++) << " " << *ptr++ << " " << *ptr << endl;
cout << ptr[0] << " " << ptr[1] << " " << ptr[2] << endl;
가 같다고 하심.

int arr2[2][3] = { {"1, 2, 3}, {4, 5, 6} };
2차원 배열에서 행은, 열 전체를 대표하는 주소이다.
*(arr2 + 1) 하면 ==> 4가, *(arr2[1]+1)하면 ==> 5 가 나온다는 것이다.

포인터 정리

 

 

32비트 운영체제를 사용할 때, 포인터 변수는 int(4byte)든, char(1byte)이든, double이든 무조건 4바이트 크기이다. 운영체제가 그렇게 할당해줌, 64비트 운영체제면 8byte 크기이다.
 앞에 붙는 char 이런 것은, 증감되는 크기이다. 예를들어, 포인터변수 int로 선언한 포인터변수 pa에 +1, pa + 1 을 하면 4바이트씩 증가하며 주소를 갖는다. char이면 1바이트, double이면 8바이트가 증가한다.

 

 동적 메모리 할당
- int *intPtr = new 이름 으로 할당함. 운영체제가 할당해 주는게 아닌, 자유(공용) 메모리 공간을 쓰는 것.
 지울때는 delete intPtr 로 지움

 참조 - 별명 처럼 사용
&(참조 연산자) 변수의 이름을 다르게 쓰고 싶을 때 사용, 포인터 할당할 때 &와 햇갈리지 말자.
함수에서 다른함수로 값을 전달할때 주소, 값을 다 전달하지 않아 효율적이다.


 

참조

 마지막 문자는 NULL문자로 6바이트가 낭비이다.
 Char str[3][100] = { "a", "b", "abcd" }; 이런식으로 쓰면 낭비이다.
 Char *str[3] = { "a", "b", "abcd" }; 로 써야한다.

지역변수에 변수 int a 하면 a에는 처음에 쓰레기 값이 들어감. 운영체제에서 프로그램을 메모리에 저장(로딩)하고, 프로그램 끝나면 로딩 끝냄, 근데 메모리 영역은 그대로 둔다. 그래서 남아있는 것이다. 그 전 값이 뭔지 모르니 초기화를 꼭 시켜줘야 한다. 전역 변수는 0으로 자동으로 할당 되어있어, 초기화를 안해줘도 된다.

 

 

 

728x90

'방통대' 카테고리의 다른 글

C++ 추가자료 사진  (0) 2023.09.15