Computer Science
Generic Programming
8/1/2024

Generic Programming ìŽë?
Generic programming centers around the idea of abstracting from concrete, efficient algorithms to obtain generic algorithms that can be combined with different data representations to produce a wide variety of useful software.
ì ëëŠ íë¡ê·žëë°ìŽë 구첎ì ìž ìê³ ëŠ¬ìŠ, ë¡ì§, í¹ì íëì ìë¡ ë€ë¥ž ë°ìŽí° íì ì ëíŽ ì ì©íêž° ìíŽ íëì ìŒë°íë ìê³ ëŠ¬ìŠ, ë¡ì§, í¹ì íëìŒë¡ ì¶ìííë íë¡ê·žëë° ë°©ë²ì ëë€.

ìŽë ì¶ìíì í ë°©ë²ìŽêž°ì, ìíížìšìŽ ë¬žì 륌 ìŽë»ê² ì¶ìííê³ ì íëê°ì ë°ëŒ ê°ì ìœëëŒë ë€ë¥ž ë°©ë²ìŽ ì±íë ì ììµëë€. ë§ìœ Student, Lecturer, FacultyëŒë ê°ë ìŽ ìê³ , ìŽë€ìŽ ëªšë ë±ë¡ë ì ììŽìŒ íë€ë©Ž, ìŽë¥Œ ê°ì²Žë€ìŽ ê°ì žìŒí ìŒì¢ ì ê³ìœìŒë¡ ë³Žê³ êµ¬íì ê°ì íìë 잡멎ììë ìží°íìŽì€ë¥Œ ì¬ì©í ì ìì ê²ìŽë©°, ë±ë¡ ë¡ì§ì ëìŒíë ì¬ë¬ íì ì ë°ëë¡ íìë 잡멎ììë ì ëëŠ ë©ìë륌 ì¬ì©í ì ìì ê²ì ëë€.
Build process remind

ì°ëŠ¬ê° ìì±í ìì€ìœëë ë€ì곌 ê°ì 곌ì ì ê±°ì³ ìíë©ëë€.
- 컎íìŒ - ì¬ëìŽ ìœì ì ìë ìì€ìœë륌 êž°ê³ìŽë¡ ë³ííë 곌ì ì ëë€.
- ë§í¹ - 컎íìŒë íìŒë€ì ì®ìŽ íëì ì€íê°ë¥í íìŒë¡ ë§ëë 곌ì ì ëë€.
- ë¡ë© - ë§í¹ìŽ ìë£ë ì€íê°ë¥í íìŒì ë©ëªšëЬì ì ì¬íë 곌ì ì ëë€.
ìŽ ëì 컎íìŒê³Œ ë§í¹ 곌ì , ìŠ íëì ì€íê°ë¥í íìŒë¡ ë§ëë 곌ì ì ë¹ëëŒê³ ë¶ë¥Žêž°ë í©ëë€. ë¹ë ìêž°ë íë¡ê·žëšìŽ ìíì€ìŽ ìëë¯ë¡ 컎íìŒ íììŽëŒ ë¶ë¥Žë©°, ë¡ë© ìŽí íë¡ê·žëšìŽ ì€íì€ìž ìꞰ륌 ë°íììŽëŒ ë¶ëŠ ëë€.
c++ template
C++ìì ì ëëŠ íë¡ê·žëë°ì templateìŽëŒë ê°ë ìŒë¡ ëì ëììµëë€. íí c++ë¡ ìê³ ëŠ¬ìŠ ë¬žì 륌 íë ì¬ì©íë STLì Standard Template Libraryì ìœìë¡, ìŽë¬í ì ëëŠ íë¡ê·žëë°ì ê°ë ìŽ ì¬ì©ëììì ì ì ììµëë€. STLì ì¬ë¬ ì ë§ë€ìŽì§ ìë£êµ¬ì¡° íŽëì€ë¥Œ ì ê³µíê³ , ìŽë€ì ì¬ì©íë ìì ì íì ì ì§ì íì¬ ìŽë í íì ìŽë ìë£êµ¬ì¡°ë¥Œ ìŽì©í ì ìëë¡ í©ëë€.
// [ìœë 1] c++ template ìì
template <class T>
class Calculator
{
private:
T num1;
T num2;
public:
Calculator(T num1, T num2) {
this->num1 = num1;
this->num2 = num2;
}
T GetAdd() {
return num1 + num2;
}
};
int main()
{
// ìëë ìë°ììë 볌 ì ìë C++ë§ì ìì±ìì
ëë€.
Calculator<int> calcu1(10, 20);
cout << calcu1.GetAdd() << endl;
Calculator<double> calcu2(10.52, 20.24);
cout << calcu2.GetAdd() << endl;
}C++ììë í í늿ì ìì ê°ìŽ ì¬ì©í©ëë€. template <class T>ëŒë ìœë륌 íµíŽ ìŽ íŽëì€ê° ì ëëŠ íŽëì€ìì íííë©°, T ì ëëŠ íì ì íµíŽ íŽëì€ ëŽë¶ìì ìŒë°íë íì ì ì¬ì©í©ëë€.
íŽëì€ í í늿ì ì¬ì©íêž° ìíŽìë Calculator<int> calcu; ì ê°ìŽ íŽëì€ë¥Œ ìì±íë ìì ì íì ì ì§ì íŽì€ìŒ í©ëë€. ìŽí íŽë¹ íŽëì€ë íŽë¹ íì ë§ì ë°ê³ ë¡ì§ì ìííê² ë©ëë€.
Compile-time Type generalization

C++ ì templateì ë€ì곌 ê°ì í¹ì§ì ê°ìµëë€.
1. ì ìžê³Œ ì ìë ëë±ê·žë €ì íì§ë§, ì¬ì©ë ëë íì ì ì ìíì¬ ì¬ì©íŽìŒ íë€.
ë¡ì§ì ì¶ìííêž° ìíì¬ TëŒë ì ëëŠ íì ì ì¬ì©íì§ë§, ìŽ íŽëì€ê° ì€ì ë¡ ì¬ì©ëë ìì ììë íì ìŽ ì§ì ëìŽìŒ í©ëë€.
2. 컎íìŒ íì íšìí
C++ 컎íìŒë¬ë 컎íìŒíë ëì€ ì ëëŠ íŽëì€ê° ì¬ì©ë ê³³ì êž°ê³ìŽë¡ ë²ìí ë êž°ì ë íì ì ì²ëЬí ì ìë ì€íê°ë¥í ëª ë ¹ìŽ ë¬¶ìì ìì±í©ëë€. ìŽ ì€íê°ë¥í ëª ë ¹ìŽ ë¬¶ìì ì ëëŠ íŽëì€ì ë¡ì§ì êž°ì ë ë°ìŽí° íì ìŽ ì ì©ëìŽìë 몚ìµì ëë€. [ìœë 2]ìŽì ë 컎íìŒë¬ë¥Œ íµíŽ íŽë¹ íì ì ì²ëЬí ì ìë íŽëì€ê° ë§ë€ìŽì¡ìŒë¯ë¡ ìëì ì ëëŠ ìœëê° ìë ê³³ì ìŽ ìœë륌 ížì¶íëë¡ ì»ŽíìŒë©ëë€. ìŽë¬í ë¶íSpecializationì 컎íìŒ íìì ë°ìí©ëë€.
3. í í늿ì ì¬ì©ì íë¡ê·žëšì ëë €ì§ê² ë§ë€ì§ ìëë€.
ë¶íëë ìì ì 컎íìŒ íììŽë¯ë¡ ë°íìì ìê°ë³µì¡ëìë ìêŽìŽ ììµëë€. 컎íìŒ ìŽí ë°íììë TëŒë ìŒë°íë íì ì 볎ë íë¡ê·žëšì ê·ž ìŽëìë ëšì§ ìê³ ì€ì§ 구첎ì ìž íì ì ë°ë íŽëì€ë§ìŽ ëšìµëë€.
4. Code Explosion
ë§ìœ Calculator<int> ë¿ë§ ìëëŒ Calculator<double>, Calculator<MyClass> ë íë¡ê·žëš ëŽìì ì¬ì©ëë€ë©Ž ê°ê°ì íì ì ì²ëЬíë ìœëê° ìì±ë©ëë€. ë§ìœ type Tì ëìíë íì ìŽ ë§ì ê²œì° ê·žê² ê°ê°ì ëí íŽëì€ ìœëê° ìì±ë ê²ì ëë€. ìŽë ë¹ëë íìŒì í¬êž°ë¥Œ í¬ê² ë§ë€ ì ììŒë©°, 컎íìŒ íììŽ êžžìŽì§ê² ë§ëŠëë€. ìŽë¬í íìì Code ExplosionìŽëŒê³ ë¶ëŠ ëë€.
// [ìœë 2] 컎íìŒíìì ìì±ëë ì€íê°ë¥í ìœë ìì
// 컎íìŒë¬ë ëëµ ìŽë ê² ìꞎ ìœë륌 ìì±íë€. ìŽëë ìŒë°íë íì
ì 볎ë
// ëšì§ ìê³ , ì€ì§ 구첎ì ìž íì
ì ì²ëЬíë ìœëë§ìŽ ëšëë€.
class Calculator.int
{
private:
int num1;
int num2;
public:
Calculator(int num1, int num2) {
this->num1 = num1;
this->num2 = num2;
}
int GetAdd() {
return num1 + num2;
}
};ê²°êµ C++ì templateì íëì ë¡ì§ì ì¬ë¬ íì ìŒë¡ ì ê³µíêž° ìíŽ ê°ê°ì ìœë륌 ìì±íë ë°©ììŒë¡ 구íëììµëë€. ê·žë ë€ë©Ž Javaë ìŽëšê¹ì?
Java Generics
// [ìœë 3] Java Generics ìì
class Calculator<T>
{
private T num1;
private T num2;
public Calculator(T num1, T num2) {
this.num1 = num1;
this.num2 = num2;
}
public T getAdd() {
return num1 + num2;
}
};
class Main {
public static void main(String[] args) {
Calculator<Integer> calcuInt = new Calcu<>();
System.out.println(calcu.getAdd());
Calculator<Long> calcuDouble = new Calcu<>();
System.out.println(calcu.getAdd());
}
}Javaìì Generic Programmingì GenericìŽëŒë ê°ë ìŒë¡ ëì ëììµëë€. C++ ì§ìì STLìŽ ìë€ë©Ž Java ì§ììë CollectionìŽ ììŽì, ì¬ë¬ê°ì§ Collection íŽëì€ë¥Œ íµíŽ ìë¡ ë€ë¥ž íì ì ëí ìë£êµ¬ì¡°ë¥Œ ì¬ì©í ì ììµëë€.
Type Erasure
Javaì Genericì ë€ì곌 ê°ì í¹ì§ì ê°ìµëë€.
1. íì ìê±°
Calculator<Integer> ì êŽë šë ìœëë 컎íìŒíìì ê±°ì¹ê³ ë ìŽíì ë°ìŽë늬 ìœëììë Integerì êŽë šë ì 볎ë 몚ë ìì ëê³ , ëŽë¶ì ìŒë¡ë Object륌 ë€ë£šë ë°ìŽë늬 ìœëë¡ ë³ê²œë©ëë€. 몚ë ê°ì²Žì ì¡°ììž Objectë¡ ë°ìŽí°ë¥Œ ë€ë£šêž° ë묞ì 몚ë ë°ìŽí° íì ì íëì íŽëì€ë¥Œ íµíŽ ë€ë£° ì ììµëë€.
2. ìë íë³í
íì§ë§ 몚ë íì ì Objectë¡ ë°êŸžê² ëë€ë©Ž íì ì ìšì íê² ì¬ì©í ì ìì ê²ì ëë€. ë°ëŒì ìë° ì»ŽíìŒë¬ë ì ëëŠ ìì륌 꺌ëŽë ìœëì íì ìºì€í íë ìœë륌 ë£ìµëë€. ìŽë¥Œ íµíŽ ê°ë°ìë ëª ìì ìŒë¡ ìºì€í ì ìì±íì§ ììë ëë©°, íì ìì ì±ì 볎ì¥ë°ì ì ììµëë€.
Javaì Genericë c++ì template곌 ë§ì°¬ê°ì§ë¡ íëì ë¡ì§ë§ ìì±í멎 ì¬ë¬ê°ì ë°ìŽí° íì ì ì²ëЬí ì ìëë¡ ë§ë€ ì ììµëë€. íì§ë§ Javaì genericì ì¬ì©ëë íì ì ì²ëЬí ì ìë ìœë륌 ê°ê° ìì±íŽëŽë ë°©ììŽ ìëëë€. Object, í¹ì í¹ì íŽëì€ì íŽë¹íë ìœëë¡ ì¹ííì¬ ëìí ë¿ì ëë€.
ë°ëŒì Javaììë Code ExplosionìŽ ë°ìíì§ ììµëë€. Javaììë íëì ìœë(ëª ë ¹ìŽ ë¬¶ì)륌 ì¬íì©í©ëë€. ìŽë ë¶ëª í ì¥ì ìŽì§ë§ ëšì ìì 졎ì¬í©ëë€. c++ íë¡ê·žëšì ë°íììë ê°ê°ì ì ëëŠ íŽëì€ë ê·žê²ì ì²ëЬíë íì ì 볎륌 ê°ê³ ììŽì ìŽë¥Œ íµíŽ ëŠ¬íë ì ì ì¬ì©íì¬ í¹ìí ì²ëŠ¬ë¥Œ í ì ììµëë€. íì§ë§ Javaì ê²œì° ë°íìì ì ëëŠ íì ì 볎ë ì멞ëìŽ ì ì ìë€ë ëšì ì ê°ê³ ììµëë€.
Compile-time Polymorphism vs Run-time Polymorphism

Polymorphism â providing a single interface to entities of different types. Virtual functions provide dynamic (run-time) polymorphism through an interface provided by a base class. Overloaded functions and templates provide static (compile-time) polymorphism
ë€íì±ì íëì ìŽëŠì ê°ì§ ë©ìëë¡ë¶í° ì¬ë¬ ëììŽ ìíë ì ìë ê²ì ì믞í©ëë€. ë€íì±ì ë ê°ëë¡ ëë©ëë€.
Dynamic Polymorphism, í¹ì Run-time PolymorphismìŒë¡ ë¶ëЬë ê²ìŒë¡ ì€ë²ëŒìŽë©ì ìíŽ íëì ë©ìëê° ì€ì ì°žì¡° ê°ì²Žë¥Œ êž°ë°ìŒë¡ íì¬ ìë¡ ë€ë¥ž ëìì íë ê²ì ì믞í©ëë€. ìŽ ë ëììŽ ê²°ì ëë ìì ì ë°íììŽë¯ë¡, ìŽë¬í ë€íì±ì ë°íì ë€íì±ìŽëŒê³ ë¶ëŠ ëë€.
í íž, íëì ìŽëŠì ê°ì§ ë©ìëì ëììŽ ì»ŽíìŒ íìì ìë¡ ë€ë¥ž ëììŒë¡ ê²°ì ëë 겜ì°ë ììµëë€. ì€ë²ë¡ë©ê³Œ ìŽ êžì 죌ì ìž Generic ë©ìëê° ê·ž ììì ëë€. ìŽë¬í ë€íì±ì Static Polymorphism, í¹ì Compile-time PolymorphismìŽëŒê³ ë¶ëŠ ëë€.
ì€ë²ë¡ë©ì ìë¡ ë€ë¥ž íëŒë¯ží°ë¥Œ íµíŽ íëì ìŽëŠì ê°ì§ ë©ìëê° ìë¡ ë€ë¥ž ëª ë ¹ì ìííê² ë§ëë ë°©ë²ì ëë€. ì ëëŠì ìŒë°íë íì ìŒë¡ ë€ìí ìžì륌 ì²ëЬí ì ìê² íë ê²ì ëë€. ìŽë€ì 몚ë íëì ë©ìë ìŽëŠìŒë¡ ì¬ë¬ê°ì§ ëìì í ì ìê² ë§ë€ë©Žì, ìŽë€ ëìì ìíí ì§ì ëíŽ ì»ŽíìŒ íìì ê²°ì ëë€ë í¹ì§ìŽ ììµëë€.