Presentation is loading. Please wait.

Presentation is loading. Please wait.

9장 부프로그램 (3) 2017. 5. 29 순천향대학교 컴퓨터공학부 하 상 호.

Similar presentations


Presentation on theme: "9장 부프로그램 (3) 2017. 5. 29 순천향대학교 컴퓨터공학부 하 상 호."— Presentation transcript:

1 9장 부프로그램 (3) 순천향대학교 컴퓨터공학부 하 상 호

2 목차 부프로그램 개념 부프로그램 설계시 고려사항 매개변수 전달 방법 중복 부프로그램 포괄형 부프로그램

3 중복 부프로그램 중복 부프로그램(overloaded subprogram)은 같은 참조 환경에서 다른 부프로그램과 이름이 같은 부프로그램이다. 중복 부프로그램은 고유한 프로토콜을 갖는다 그 호출 의미는 실매개변수 리스트와 반환값의 타입에 의해서 결정 중복 부프로그램 호출에 대한 컴파일러 고려사항 타입 강제 변환이 허용되는 경우? 혼합형 식이 허용될 경우에, 반환 타입이 중복 부프로그램을 결정할 수 있는가? 디폴트 매개변수를 갖는 경우? void fun(float b = 0.0); void fun(); fun();

4 중복 부프로그램(overloaded subprogram)
중복 부프로그램 의미는 언제 어떻게 결정되는가?

5 예제: 중복 부프로그램 다음 max() 호출의 의미는? max(2,3) max(2.1, 3.2) max(1, 3, 2)
int max(int x, int y) { return x>y ? x : y; } 다음 max() 호출의 의미는? max(2,3) max(2.1, 3.2) max(1, 3, 2) max(2.1, 3) max #2 double max(double x, double y) { return x>y ? x : y; } max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

6 예제: 중복 부프로그램 각 함수 호출의 의미는? int max(int x, int y)
{ return x>y ? x : y; } max(2, 3); max #2 max(2.1, 3.2); double max(double x, double y) { return x>y ? x : y; } max(1, 3, 2); max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); } 중복 부프로그램의 호출 의미는 고유 프로토콜에 의해서 결정된다.

7 예제: 중복 부프로그램 함수 호출의 의미는? int max(int x, int y)
{ return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

8 중복 부프로그램 매개변수의 타입 강제변환 후에, 함수 프로토콜과 일치 여부 검사 언어의 타입 강제변환에 종속
max #1 int max(int x, int y) { return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

9 중복 부프로그램 매개변수의 타입 강제변환 후에, 함수 프로토콜과 일치 여부 검사 언어의 타입 강제변환에 종속
max #1 int max(int x, int y) { return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

10 중복 부프로그램 C++ int=>double, double =>int의 강제 변환 모두 허용
max #1 int max(int x, int y) { return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

11 중복 부프로그램 Java 확장 변환의 경우만 강제변환 허용 int max(int x, int y)
{ return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

12 중복 부프로그램 Ada 타입 강제 변환을 허용하지 않음 int max(int x, int y)
{ return x>y ? x : y; } max #2 double max(double x, double y) { return x>y ? x : y; } max(2.1, 3); max #3 int max(int x, int y, int z) { return x>y ? (x>z ? x : z) : (y > z ? y : z); }

13 중복 부프로그램 함수 반환값 타입이 중복 함수 의미 결정에 포함되는가? 언어에 종속 C++ Java C# Ada
max #1 int max(int x, int y) { return x>y ? x : y; } int x; x = max(2, 3); max #2 double max(int x, int y) { return x>y ? x : y; } C++ Java C# Ada

14 포괄형 부프로그램 목적: 소프트웨어 생산성 향상 다형적(polymorphic) 의미는?
“다양한 형태를 갖는다”를 뜻하는 그리스어의 어원 다형 부프로그램(polymorphic subprogram)은 부프로그램의 다른 활성화시에 다른 타입의 매개변수를 취하는 부프로그램 다형 부프로그램 유형 특이 다형성(ad hoc polymorphism) 매개변수 다형성(parametric polymorphism) 부타입 다형성(subtype polymorphism)

15 특이 다형성 “특이(ad hoc)”는 “특정 목적으로 수행되는 무엇”을 뜻하는 그리스어의 어원
중복 부프로그램은 다형 부프로그램의 한 유형으로 특이 다형성(ad hoc polymorphism)을 제공한다. 같은 이름을 갖는 여러 개의 부프로그램이 중복되어 있으며, 중복된 각 부프로그램은 특정 목적을 가지며, 유사하게 동작할 필요 없다.

16 부타입 다형성 부타입 다형성(subtype polymorphism)은 타입 T의 변수가 T의 객체나 T로부터 파생된 임의 타입의 객체를 접근할 수 있음을 의미 객체지향 프로그래밍 언어에서 지원

17 매개변수 다형성 매개변수 다형성(parametric polymorphism)은 부프로그램의 형식 매개변수란에 포괄형 매개변수를갖는 부프로그램으로 제공 포괄형 매개변수(generic parameter)는 임의의 타입으로 대체 가능한 타입 매개변수이다. 매개변수 다형적 부프로그램을 포괄형 부프로그램(generic subprogram)이라 부른다. 포괄형 매개변수 max(type a, type b) {…}

18 매개변수 다형성 부프로그램의 다른 사례화에 대해서 다른 타입의 매개변수를 갖는 부프로그램 생성
매개변수 다형적 부프로그램은 모두 동일하게 행동 포괄형 매개변수 max(int a, int b) {…} max(type a, type b) {…} max(float a, float b) {…} max(char a, char b) {…}

19 C++ 포괄형 함수 C++에서 포괄형 함수는 템플리트 함수(template function)으로 표현 사례화
template 인자이며, 포괄형 매개변수(type parameter) 표현 template<class TYPE> void copy(TYPE a[], TYPE b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; } template 인자는 타입 이름으로 사용될 수 있으며, 실 매개변수의 타입으로 바인딩 사례화 컴파일러는 실 매개변수에 기반하여 실제 함수를 생성한다 double a1[10], a2[10]; copy(a1, a2, 10); char b1[10], b2[10]; copy(b1, b2, 10); Int c1[30], c2[30]; copy(c1, c2, 30);

20 C++ 포괄형 함수 사례화 void copy(double a[], double b[], int n) {
template<class TYPE> void copy(TYPE a[], TYPE b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; } void copy(double a[], double b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; } double a1[10], a2[10]; char b1[10], b2[10]; int c1[30], c2[30]; copy(a1, a2, 10); copy(b1, b2, 10); copy(c1, c2, 30); copy(a1, b1, 10); 사례화 void copy(char a[], char b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; } void copy(int a[], int b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; }

21 C++ 포괄형 함수 사례화 포괄형 매개변수를 2개 갖는 템플리트 함수 정의
template<class TYPE1, TYPE2> void copy(TYPE1 a[], TYPE 2 b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; } 포괄형 매개변수를 2개 갖는 템플리트 함수 정의 double a1[10], a2[10]; char b1[10], b2[10]; int c1[30], c2[30]; copy(a1, b1, 10); 사례화 void copy(int a[], char b[], int n) { for (int i=0; i < n; i++) a[i] = b[i]; }

22 C++ 포괄형 함수 generic_sort() 함수 작성 template <class Type>
void generic_sort(Type list[], int len) { int i, j; Type temp; for (i = 0; i < len - 1; top++) for (j = i + 1; j < len - 1; j++) if (list[i] > list[j]) { temp = list[i]; list[i] = list[j]; list[j] = temp; } int a[100]; float b[100]; generic_sort(a, 100); generic_sort(b, 100);

23 Java 포괄형 메소드 포괄형 타입 이용(Java 5.0+) 포괄형 매개변수
public static <T> T getMiddle(T[] a) { return a[a.length / 2]; } String[] names = {"John", "Kim", "Lee"}; String middle = getMiddle<String>(names); 포괄형 메소드 호출시에, 실 매개변수의 타입을 각괄호로 메소드 이름 앞에 배치

24 Java 포괄형 메소드 포괄형 매개변수는 클래스에 제한 기본 타입은 허용하지 않음 클래스 범위 제한
T가 compartTo()를 포함하는 것을 어떻게 아는가? public static <T> T min(T[] a) { if (a == null || a.length ==0) return null; T smallest = a[0]; for (int i=1; i <a.length; i++) if (smallest.compareTo(a[i]) > 0) smallest = a[i]; return smallest; }

25 Java 포괄형 메소드 T를 Comparable를 구현하는 클래스로 제한
public static <T> T min(T[] a) { if (a == null || a.length ==0) return null; T smallest = a[0]; for (int i=1; i <a.length; i++) if (smallest.compareTo(a[i]) > 0) smallest = a[i]; return smallest; } T를 Comparable를 구현하는 클래스로 제한 public static <T extends Comparable> T min(T[] a) {…}

26 Java 포괄형 메소드 포괄형 타입을 이용한 generic_sort()
public static <T extends Comparable> void generic_sort(T[] a) { for (int i = 0; i<a.lenghth; i++) for (int j= i+1; j <a.length; j++) if (a[i].ComparedTo(a[j]) > 0) { Comparable t = a[i]; a[i] = a[j]; a[j] = t; }

27 포괄형 부프로그램 C++, Java의 포괄형 부프로그램 차이점은? 포괄형 매개변수의 타입이 제한되는가?
클래스의 범위를 제한하는 것이 가능한가? 포괄형 부프로그램 사례 방식은? 단지 한 개의 부프로그램 코드만 생성되는가? 아니면 각 사례에 대해서 별도의 코드가 생성되는가?

28 포괄형 부프로그램 C# 2005+ Java 5.0의 포괄형 부프로그램 유사
한 가지 차이점: 컴파일러가 실매개변수로부터 포괄형 타입을 추론할 수 있다면, 부프로그램 호출시 포괄형 매개변수는 생략될 수 있다. class MyClass public static <T> DoIt<T>(T p1) {…} } int myInt = MyClass.DoIt(17); // DoIt<int>를 호출 string myStr = MyClass.DoIt(‘apples’); // DoIt<string>을 호출


Download ppt "9장 부프로그램 (3) 2017. 5. 29 순천향대학교 컴퓨터공학부 하 상 호."

Similar presentations


Ads by Google