모든자료는 한교수님 수업시간에 나왔습니다.
제네릭 프로그램이란? 자료형이 실행할떄 결정된다.<>꺽새 씀.
함수 중첩에서 여러자료형을 쓰지않고, 템플릿을 활용하여 소스를 고급지게 쓰는것이 가능하다
#include <iostream> // 입출력 스트림 라이브러리 포함
using std::cout; // cout을 std 네임스페이스에서 사용
using std::endl; // endl을 std 네임스페이스에서 사용
// 템플릿 함수 정의: T라는 형식 매개변수를 가지는 Max 함수
template <class T>
T Max(T i, T j) // 매개변수 i와 j는 T 타입
{
// i가 j보다 크면 i를 반환, 그렇지 않으면 j를 반환
return i > j ? i : j;
}
int main() // 프로그램의 시작점
{
// Max 함수 호출: 정수형 인자 (1, 2)
cout << "Max값은=" << Max(1, 2) << endl; // 결과: Max값은=2
// Max 함수 호출: 실수형 인자 (7.5, 3.6)
cout << "Max값은=" << Max(7.5, 3.6) << endl; // 결과: Max값은=7.5
// Max 함수 호출: 문자형 인자 ('A', 'B')
cout << "Max값은=" << Max('A', 'B'); // 결과: Max값은=B
return 0; // 프로그램 종료
}
템플릿은 실행도중에 자료형이 바뀌기떄문에 함수 호출하였을떄 유동적으로 알맞는 자료형이 실행된다.
using System;
public class GenericExample<T>
{
public T Max(T a, T b) {
return Comparer<T>.Default.Compare(a, b) > 0 ? a : b;
}
}
class Program
{
static void Main()
{
var intMax = new GenericExample<int>();
Console.WriteLine(intMax.Max(3, 7)); // 정수
var doubleMax = new GenericExample<double>();
Console.WriteLine(doubleMax.Max(3.5, 2.5)); // 실수
}
}
c#으로 만든 제네릭 프로그래밍 구현
#include <iostream>
template <typename T>
T Max(T a, T b) {
return a > b ? a : b;
}
int main() {
std::cout << Max(3, 7) << std::endl; // 정수
std::cout << Max(3.5, 2.5) << std::endl; // 실수
std::cout << Max('A', 'B') << std::endl; // 문자
return 0;
}
c++ 로 만듧
ublic class GenericExample<T> {
public T max(T a, T b) {
return (a.hashCode() > b.hashCode()) ? a : b;
}
public static void main(String[] args) {
GenericExample<Integer> intMax = new GenericExample<>();
System.out.println(intMax.max(3, 7)); // 정수
GenericExample<Double> doubleMax = new GenericExample<>();
System.out.println(doubleMax.max(3.5, 2.5)); // 실수
}
}
java로 만듦
제네릭 프로그램으로 만드시오- 포괄적인함수를 만드시오-> 시험문제에선 template을 구현하면된다. 시험에나옴.
클래스T(class T)=(typename T)가 같다.
시험문제에 나옴. class를 매번 써 주어야하고, class와 인자의 갯수가 같아야함.
챗gpt에게 주석달아달라고 해보았다.
1단계 template
2단계 CCC2,CC3지우고, T1,T2로 자료형 변경, CLASS CCC1을 CLAS CCC로 변경
3단계. ccc뒤에 다 뺴고, ccc로 맞추기, 출력하기전에 무슨자료형인지 써주어야 한다. (결정되지않은 자료형이 2개가있어서 먼저 정하고 해야한다.)
#include <iostream> // 입출력 스트림 라이브러리 포함
using std::cout; // cout을 std 네임스페이스에서 사용
using std::endl; // endl을 std 네임스페이스에서 사용
// 템플릿 클래스를 정의: T1과 T2라는 형식 매개변수를 가진 CCC 클래스
template <class T1, class T2>
class CCC {
T1 x; // T1 타입의 멤버 변수 x
T2 y; // T2 타입의 멤버 변수 y
public:
// 생성자: 두 개의 인자를 받아 x와 y에 초기화
CCC(T1 xx, T2 yy) {
x = xx; // x에 xx 값을 저장
y = yy; // y에 yy 값을 저장
}
// Print 메서드: x와 y의 값을 출력
void Print() {
cout << x << ',' << y << endl; // x와 y를 출력
}
};
int main() { // 프로그램의 시작점
// CCC 클래스의 인스턴스 c1을 생성: 두 개의 정수형 인자(10, 20)
CCC<int, int> c1(10, 20);
// CCC 클래스의 인스턴스 c2를 생성: 두 개의 실수형 인자(3.5, 5.5)
CCC<double, double> c2(3.5, 5.5);
// CCC 클래스의 인스턴스 c3을 생성: 문자형 인자('I')와 문자열("Love You!")
CCC<char, const char*> c3('I', "Love You!");
// c1의 Print 메서드 호출: x와 y의 값을 출력
c1.Print(); // 출력: 10, 20
// c2의 Print 메서드 호출: x와 y의 값을 출력
c2.Print(); // 출력: 3.5, 5.5
// c3의 Print 메서드 호출: x와 y의 값을 출력
c3.Print(); // 출력: I, Love You!
return 0; // 프로그램 종료
}
(챗gpt 주석설명)
다양한 자료구조와 해당하는stl 클래스를 표로 작성해달라고 해보았다.
vector이란 자동으로 늘어나는방인 배열이다.
벡터함수 시험문제에 나온다고함. 그냥 자료형만 바꾸고 값만 바꿔주면됨, push_back을 쓰면됨.(제일많이 사용)
프로그래밍후, 오류를 예상하고, 오류가 나지않게 하는 절차
1단계: 예외가 발생할 수 있는줄에 try{}블럭으로 묶는다.
2단계:예외값을 던지는 단계(throw쓰기)
3단계.(시험에 나옴)
x의 별명을 rx로 하고, rx가 바뀌면x가 바뀌고, x가 바뀌면 rx또한 바뀐다.
&를 쓰면, x의 별명으로 rx를 쓴다는 뜻이되서, rx가 바뀌면 x도 바뀌게 되어 값이 달라진것이다. (시험에 나올듯)참조자
슬라이드13-19페이지(시험범위)
시험에 나오는 4가지 문법.
iomanip 이라는 헤더파일을 포함시켜야 밑의것을 쓸 수있다.(시험에 나옴)
파일입출력.(시험에 나온다)
파일에 값을 저장하는 방법. hout은 아무거나 써도되는 함수명이다
파일을 열었으면 다시 닫아야 쓰레기값이 나오지 않는다.
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <iomanip>
struct Student {
std::string name;
int score;
};
void saveScores(const std::vector<Student>& students, const std::string& filename) {
std::ofstream outFile(filename);
if (!outFile) {
std::cerr << "파일을 열 수 없습니다: " << filename << std::endl;
return;
}
for (const auto& student : students) {
outFile << student.name << " " << student.score << std::endl;
}
outFile.close();
}
void loadScores(std::vector<Student>& students, const std::string& filename) {
std::ifstream inFile(filename);
if (!inFile) {
std::cerr << "파일을 열 수 없습니다: " << filename << std::endl;
return;
}
Student student;
while (inFile >> student.name >> student.score) {
students.push_back(student);
}
inFile.close();
}
void printScores(const std::vector<Student>& students) {
std::cout << std::setw(15) << "이름" << std::setw(10) << "성적" << std::endl;
std::cout << "------------------------" << std::endl;
for (const auto& student : students) {
std::cout << std::setw(15) << student.name << std::setw(10) << student.score << std::endl;
}
}
int main() {
std::vector<Student> students;
std::string filename = "scores.txt";
// 성적 입력
int numStudents;
std::cout << "학생 수를 입력하세요: ";
std::cin >> numStudents;
for (int i = 0; i < numStudents; ++i) {
Student student;
std::cout << "학생 이름: ";
std::cin >> student.name;
std::cout << "학생 성적: ";
std::cin >> student.score;
students.push_back(student);
}
// 성적 파일에 저장
saveScores(students, filename);
// 파일에서 성적 읽기
std::vector<Student> loadedStudents;
loadScores(loadedStudents, filename);
// 성적 출력
printScores(loadedStudents);
return 0;
}
(시험은 아닌데, 포트폴리오 만드는법:c++로 stl,파일입출력으로 성적처리 프로그램을 만들고싶어//이런식으로 챗gpt에게 알려달라고 하면된다.)