본문 바로가기
C/C++

C++ (14주) [템플릿 , STL , friend , 예외처리]

by DeathStar183 2022. 10. 27.

저번주에 보고 간 내용

● 상속 심화

● 바인딩

● 오버로딩과 오버리딩

● 정적 멤버변수

● 가상 함수 ( virtual function static ) , 순수 가상함수

 

이번주에 보고 갈 내용

● 템플릿 (템플릿 함수 , 템플릿 클래스)

● STL(Standard Template Library)

● friend함수

● friend클래스

● 예외처리

 

 

함수 중첩만 하지 말고, 형의 종류도 중첩이 가능하게 해보자!

기존 10주차에서는 함수 중첩만 가능하게 했지만, 템플릿을 이용하면 형의 종류도 중첩이 가능합니다.

 

 

템플릿 : 포괄적 함수 (genetic function)

● 템플릿은 인자(매개변수)를 통한 다형성을 제공한다.

● 함수 중첩은 기능이 같은 함수들을 같은 이름으로 사용할 수 있도록 한다.

● 함수의 매개변수의 형과 수로 구분이 되고, 코드 자체도 다르게 구성될 수 있다.

● 그러나, 코드는 전혀 바뀌지 않고 형만 다른 함수를 필요로 한다면 템플릿을 사용하는 것이 좋다.

● 이는 값 뿐만 아니라 형을 인자로 받는 함수로서 인자로 받은 형에 대하여 함수를 생성시키는

   포괄적 함수(generic function)이다.

 

 

 

템플릿 구현 방식

 

 

 

14-1. 템플릿 구현 1

 

 

 

 

14-2. 템플릿 구현 2

컴파일러가 템플릿 함수를 처리할때 여러개의 함수 코드를 미리 만듭니다.

개발자가 만들어서 (코딩)해서 사용해야할것을 컴파일러가 직접 만드는것이죠.

템플릿을 사용하더라도 내부적으로 존재하는 함수 코드는 줄어들지 않게 됩니다.

 

 

reference

● C++에서만 가능

● 참조자를 사용하려면 파일명이 .cpp이어야 함

A reference is an alternative name for an object (Bjarne Stroustrup).

● 변수의 별명

● int & rx = x;

● rx는 x를 참조하도록 초기화된 정수형 참조자

● 참조자(rx)에 변화를 주면 그 타켓(x)도 변함

 

ex. 참조자 예시

 

 

call by reference

● 형식매개변수가 변하면 실매개변수(a)도 변하게 하려면 주소 연산자와 포인터를 이용하여

call by reference로 구현해야 함

 

● 실매개변수의 주소로 함수를 호출

● up(&a);

 

● 형식매개변수 pa는 주소를 저장해야 하므로 포인터로 선언

● int *pa

 

● up 함수 내부에서 포인터 연산(*pa) 을 통해 main함수의 a값 변경

 

 

● 실매개변수의 주소를 형식매개변수로 전달

● 함수 호출할 때

● swap(&a, &b)

 

● 실매개변수는 변수의 주소를 전달

● 함수 정의 시

● swap(int *pa, int *pb)

 

● 형식매개변수는 주소를 받아야 하므로 포인터변수로 받음

● 형식매개변수가 변하면 실매개변수도 변함

● return 값이 여러 개이거나 배열 전체를 전달하는 경우 사용

 

 

 

14-3. 같은 형의 두 매개변수 값을 교환하는 포괄적 함수 구현

 

 

 

14-4. 템플릿으로 간결하게 변환하기

변환 전

변환 후

private 변수의 형이 각각 다른 3가지 객체형을 선언하고,

세 경우 컴파일러는 객체가 적절히 생성되도록 적합한 데이터와 함수를 자동적으로 생성한다.

 

 

 

STL (Standard Template Library)

● C++ 표준라이브러리의 일부분

● 자료구조 클래스와 알고리즘 등을 미리 만들어 놓은 라이브러리

● 반복자(iterator)를 가지고 동작하는 C++ 표준 라이브러리의 일부분

● 자주 사용되는 50여 개의 알고리즘과 다양한 자료구조들을 가지고 있음

 

↓ 참고용 사이트 ↓ 

http://blog.daum.net/coolprogramming/76

http://blog.daum.net/coolprogramming/93

 

 

주요 구성 요소

●컨테이너(container)

● 객체들을 저장하는 객체나 클래스

● vector, list, deque, string, map 등

 

● 반복자(iterator)

● 컨테이너에 저장된 요소를 순회하고 접근하는 객체나 클래스

 

● 알고리즘(algorithm)

● 데이터를 다루기 위한 함수

● find, sort, search 등

 

● 함수 객체(function object), 함수자(functor)

● 함수처럼 동작하는 객체로 operator() 연산자를 중첩한 클래스의 객체

 

 

 

컨테이너 내부 구성 요소

 객체들을 저장하는 객체나 클래스

 시퀀스 컨테이너(sequence container)

 vector, deque, list

 

 연관 컨테이너(associative container)

 set, multiset, map, multimap

 

 연속 메모리 기반 (contiquous-memory) 컨테이너

 데이터 여러개가 하나의 메모리 단위에 저장

 배열 기반 컨테이너(array-based container)

 vector, string, deque

 

 노드 기반(node-based) 컨테이너

 데이터 하나를 하나의 메모리 단위에 저장

 list, set, multiset, map, multimap

 

ex. vector , iterator , algorithm , functor container  

 

 

friend 함수와 friend 클래스

● 클래스 내부의 멤버변수는 대부분 private으로 지정되어 외부에 대하여 감추어져 있다.

● 그러나 이러한 규칙을 깨고 특별히 외부에서 멤버변수들을 접근할 수 있도록 허용한 것이

   friend함수와 friend클래스이다.

 

● 이는 비 객체지향적인 특징이지만 효율적인 프로그래밍을 위해 사용된다.

● operator overloading시 사용(고급 문법)

 

● friend는 상대 함수나 클래스를 친구로 선언하여, 해당 클래스의 멤버함수는 아니지만 클래스의 멤버를 자유롭게 사용할 수 있게 하는 함수이다.

 

● 클래스 A에서 클래스(함수) B를 friend로 지정한 경우 클래스(함수) B는 클래스 A에 마음대로 접근할 수 있지만 A는 B에 접근할 수 없다.

 

● 클래스(함수) B는 클래스 A를 friend로 하지 않았기 때문이다.

 

 

설정 방식

class 클래스명{

① friend 리턴형 함수명(매개변수 리스트);         ① 전역(외부)함수를 friend함수로 지정

② friend 리턴형 클래스명::함수명(매개변수리스트); };         ② 다른 클래스의 멤버함수를 friend함수로 지정

 

 

 

 

14-5. friend 함수

 

 

 

14-6. friend 함수 사용 예시 1

 

 

 

14-7. friend 함수 사용 예시 2

Com함수를 Dog 클래스의 멤버로 만들고, 이를 Cat클래스에서는 friend함수로 지정한다.

 

 

 

14-8. friend 클래스 사용 예시

 

 

 

예외처리 (exception handling, error handling)

● 에러(error)

■ 컴파일 에러 / 실행타임 에러(Run time error)

 

● 예외(오류) 처리

■ 실행 시간에 발생할 수 있는 오류 처리

 

● 코드에서 오류가 자주 발생하는 부분

■ 메모리를 할당했는데 메모리를 할당할 수 없는 경우

■ 포인터로 값을 출력하려 하는데 NULL포인터인 경우

■ 파일 열기

■ 소켓 통신

■ 프린팅

■ 사용자 입력

■ 그 외 여러가지

 

● 오류처리 방법

■ 무방비

■ 오류 발생을 알리고 종료

■ 오류 발생을 알리고 종료/저장 물어 봄

■ 코드에서 알아서 오류를 잡아내고 해결한 다음 정상적으로 프로그램 진행

 

예외 처리 방법

■ 오류가 발생할 가능성이 있는 코드에 대해 발생할 수 있는 모든 오류의 처리를 미리 해 둔다.

→ 발생할 수 있는 오류를 생각한다.

→ 처리 코드를 만든다.

 

■ 여러가지 오류가 발생할 가능성이 있다면 각각의 오류에 대해 처리하는 코드를 만든다.

■ 오류가 발생한 순간 바로 오류처리 코드로 이동할 수 있도록 한다.

 

 

예외처리 관련 키워드

C++에서는 예외처리라는 내장된 오류처리 기법을 제공한다.

이를 이용하여 보다 쉽게 실행 오류에 대처할 수 있다.

예외처리를 위한 키워드는 try, catch, throw로 다음과 같다.

예외 처리 형식

 

● 하나 이상의 catch문장이 try문과 관련될 수 있다.

어떤 catch 문장이 사용될 것인지는 예외값의 형에 따라 결정된다.

catch에 명시된 자료형이 예외의 자료형과 일치한다면, 해당 catch 문장이 실행되며 다른 catch 문장들은 무시한다.

 

 

14-9. 예외처리 사용 예시

분모에 0을 입력하더라도, "0으로 나눌수 없음"을 출력하고 프로그램을 정상적으로 종료함.

(이 사진에선 void 함수로 가려져 있어서 안보이는데 실제론 이렇습니다.)

 

해당 내용은 인덕대학교 2021년도 2학기 C프로그래밍 한성현 교수님 강좌에서 발췌한 내용입니다.

강좌 내용을 원저작자 허락없이 무단 이용시, 처벌의 대상이 될수 있습니다.

'C > C++' 카테고리의 다른 글

C++ (16주) 잡담  (0) 2022.11.02
C++ (15주) [ 콘솔 / 파일 입출력 ]  (2) 2022.11.02
C++ (13주) [상속 2 , 가상 함수]  (0) 2022.10.19
C++ (12주) [상속 1]  (0) 2022.10.15
C++ (11주) [연산자 중첩]  (0) 2022.10.07

댓글