본 문서는 인프런의 [하루 10분|C++] 누구나 쉽게 배우는 C++ 프로그래밍 입문 강의를 공부하며 작성한 개인 노트입니다.

C++는 복합데이터형을 제공한다.

  • 복합데이터형: 기본 정수형과 부동소수점형의 조합
  • 사용자가 새로운 데이터형을 정의할 수 있음

💌 배열과 문자열

배열: 같은 데이터형의 집합
typeName arrayName[arraySize];

short month[12] = {1, 2, 3};
  • 배열 원소에 대입할 값들을 , (콤마)를 구분하여 중괄호로 묶어 선언
  • 초기화와 선언은 같이 해야 함
  • 배열을 다른 배열에 통째로 대입 불가
  • 초기화 값의 개수를 배열 원소의 개수보다 모자라게 제공 가능
  • 배열을 부분적으로 초기화하면 나머지 원소 모두 0으로 설정
    • 명시적으로 첫번째 원소만 0 으로 초기화 > 나머지 원소 모두 0으로 초기화
      • (예) 위 예시를 기반, month[3]를 출력하면 결과는 0
    • 배열을 초기화할때 대괄호 속을 비워두면 컴파일러가 초기화 값의 개수를 배열 원소 개수로 저장

특징

  • 배열을 출력하면 null 값이 있을 때까지 출력한다
    • 배열에 null값을 대입하지 않으면 이상문자까지 출력됨
char a[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };

📊 사용자 입력과 string

strlen

strlen - 배열의 길이 반환

#include <cstring>

(예) strlen(name1)

cin

cin - 입력 받아서 변수에 저장

cin >> name1; //name1은 변수
  • 공백을 포함하면 그 이후 입력은 저장되지 않음

cin.getline(변수, 최대크기); - 줄 단위로 입력 받음

  • getline과 기능 유사
cpp.getline(name1, Size);

string

-cin으로 string 객체에 입력 저장 가능

  • cout으로 string 객체를 디스플레이
  • 배열 표기로 string 객체에 저장되어 있는 개별적 문자에 접근 가능
  • string은 다른 string에 통째로 대입 가능
string str1 = "jinny";
cout << str1[0] << endl; // "j" 출력

📬 구조체

구조체: 다른 데이터형이 허용되는 데이터의 집합

struct MyStruct 
{
	string name;
    string position;
    int height;
    int weight;
};
MyStruct A = {
	"Jinny",
    "Student",
    185, 
    80
};

cout << A.name << endl;
  • 구조체 안의 변수 > 멤버
  • 구조체의 모든 멤버에 입력할 필요는 없음
  • 구조체도 배열로 선언 가능
MyStruct A[2] = {
	{"A", "A", 1, 1},
    {"B", "B", 2, 2}
};

cout << A[0].height << endl; // 1 출력

💶 공용체와 열거체

공용체

공용체, union: 서로 다른 데이터형을 한 번에 한가지만 보관

  • 구조체와 유사
union MyUnion
{
	int intVal;
    long longVal;
    float floatVal;
};

MyUnion test;
test.intVal = 3;
test.longVal = 33;
test.floatVal = 3.3;
  • 구조체와 동일해보이지만 다름
  • 새로운 데이터형을 저장하면 기존에 저장되어있던 타데이터형은 더이상 보관되지 않음
    • (예) int 변수를 저장한 상태에서 long 변수를 새로 저장하면 int 변수는 더이상 저장되지 않음
    • 메모리 절약 > 운영체제 등 활용

열거체

열거체, enum: 기호 상수를 만드는 방법

enum spectrum { red, orange=1, yellow, green, blue, violet, indigo, ultraviolet };

spectrum a = orange;
  • spectrum을 새로운 데이터형 이름으로 만듬
    • 값 초기화도 가능
    • 초기화 안하면 초기화 한 값보다 1 큰 수로 자동 초기화
  • red, orange, yellow.. 0에서부터 7까지 정수 값을 각각 나타내는 기호 상수로 만듬
  • 산수 연산 불가
  • 하지만 아래 예시는 가능
int b = blue; //blue = 4
b = blue + 3; //b = 7

🛁 포인터와 메모리 해제

C++ > 객체지향 프로그래밍

  • 컴파일 시간이 아닌 실행 시간에 결정을 내릴 수 있다
    • (예) 배열을 생성할 경우
      • 재래적 절차적 프로그래밍: 배열의 크기가 미리 결정
      • 객체지향 프로그래밍: 배열의 크기를 실행 시간에 결정

포인터

포인터: 사용할 주소에 이름을 붙인다

  • 포인터의 이름이 주소를 나타냄
  • 간접값 연산자, 간접 참조 연산자 *
  • 포인터 변수의 값 > *var
  • 포인터 변수의 주소 > var
int* a, b;
  • a는 포인터 변수, b는 일반 변수로 선언됨
int a = 6;
int* b;

b = &a;

cout << "a의 값 " << a << endl; //6
cout << "*b의 값 " << *b << endl; //6

cout << "a의 주소 " << &a << endl; //0033FAC0
cout << "*b의 값 " << b << endl; //0033FAC0

*b = *b + 1; 
cout << "이제 a의 값은 " << a << endl; //7

return 0;

new 연산자

new 연산자 - 어던 데이터형을 원하는지 new 연산자에게 알려주면 new 연산자는 그에 알맞은 크기의 메모리 블록을 찾아내고 그 블록의 주소를 리턴

int* pointer = new int; //4 byte를 저장할 수 있는 주소를 찾아 pointer에 리턴

delete 연산자

delete 연산자 - 사용한 메모리를 다시 메모리 풀로 환수

  • 환수된 메모리는 프로그램의 다른 부분이 다시 사용
  • new 사용 후에는 꼭 delete를 사용해야 함 > 데이터 누수 방지
int* ps = new int; // 메모리 사용
delete ps;
  1. new로 대입하지 않은 메모리는 delete로 해제 불가
  2. 같은 메모리 블록을 연달아 두번 delete로 해제 불가
  3. new[]로 메모리를 대입하여 delete[]로 해제
  4. 대괄호를 사용하지 않았다면 delete도 대괄호 사용 불가
double* p3 = new double[3]; //double형 데이터 3개를 저장할 수 있는 공간 대입
p3[0] = 0.2;
p3[1] = 0.5;
p3[2] = 0.8;

cout << "p3[1] is " << p3[1] << ".\n"; //0.5

p3 = p3 + 1; //포인터를 증가시킨다

cout << "Now p3[0] is " << p3[0] << " and "; //0.5
cout << "p3[1] is " << p3[1] << ".\n"; //0.8

🧅 포인터 연산

char animal[20];
char* ps;

cout << "동물 이름을 입력하십시오\n";
cin >> animal;

ps = new char[strlen(animal)+1]; 
strcpy_s(ps, animal); // animal의 값을 ps에 복사
  • 복사된 값은 기존 값과 주소가 다름

동적(dynamic) 구조체: 컴파일 시간이 아닌 실행 시간에 메모리를 대입받는 것
temp* ps = new temp;

struct MyStruct
{
	char name[20];
    int age;
};
int main() 
{
	using namespace std;
    MyStruct* temp = new MyStruct;
    
    cout <<"당신의 이름을 입력하십시오\n";
    cin >> temp->name;
    
    cout <<"당신의 나이를 입력하십시오\n";
    cin >> (*temp).age;
}
  • 멤버 연산자는 ->로 표기
profile
우당탕탕

0개의 댓글

Powered by GraphCDN, the GraphQL CDN