반응형

언어 자료구조 알고리즘/디딤돌 C++ 87

[C++] 57. 예외 처리(C언어 , C++, C# 예외처리 비교)

[C++] 57. 예외 처리 이번에는 C++에서 제공하는 예외 처리를 살펴보기로 해요. 먼저 예외가 무엇인지 알아볼게요. 에러, 버그, 예외는 모두 정상적으로 동작하지 않을 때 사용하는 말들입니다. 이들을 구분하자면 에러는 사용자가 잘못 사용하여 프로그램이 정상적으로 동작하지 않는 것입니다. 그리고 버그는 개발자가 프로그램 논리를 잘못 작성하여 발생하는 것이죠. 예외는 외부 시스템이나 조건들에 의해 더 이상 수행하는 작업을 수행하지 못하는 것을 말합니다. 예를 들어 데이터 베이스 서버를 이용하는 온라인 판매 서비스는 판매 기능을 수행하기 위해 데이터 베이스 서버에 접근할 수 있어야 합니다. 그런데 데이터 베이스 서버가 죽어있거나 방화벽으로 막혀있다면 정상적으로 진행할 수가 없습니다. 이러한 상황을 예외라..

[C++] 56. string 클래스 흉내내기2

이제 자신의 string 클래스의 멤버 메서드를 하나 하나 구현해 보기로 해요. 제일 먼저 생성자를 구현합시다. string::string(const char *buf) { 먼저 입력 인자가 0(널 포인터)일 때 빈 문자열을 보관할 버퍼를 생성해서 빈 문자열을 복사하세요. if(buf==0)//입력 인자가 0(널 포인터)일 때 { this->buf = new char[1];//크기가 1인 버퍼를 생성 strcpy_s(this->buf,1,""); //공백 문자를 대입 } 입력 인자가 0(널 포인터)가 아닐 때는 입력 문자열 길이를 구하여 버퍼를 생성하고 문자열을 복사하세요. else//입력 인자가 0(널 포인터)가 아닐 때 { int len_p1 = strlen(buf)+1; //입력 문자열의 길이 + ..

[C++] 55. string 클래스 흉내내기1

이번에는 연산자 중복 정의 문법으로 string 클래스와 비슷하게 사용할 수 있는 클래스를 만들어 보아요. 먼저 여기에서 구현할 범위를 정하기 위해 string 클래스를 사용하는 기본적인 사항을 확인하고 넘어갈게요. string 형식은 기본 생성 및 문자열을 입력 인자로 받는 생성을 할 수 있어요. string s; string s2="hello"; string 형식은 비교 연산(==, !=, >, >=,

[C++] 53. iostream 흉내내기

이번에는 cin과 cout으로 출력 및 입력할 때 쉬프트 연산을 사용하는 원리를 살펴보기 위해 iostream 클래스를 흉내내 보기로 할게요. 여기에서 설명하는 것은 원리를 살펴보기 위한 것이지 iostream 클래스의 내부를 정확하게 표현하기 위한 것이 아닙니다. 실제 iostream 클래스는 여기에서 설명하는 것보다 훨씬 정교하고 신뢰성있게 정의하고 있어요. C언어에서 printf 함수로 출력하거나 scanf 함수로 입력받을 때는 포멧 사용자를 사용했었죠. 하지만 C++에서 cin과 cout을 사용할 때는 포멧 사용자 없이 쉬프트 연산을 사용했어요. 어떠한 포멧으로 출력 혹은 입력해야 하는지 표현하지 않아도 알아서 입출력해 주었죠. 이러한 것이 가능한 이유는 클래스에 연산자 중복 정의를 해 주었기 때..

[C++] 52. 함수 개체

이번에는 함수 호출 연산자 중복 정의와 함수 개체를 알아보기로 해요. C++언어에서는 함수 호출 연산자를 중복정의 할 수 있습니다. 함수 호출 연산자의 연산 기호는 ( ) 입니다. 따라서 함수 호출 연산자를 중복 정의할 때 메서드 이름은 operator()입니다. 메서드 뒤에 입력 매개 변수 리스트를 열거하는 ()에는 개발자가 개수와 형식을 결정하고 반환 형식도 개발자가 정합니다. [반환형식] operator() ([입력 매개 변수 리스트]); 그리고 함수 호출 연산자를 중복 정의한 형식의 개체를 함수 개체라고 부릅니다. 함수 개체는 형식 내부에 함수 호출 연산자를 중복 정의하고 있어서 마치 함수처럼 호출하여 사용할 수 있습니다. 먼저 간단하게 함수 호출 연산자 중복 정의를 사용하여 함수 개체를 함수처럼..

[C++] 51. 묵시적 형 변환 연산자 중복 정의

이번에는 묵시적 형변환 연산자 중복 정의를 알아봅시다. C++언어에서 int 형식과 char 형식은 상호 묵시적 형 변환이 가능합니다. 이는 int 형식 변수에 char 형식을 대입하면 컴파일 내부에서 char 형식의 값을 int 형식의 값으로 묵시적 형 변환하여 대입하기 때문입니다.int a = 3;char c = 'a'; c = a; //묵시적 형변환에 의해 a를 char 형식의 값으로 변환 후 대입a = c; //묵시적 형변환에 의해 c를 int 형식의 값으로 변환 후 대입 C++언어에서는 개발자가 묵시적 형 변환 연산자를 중복 정의할 수 있습니다. 묵시적 형 변환 연산자를 중복 정의할 때는 operator 키워드 뒤에 형 변환할 형식 이름을 사용합니다. 그리고 리턴 형식은 개발자가 명시할 수 없습..

[C++] 50. 인덱스 연산자 중복 정의

이번에는 인덱스 연산자 중복 정의를 살펴보기로 해요. 배열과 같은 컬렉션은 인덱스 연산을 통해 원소에 접근할 수 있게 사용자 편의를 제공하곤 합니다. 배열의 인덱스 연산의 결과는 좌항에 올 수도 있기 때문에 연산 결과는 원소 자체를 의미합니다. 만약 정수 형식의 데이터를 원소로 하는 배열 클래스를 정의하고 인덱스 연산자를 중복 정의한다면 원소 자체를 반환하게 구현해야 하므로 다음과 같이 정의합니다. int &operator[](int index);//인덱스 연산자 중복 정의 다음은 인덱스 연산을 중복 정의하여 정수 형식의 데이터를 보관하는 DCArr 클래스를 정의하고 이를 사용한 예제 코드입니다. //DCArray #pragma once class DCArray { int *base; int bcapac..

[C++] 49. 대입 연산자 중복 정의

이번에는 대입 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 대입 연산자는 개발자가 정의하지 않으면 디폴트 대입 연산자가 동작합니다. 디폴트 대입 연산자는 디폴트 복사 생성자처럼 단순히 메모리 내용을 복사하는 얕은 복사를 진행합니다. 복사 생성자처럼 클래스 내부에 동적으로 생성한 다른 개체를 갖고 있을 때 깊은 복사를 하는 대입 연산자를 중복 정의할 필요가 있습니다. 깊은 복사와 얕은 복사는 복사 생성자 부분을 다시 살펴보기기 바랍니다. 여기에서는 복사 생성자에서 예를 들었던 동적 배열을 예로 들게요. 동적 배열은 생성할 때 보관할 원소의 최대 개수를 입력 인자로 받아 배열을 동적으로 생성하게 할 거예요. DCArray::DCArray(int _capa) { Init(); if(_capa) { ba..

[C++] 48. 증감 연산자 중복 정의

이번에는 증감 연산자 중복 정의를 하는 방법을 살펴보기로 할게요. 아시는 것처럼 증감 연산자는 단항 연산자로 전위에 올 때와 후위에 올 때 연산 결과가 다릅니다. 전위에 올 때는 값을 증감한 자기 자신이 연산 결과이고 후위에 올 때는 변경하기 전의 자신의 값입니다. 따라서 전위 증감 연산자의 반환 형식은 자기 자신을 전달하기 위해 클래스 형식 &를 사용합니다. 그리고 후위 증감 연산자의 반환 형식은 증감하기 전 자신의 값을 복사한 개체를 상수 값으로 반환하기 위해 const 클래스 형식을 사용합니다. C++에서 증감 연산자 중복 정의할 때 전위인지 후위인지 구분하기 위해 후위 증감 연산자 중복 정의할 때는 스텁 매개 변수를 추가로 받게 정의합니다. 다음은 Score 클래스에서 ++ 연산자를 전위와 후위로..

반응형