cpp

[ C++] 예외 처리(exception handling)
·
Language/C & C++
오류 오류에는 다양한 종류가 있다. 컴파일 과정에서 문법에 맞지 않아 오류가 발생할 수도 있고, 코드 작성 과정에서 개발자의 실수로 개발자의 의도와 다르게 작동하는 오류도 있다. 혹은 논리적 오류로 인해 개발자가 예상한 범위에서는 정상적으로 작동하지만 특정 상황에서 오류가 발생하는 경우도 있다.컴파일 오류나 개발자의 의도와 다르게 작동하는 오류의 경우는 따로 수정이 필요하지만, 개발자가 예상한 범위에서는 정상 작동하는 코드의 경우 개발자가 의도한 범위 안에서만 동작하도록 하고 그 외 부분은 예외처리하여 코드를 사용할 수도 있다.예를 들어 거듭제곱을 계산하는 power라는 함수를 만들었다고 해보자. 근데 이 거듭제곱을 계산하는 함수는 정수에 대한 양의 정수 제곱밖에 계산하지 못한다면 실수의 거듭제곱 혹은 ..
[C++] 파일 입출력 스트림(file I/O stream) 및 파일 포인터(file pointer)
·
Language/C & C++
파일 종류 파일은 텍스트 파일과 바이너리 파일로 나뉜다. 텍스트 파일은 문자 데이터로 구성된 파일로, 사람들이 사용하는 글자 혹은 문자들만 포함된다. 각 문자는 ASCII 코드나 유니코드로 저장되며, 일반적으로 텍스트 편집기를 사용해 읽고 수정할 수 있고, 대표적인 예로 txt 파일이 있다. 반면, 바이너리 파일은 텍스트로 표현되지 않는 바이너리 데이터를 포함하며, 특정 프로그램만이 이 데이터를 해석할 수 있고, 이미지, 오디오, 실행 파일 등이 바이너리 파일의 대표적 예이다. 바이너리 파일은 각 바이트의 의미가 응용 프로그램에 의해 정의된다.참고로 어느 파일이든 파일의 끝을 읽으면 EOF, 즉 -1을 반환한다. 파일 입출력 스트림 (File I/O Stream) 파일 입출력 스트림은 파일을 프로그램과 ..
[C++] 포맷 플래그(format flag) 및 조작자(manipulator)
·
Language/C & C++
포맷 플래그 포맷 플래그는 C++에서 입출력 형식을 지정하기 위한 플래그이다. C에서는 printf() 와 함께 다양한 형식 지정자 및 플래그를 사용하여 입출력 형식을 지정하였지만 C++에서는 입출력 스트림을 이용하여 입출력을 제어하고, 이때 std::cin 혹은 std::out 이 사용되기 때문에 C와 다른 방식으로 입출력 형식을 지정해주어야 한다.플래그값의미ios::skipws$\rm 0x0001$입력 스트림에서 공백 문자(Space, Tap, Enter) 무시ios::unitbuf$\rm 0x0002$출력 스트림에 들어오는 데이터를 버퍼링하지 않고 바로 출력ios::uppercase$\rm 0x0004$16진수 표현의 알파벳을 대문자로 출력ios::showbase$\rm 0x0008$16진수는 $\..
[C++] 입출력 스트림(I/O stream) 및 버퍼(buffer)
·
Language/C & C++
스트림 및 버퍼 스트림은 입출력 및 에러 전달 과정 등 데이터의 흐름을 추상화한 개념이다. 구체적으로는 이 흐름을 구성하는 일련의 데이터 요소를 말한다. C++에서는 특히 표준 입력, 표준 출력, 표준 에러 스트림이 존재하고, 입력은 키보드와 같은 입력 장치에서 데이터를 받아 프로그램으로 전달하며, 출력과 에러는 프로그램에서 생성된 데이터를 출력 장치, 예를 들어 디스플레이로 전달한다.입출력 스트림에는 버퍼가 사용되는 경우가 많은데, 일시적으로 데이터들을 저장하는 곳이라 보면 된다. 데이터를 입력받은 그 즉시 전달하는 것이 아니라 일정 수준, 혹은 전달하는 특정한 입력이 있을 때까지 버퍼에 저장해두었다가 전달하는 것이다. 예를 들어서 std::cin 은 사용자가 공백문자나 개행문자를 입력하기 전까지 버퍼..
[C++] 람다(lambda) 표현식
·
Language/C & C++
람다 표현식 익명의 함수를 만드는 기능으로 C++11에서 도입되었다. 코드 내에서 간결하게 함수를 정의하고 사용할 수 있도록 도와준다. 특히 std::function이나 STL의 다양한 알고리즘 함수에 인라인으로 사용할 때 유용하다. 람다 표현식 혹은 람다식이라 한다.기본 문법은 아래와 같다.[capture](parameter) -> return_type { body };캡처 리스트에는 람다식에 사용하고자 하는 함수 바깥 변수 목록이고, 매개변수 리스트, 리턴타입, 함수 바디는 기본적인 함수와 동일하게 사용하면 된다. 이때 -> return_type은 생략 가능하다.람다식을 사용할 때 역시 일반적인 함수와 마찬가지로 소괄호를 이용하여 매개변수를 전달해주면 된다.캡처 리스트는 [=]을 통해 모든 외부 변수..
[C++] auto 키워드
·
Language/C & C++
auto C++11부터 선언 초기화 식에서 추론되는 형식으로 변수를 선언하는 역할을 한다. C++11 이전까지는 스택에 할당되는 지역 변수를 선언하는 키워드였다. 따라서 C++ 버전에 따라 달리 동작할 수 있으니 주의해야 한다.복잡한 변수 선언을 간소하게 하고, 이름이 긴 자료형이나 헷갈릴 수 있는 자료형을 선언할 때 실수를 줄일 수 있다는 장점이 있다.예를 들어 아래와 같은 코드가 있다고 가정하자.#include using namespace std;class ClassNameThatIsUnnecessarilyLong { ...}int main() { ClassNameThatIsUnnecessarilyLong temp; ClassNameThatIsUnnecessarilyLong* ptem..
[C++] 표준 템플릿 라이브러리(STL)
·
Language/C & C++
STL STL(Standard Template Library)은 C++에서 제공하는 표준 템플릿 라이브러리로, 다양한 자료구조와 알고리즘을 템플릿 형태로 제공한다.STL은 효율적이고 재사용 가능한 코드를 작성할 수 있도록 돕는 강력한 라이브러리로, 크게 컨테이너, 반복자(iterator), 알고리즘의 세 가지 주요 구성 요소로 이루어져 있다. STL container • vector#include 벡터는 가변 크기의 배열을 일반화한 클래스로 다양한 자료형을 담을 수 있다. 원소의 저장, 삭제, 검색 등 다양한 멤버 함수를 지원하며 인덱스를 통해 접근 가능하다. 아래와 같이 선언하여 사용한다.vector vector_name;주요 멤버 함수는 다음과 같다.push_back(element)벡터 마지막에 el..
[C++] 템플릿(template)을 통한 일반화(generic)
·
Language/C & C++
함수 템플릿 어떤 함수를 중복 함수로 구현할 때 매개변수의 자료형이 int, double 형으로만 구분된다면, 동일한 코드 작성이 불가능하다. int, double 형으로만 예를 들었지만, 다양한 경우 함수 동작이 자료형과 관계없이 동작하는데 자료형 때문에 중복 함수로 구현이 불가능한 경우가 있다. 이때 템플릿을 사용하여 자료형을 일반화시켜 함수를 구현할 수 있다.예를 들어 아래와 같은 두 함수가 있다고 가정하자.void print(int a) { cout 간단한 코드이지만 매개변수로 받을 때 int 인지 double 인지 구분 불가능하기 때문에 중복해서 사용할 수 없는 함수들이다.이때 template 키워드를 이용하여 자료형을 일반화시켜 아래와 같이 함수를 일반화시킬 수 있다. 이를 제네릭 함수라..
[C++] virtual 키워드를 활용한 함수 오버라이딩 및 추상 클래스
·
Language/C & C++
함수 오버라이딩 (Function Overriding) 파생 클래스에서 기반 클래스의 함수와 동일한 이름의 함수를 정의하고 사용해야 할 수 있다. 이때 기반 클래스의 함수가 호출되면 의도한 함수가 아니라 다른 함수가 호출되는 것이므로 문제가 발생할 수 있고, 이를 방지해야 한다.예를 들어 아래와 같은 코드가 있다고 가정하자.#include using namespace std;class Base {public: void f() { cout f(); return 0;}출력은 다음과 같다.DerivedBase업캐스팅을 진행하면서 기반 클래스를 가리키게 되므로 업캐스팅된 포인터가 멤버 함수 호출시 기반 클래스의 멤버 함수가 호출되었다.그런데 앞서 언급한 것과 같이 업캐스팅을 하더라도 파생..
[C++] 업캐스팅(upcasting) 및 다운캐스팅(downcasting)
·
Language/C & C++
업캐스팅 업캐스팅은 기반 클래스 포인터로 파생 클래스의 객체를 가리키는 것을 말한다.예를 들어 기반 클래스와 파생 클래스가 아래와 같다고 가정하자.class Base {public: int data;};class Derived : public Base {public: string name;};이때 다음과 같이 업캐스팅을 해줄 수 있다.Base* b;Derived d;b = &d;혹은 간단하게 아래와 같이 사용하는 것도 가능하다.Base* b = new Derived();그냥 파생 클래스의 포인터를 사용하지 않고 기반 클래스로 업캐스팅해서 사용하는 것은 기반 클래스를 이용하는 파생 클래스가 다양한 경우 이 다양한 파생 클래스들을 업캐스팅을 통해 단일한 자료형으로 다룰 수 있기 때문이다.이렇게 단..
애스터로이드
'cpp' 태그의 글 목록