야구 게임 완성과 탬플릿의 기초문법에 대한 수업을 들었다.
1. 야구 게임 (완성본)
- 달라진 부분만 첨부해 둠
int C_GAME::strikeCount() // 이거 private에 만듬
{
int arCount[(int)C_TABLE::E_TYPE::E_MAX]{};
for (int i = 0; i < m_nTableSize; i++)
{
arCount[(int)m_arTalbe[i].getResult(m_arUser[i])]++;
}
printf("strike : %d\n", arCount[(int)C_TABLE::E_TYPE::E_STRIKE]);
printf("ball : %d\n", arCount[(int)C_TABLE::E_TYPE::E_BALL]);
printf("out : %d\n", arCount[(int)C_TABLE::E_TYPE::E_OUT]);
return arCount[(int)C_TABLE::E_TYPE::E_STRIKE];
}
void C_GAME::run()
{
printf("답 : ");
for (int i = 0; i < m_nTableSize; i++)
{
printf("%d ", m_arResult[i]);
}
printf("\n");
do
{
printf("========================================\n");
while (!userInput())
{
printf("다시 입력하세요.\n");
}
} while (strikeCount() != m_nTableSize);
}
2. 탬플릿
2.1 정의
- 함수나 클래스를 개별적으로 다시 작성하지 않아도, 여러 자료형으로 사용할 수 있도록 설계된 틀이다.
- 함수 탬플릿, 클래스 탬플릿으로 나누어 진다.
간단히 일반 함수는 특정 자료형만 처리할 수 있지만, 템플릿은 자료형을 변수처럼 받아 다양한 자료형을 처리할 수 있다.
func<int>()
- 자료형 int를 받는다 이런 느낌이다.
- 즉, 템플릿을 사용하면 하나의 함수 또는 클래스를 여러 자료형에 대해 재사용할 수 있다.
2.2 예시
#include <iostream>
template<typename T>
T add(T t1, T t2);
int add(int n1, int n2);
int main()
{
printf("%d\n", add(10, 20));
printf("%d\n", add<int>(10, 20)); // FM
printf("%f\n", add(1.4f, 1.5f));
}
template<typename T>
T add<T>(T t1, T t2) // FM
{
return t1 + t2;
}
int add(int n1, int n2)
{
printf("int함수\n");
return 0;
}
- template<typename T>: 템플릿 구문으로, T는 자료형을 나타냅니다. typename과 class는 동일한 의미로 사용된다.
- add(10, 20): 이름이 같은 일반 함수와 템플릿 함수가 존재할 때, 컴파일러는 일반 함수를 우선적으로 호출한다.
- add<int>(10, 20): 템플릿을 명시적으로 호출하려면 <> 안에 자료형을 지정해야 한다.
- 템플릿은 컴파일 시점에 호출된 자료형에 맞는 함수를 생성하므로, 호출된 자료형만큼 메모리가 사용된다.
즉, 탬플릿의 생성 방식은 탬플릿의 네임 스페이스의 함수를 만들어 링크를 걸어 꽂는 형식
2.3 탬플릿을 사용하지 않는 이유
1. 코드 관리 문제
- 템플릿 함수는 선언과 정의를 같은 파일에 작성해야 한다.
- 만약 템플릿을 헤더 파일(.h)과 구현 파일(.cpp)로 분리하려 하면 컴파일러가 템플릿 구현을 찾을 수 없어 링크 에러가 발생한다
( 컴파일러에서 일반 함수를 먼저 검색하고 탬플릿을 검색함 -> 사용 요청을 했을때 만들어서 올릴때 링크를 건다 ) - 예제:
// add.h
#pragma once
//template<class T>
//T add(T t1, T t2);
// add.cpp
#include "add.h"
template<class T>
T add(T t1, T t2)
{
return t1 + t2;
}
// main.cpp
#include <iostream> // .h를 안쓴것은 전부 탬플릿으로 만든것들 , 막간의 지식 hpp -> 탬플릿 해더 파일, h + cpp
#include "add.h"
int main()
{
printf("%d ",add<int>(10, 20));
}
- 템플릿을 사용하려면 구현을 헤더 파일에 모두 작성해야 한다.
이는 코드의 모듈화를 어렵게 만들어 관리가 복잡해질 수 있다.
모든 자료형을 처리할 수 없음
- 템플릿은 특정 연산이 가능한 자료형만 가능하다.
예를 들어, + 연산자를 지원하지 않는 사용자 정의 자료형은 템플릿에서 사용할 수 없다.
사용 사례 제한
- 템플릿은 주로 자료구조에서 많이 사용됩니다. 사용자가 어떤 자료형을 사용할지 알 수 없기 때문에 자료형에 유연하게 대응해야 하는 상황에서 적합하다.
2.4 응용 예시
템플릿을 사용하여 배열의 크기에 따라 동적으로 처리할 수 있다.
#include <iostream>
// 래퍼런스에 배열 넣으면 상수 3 이 들어가서 이것 밖에 안됨 하지만 탬플릿은 고칠수있다
template<int nLength>
void print(const int(&arData)[nLength]);
//void print(const int(&arData)[3]);
int main()
{
int arData1[3]{ 3,2,1 };
int arData2[5]{ 5,4,3,2,1 };
print<3>(arData1); // 원래 FM
print<5>(arData2); // 원래 FM
}
template<int nLength>
void print(const int(&arData)[nLength])
{
for (int i = 0; i < nLength; i++)
{
printf("%d ", arData[i]);
}
printf("\n");
}
'C++' 카테고리의 다른 글
[강의] 12월 24일 수업정리 (0) | 2024.12.25 |
---|---|
[강의] 12월 23일 수업정리 (1) | 2024.12.23 |
[강의] 12월 19일 수업정리 (1) | 2024.12.19 |
[강의] 12월 18일 수업정리 (1) | 2024.12.18 |
[강의] 12월 17일 수업정리 (0) | 2024.12.17 |