본문 바로가기

서적 정리/C++ 기초 플러스31

22.for 루프 C++의 for 루프를 사용하면 반복 작업을 쉽게 처리할 수 있다. int main() { for (int i = 0; i 조건 검사 -> 루프 몸체 -> ... 조건 검사에서 false가 나올 때 까지 반복이다. 갱신 크기 변경 for 루프의 예제로 지금까지 매 주기마다 1씩 증가시키고 있다. 그러나 갱신 표현식을 변경하면 갱신되는 크기를 바꿀 수 있다. int main() { using namespace std; int by; cin >> by; cout 2022. 9. 13.
21.배열의 대안 배열은 다소 불편한 점이 있다. 원소가 얼마나 필요한지 알 수 가 없는데, 크기를 미리 지정해야 하니 넉넉하게 잡을 수 밖에 없다. 실제로 10개만 사용하는데, 넉넉잡아 50개로 잡았다면 40만큼의 메모리는 낭비하는 것이다. 이에 대한 대안이 있다. Vector 템플릿 클래스 vector 템플릿은 동적 배열에 속하는 string 클래스와 유사하다. 프로그램이 실행되는 동안 vector 객체의 크기를 설정할 수 있고, 새로운 데이터를 마지막에 추가하거나 중간에 데이터를 삽입할 수 있다. 기본적으로 동적 배열을 생성하기 위에 new를 사용하는 것을 대체할 수 있다. 실제로 vector 클래스는 메모리를 관리하기 위해서 new와 delete를 자동으로 사용한다. vector의 기본형은 아래와 같다. std::.. 2022. 8. 9.
20.변수형의 조합 배열, 구조체, 포인터를 조합하여 사용할 수 있다. struct YearsEnd { int year; int end; }; 위 구조체가 있을 때 아래와 같이 생성할 수 있다. 또한 도트 연산자를 사용하여 멤버에 접근할 수 있다. YearsEnd s01, s02, s03; s01.year = 1998; s01.end = 2007; 이러한 구조체에 대한 포인터를 생성할 수 있다. YearsEnd* pa = &s02; 포인터가 유효한 주소를 가리킬 경우, 화살표 연산자를 사용하여 멤버에 접근할 수 있다. pa->year = 1999; 구조체들의 배열을 생성할 수 있다. 또한 도트 연산자를 사용하여 원소의 멤버에 접근할 수 있다. YearsEnd trio[3]; trio[0].year = 2003; trio는 .. 2022. 8. 9.
19.포인터, 배열, 포인터 연산 배열의 이름은 포인터와 비슷한 의미를 갖는다. 완벽히 같다고는 말하지 못해도 맥락은 같다고 할 수 있다. 배열의 이름은 배열의 시작 주소, 첫 번째 원소의 주소를 의미한다. 정수형 변수에 1을 더하면 값이 1만큼 증가한다. 하지만 포인터 변수에 1을 더하면 값이 포인터가 지시하는 데이터형의 byte 만큼 증가한다. 예를 들어 int형이 4byte인 환경에서 int형 포인터에 1을 더하면 8이 증가한다. int main() { using namespace std; int a[3] = { 1,2,3 }; int* b = a; cout 2022. 8. 9.
18.포인터와 메모리 해제 C의 꽃은 포인터라고 한다. 포인터가 이해가 안 될 땐 이걸 왜 사용해야 하는지도 몰랐으나, 현재는 포인터 없이 어떻게 개발하는거지 란 생각이 든다. 포인터는 값 자체가 아니라 값의 주소를 저장하는 변수이다. 포인터는 별표(*)를 사용한다. 포인터가 값의 주소를 나타낸다면, 변수의 주소는 어떻게 알 수 있을까? 답은 주소 연산자(&)를 변수 앞에 붙이면 된다. 주소 연산자는 레퍼런스(reference)라고도 부른다. 교과서적인 포인터는 아래와 같다. int main() { using namespace std; int a = 5; int* b = &a; cout 2022. 8. 3.
17.열거체(enumeration) 열거형(enum)은 const를 사용하여 기호 상수를 만드는 것에 대한 다른 방식이다. 또한 제한적이지만 새로운 데이터형을 정의할 수 있다. enum Color {Red, Green, Blue}; 이때, enum형 변수를 열거체(enumeration)이라 부르고, enum의 원소를 열거자(enumerator)라 부른다. 기본적으로 첫 번째 열거자는 0이 대입되고, 두 번째 열거자에 1이 대입되는 방식으로 정수값들이 차례로 대입된다. 다만, 열거자에 정수값을 명시적으로 대입할 수 있다. enum Color {Red = 5, Green, Blue = 10}; //Red = 5, Green = 6, Blue = 10 열거체 변수에는 사용된 열거자 값들만 대입할 수 있다. Color col; col = Colo.. 2022. 8. 3.
16.공용체(union) 공용체(union)는 서로 다른 데이터형을 한 번에 한 가지만 보관할 수 있는 데이터 형식이다. 즉, 구조체나 클래스는 int형과 long형, double형을 같이 보관할 수 있지만, 공용체는 멤버들 중 한 번에 어느 하나만 보관할 수 있다. union One4all { int int_val; long long_val; double double_val; }; int main() { using namespace std; One4all o4a; o4a.int_val = 15; //int형으로 저장 cout 2022. 8. 3.
15.구조체(struct) 한 사람에 관련된 이름, 주소, 나이, 번호 등 정보를 저장해야 할 때, 어떻게 저장할 것인가? 클래스를 떠올릴 수 있지만, 구조체를 사용할 수도 있다. 구조체는 사용자가 정의할 수 있는 데이터형이다. struct Information { char name[20]; char address[30]; int age; int number; }; 클래스와의 차이점 기본적으로 클래스와 구조체는 같다고 봐도 무방하다. 클래스가 갖고 있는 기능 모두 사용할 수 있으며, 구조체라는 객체 안에 멤버 변수나 함수, 생성자 등을 선언할 수 있다. 다만, 소소한 차이점은 존재한다. 명시적인 struct와 class 키워드 차이점 접근제어 지시자를 선언하지 않았을 때, class는 private이고 struct는 public이.. 2022. 8. 3.
14.string 클래스 string 클래스는 문자열을 저장하는 데 문자 배열을 사용한 대신에 간편하게 상요할 수 있는 데이터형이다. char의 배열과 가장 큰 차이점은 string은 단순한 변수로 선언한다는 점이다. 또한, 문자열의 크기를 자동으로 조절한다. 즉, 크기가 동적으로 확장/축소하는 문자 배열의 변수라고 생각할 수 있다. C++11 문자열 초기화 C++11에서 string의 초기화하는 법은 다양하다. std::string str1 = "minju"; std::string str2 = { "minju" }; std::는 using 선언을 통해 생략할 수 있다. 대입, 결합, 추가 string 객체를 다르 string 객체에 간단하게 대입할 수 있다. std::string str1 = "minju"; std::strin.. 2022. 7. 29.