c++ 고급 기능

김성진·2024년 1월 30일

1월 30일 수업 정리

객체지향 프로그래밍의 4대원리

c++로 프로그래밍을 처음 배운다면 이것부터 설명을 들을수도 있다.
객체지향 프로그래밍은 다음과 같은 4가지 원리를 주로 한다.

캡슐화

데이터와 기능을 하나의 객체라는 캡슐로 묶어서 사용하는 것을 뜻한다.
객체의 구조를 완벽히 이해하지 않고도, 기능만 알면 누구나 사용할 수 있도록 하는것이다.자동차로도 비유 가능한데, 자동차 내부의 구조를 알지 못하는 사람도 운전법만 알면 운전을 할 수 있는것과 같은 이치다.

상속성

부모 클래스의 멤버를 자식 클래스에서도 사용할 수 있는것을 말한다.
코드를 한번만 선언하고도 자식 클래스가 코드 재사용을 할 수 있다.

다형성

한 클래스가 다양한 형태로 변할 수 있는 것을 말한다.
부모 클래스가 포인터로 자식 클래스의 객체를 가리킬 수 있다는 점이 중요하다.

추상화

추상 클래스를 만들고 파생 클래스에서 구현하는것을 의미한다.
실제적인 무언가를 만들지 않고 설계도의 역할만을 하는 추상 클래스의 존재가 특징적이다.

다중 상속

한 클래스가 여러 클래스로부터 상속을 받는 경우, 부모가 여럿인 경우를 뜻한다.
여러 부모로부터 같은 이름의 멤버를 물려받을 경우, 그 멤버를 사용할 때마다 어느 부모에게서 받은건지 명시해놓아야 한다. 초기화도 따로따로 해주어야 한다.
다중 상속은 최대한 사용하지 않는것이 좋다.

템플릿

템플릿은 함수의 형식이다.
예를들어 int 의 배열을 받는 함수를 만들었을 때, int 이외의 자료형도 받는 함수를 만드려면 그 자료형에 맞는 오버로딩을 해야한다. 또한 연산자 오버로딩까지 자료형에 맞춰 일일히 하다보면 작업량이 끝이 없다. 따라서 템플릿으로 함수의 형태만 만들어두고 자료형은 가상의 타입으로 설정해두면 템플릿에 자료형을 입력했을 때 그 자료형을 가진 함수가 생성되는 것이다.
template 으로 선언하고
이후 자료형 대신 T를 사용한 함수를 작성해두면 되는것이다.
이런 템플릿은 함수의 형태를 띄지만 함수는 아니며, 헤더파일에만 만들어 둘 수 있다.

예외처리

파일을 열때나, 함수에 인수가 잘못 들어오는(대개 널포인터) 등의 일이 일어나면 런타임 에러가 난다. 이때 에러 대신 안전하게 프로그램을 종료시켜주는 것이 예외처리이다.
예외 처리는 try, throw, catch 의 3가지 키워드를 통해 작동한다.
try 는 예외처리를 하겠다는 선언,
throw는 예외처리할 변수 혹은 객체 지정,
catch는 예외처리될 변수나 객체를 받아 지정된 예외처리 내용 실행을 맡는다.

대표적인 예외처리인 수를 0으로 나누는 예외처리를 작성해보자.


#include <iostream>

int Divide(int lhs, int rhs)
{
	if (rhs == 0)
		throw std::invalid_argument("Divide Zero");
	return lhs / rhs;
}

int main()
{
	int input1 = 0;
	int input2 = 0;
	std::cin >> input1 >> input2;

	try
	{
		std::cout << Divide(input1, input2) << std::endl;

	}
	catch (const std::invalid_argument& e)
	{
		std::cout << e.what() << std::endl;
	}
	std::cout << "End" << std::endl;

	return 0;
}

예외처리는 권장되지 않는 기능이다. 예외처리가 반드시 필요할때만 사용하자.
예를들어 방금 작성한 이 코드도 0으로 나누지 못하게 하면 되지 0으로 나눠졌을때 예외처리를 하면 안되는 것이다.
게임을 실제로 개발하다보면 이런 상황이 올수 있다. 파일 입출력시 파일이 오염되거나(이름이나 경로가 바뀐다거나 파일자체가 손상), 물리적으로 디스크가 고장나거나, 통신이나 연결이 끊기거나 하는 경우는 프로그래머가 미리 제어할 수 없으니 이런 상황에 예외처리를 해주어야 하는 것이다.

예외처리의 주의할 점은 throw 이후에 구문은 읽지 않는다는 것이다.
따라서 동적할당 이후에 delete 이전에 예외처리가 실행되면, 해당 메모리를 delete 하려는 명령이 사라져서 접근할 수 없어지고 메모리 누수가 일어나는 식의 문제가 생긴다.

profile
듀얼리스트

0개의 댓글