본문 바로가기

Language/C++

(33)
[C++] OOP - 클래스(class) 객체 지향 프로그래밍을 수행하게 되면 데이터와 기능을 유기적으로 연결하기 위해 클래스(class)를 사용하게 된다. 추상화를 통해 원하는 객체를 class 키워드를 통해 사용자 정의타입으로 생성하며 struct와 구조가 같다. 구조체와 다른 점은 접근제어자가 추가되었고 함수를 포함할 수 있게 된 점이다. 클래스 선언 class 클래스명 { 접근제어자: 멤버 변수1; 멤버 변수2; ... 멤버 함수1; ... } C++은 3가지 접근제어자를 제공한다. ① private (디폴트) 객체의 멤버를 외부에 공개하지 않고 직접적으로 접근할 수 없게 한다. 동일 클래스 내에 있는 멤버 또는 friend 함수만 접근 가능하기 때문에 필요 시 public으로 선언된 메소드를 이용하여 기능을 수행한다. ② public ..
[C++] <random> 라이브러리 (난수 생성) C 스타일의 난수 생성의 문제점 아래는 C 스타일로 0부터 99까지의 난수를 생성하는 코드이다. #include #include #include int main(){ srand(time(NULL)); for(int i = 0; i < 5; i++){ print("난수 : %d \n", rand() % 100); } return 0; } 위 코드는 진짜 난수를 생성하는 것이 아니라 마치 난수처럼 보이는 의사 난수(pseudo random number)을 생성하는 코드이다. 첫 번째 수만 무작위로 정하고, 나머지 수들은 그 수를 기반으로 여러가지 수학적 방법을 통해서 난수처럼 보이지만 실제로는 무작위로 생성된 것이 아닌 수열들을 만들어내게 된다. 무작위로 정해진 첫 번째 수를 시드(seed)라고 부르는데, ..
[C++] <string> 라이브러리 C++에서 문자열을 다룰 수 있는 두 가지 방법 - C-string C언어에서 사용해오던 문자열로, '/0'으로 끝나는 char 타입의 배열을 취급하는 방법이다. char s[100]; scanf("%s", s); - string 클래스 C++ 표준 라이브러리에서 제공하는 클래스로 문자열의 끝에 '/0' 문자가 들어가지 않으며, 문자열의 크기를 동적으로 변경 가능하다. string str = ""; getline(cin, str); cout n; cin.ignore(); getline(cin, str); cin.ingore()가 입력 버퍼의 모든 내용을 제거해주어 getline()이 정상적으로 동작할 수 있다. string 클래스 생성 먼저 헤더 파일을 추가해주어야 한다. #include string을 ..
[C++] OOP - 생성자와 소멸자 생성자 생성자는 객체 생성 시 자동으로 호출되면서 객체를 초기화 해주는 함수이다. Date 클래스의 day 객체를 만들면 생성자 Day(int year, int month, int day)가 호출된다. 따라서 Date의 객체를 생성할 때 생성자의 인자 year, month, day에 각각 2011, 3, 1을 전달하며 객체를 생성하게 되는 것이다. Date day(2021, 7, 9); // 암시적 방법 (implicit) Date day = Date(2021, 7, 9); // 명시적 방법 (explicit) 함수를 호출하듯이 사용하는 것이 암시적 방법, 명시적으로 생성자를 호출한다는 것을 보여주는 것이 명시적 방법인데 많은 경우 암시적 방법으로 축약해서 쓸 수 있으므로 이를 선호하는 편이다. 디폴트 ..
[C++] 공용체, 열거체 공용체 (union) 공용체는 구조체와 달리 메모리를 공유한다. 공용체들의 각 멤버들의 시작 주소는 모두 동일하다. 가장 큰 멤버 변수의 크기로 메모리를 할당받아 같은 공간에 자리잡기 때문에 한 번에 하나의 멤버 변수만 사용할 수 있다. 따라서 메모리의 크기가 제한되어 있거나 메모리를 절약하고 싶을 때 유용하지만 하나의 데이터 사용 후 데이터를 변경할 경우 원래의 데이터를 잃어버린다는 단점이 존재한다. 위 그림의 union A의 경우 j의 값을 변경함으로써 i의 값을 변경할 수 있고 i의 값을 변경함으로써 j의 값을 변경할 수 있게 된다. 공용체 A의 멤버 변수 a에만 67이란 값을 저장하고 a, b, c를 출력하면 모두 각자 선언된 데이터 타입으로 변형되어 출력된다. 열거형 (Enum) 프로그래밍을 하..
[C++] 구조체 배열 원소의 타입은 모두 동일해야 한다. 하나의 배열에서 어떤 원소는 char이고 어떤 원소는 int 일 수 없다. C++에서는 배열로 해결하지 못하는 문제를 구조체를 이용하여 해결할 수 있다. 원소의 크기가 제각각인 배열을 만드는 것이다. 배열에서는 배열의 타입만으로 모든 원소의 타입을 알 수 있었지만 구조체는 그렇지 않기 때문에 정의할 때 모든 원소의 타입을 명시해 주어야 한다. struct 구조체이름 { 멤버들..예를 들면 char str[10]; int i; }; /* 마지막에 꼭 ;를 붙인다. */ Human이라는 이름의 구조체는 3개의 멤버(int age, int height, int weight)를 가지고 있다. main 함수 내에서 Human이라는 구조체의 구조체 변수 Psi를 정의하였다...
[C++] 동적 할당 프로그램이 실행되는 런타임동안 사용자가 직접 공간의 크기나 시점을 결정하여 힙 영역의 메모리를 할당 받는것을 동적할당 이라고 한다. 사용자에 의해 메모리가 동적으로 할당이 되면 프로그램이 끝날 때 까지 유지되므로, 메모리 공간 사용이 끝나면 메모리 낭비(누수)를 줄이기 위해 명시적으로 메모리 할당을 해제 해주어야한다. 지금껏 사용하던 지역변수나 매개변수는 정적할당으로 스택영역에 메모리가 할당되어 왔는대 스택영역의 경우 메모리가 작은 크기로 제한되어 있기 때문에 그래픽 같이 용량이 큰 데이터를 저장할 경우 오버플로우의 발생으로 프로그램이 동작하지 않을 가능성이 크다. 따라서 동적할당을 이용하여 운영체제에서 관리하는 좀 더 큰 메모리 영역인 힙을 통해 정적할당의 단점을 극복 할 수있다. C 언어에서는 힙 상..
[C++] 참조자(레퍼런스) C언어에서 어떤 변수를 가리키고 싶을 때 반드시 포인터를 사용해야는데 C++에서는 다른 변수나 상수를 가리키는 방법으로 또 다른 방식을 제공한다. 이를 참조자(레퍼런스)라고 부른다. 참조자를 정의하는 방법은, 가리키고자 하는 타입 뒤에 &를 붙이면 된다. int& another_a = a; 위처럼 int형 변수의 참조자를 만들고 싶을 때는 int&를, double의 참조자를 만들고 싶을 때는 double&로 하면 된다. 심지어 int* 와 같은 포인터 타입의 참조자를 만들려면 int*&로 쓰면 된다. 위와 같이 선언함으로써 another_a는 a의 참조자가 되었다. 즉, another_a는 a의 또 다른 이름이라고 컴파일러에게 알려주는 것이다. 따라서 another_a에 어떤 작업을 수행하든 사실상 a에..