Dart Programmer 되기 [24]

< Dart 기초문법 – Generics >

앞서 List를 만들때, var myList = List<int>(); 혹은 List<int> myList = [];와 같이 만든 적이 있습니다. 둘다, blank list를 만드는 것으로, Dart 언어를 통해서, list 내부에 저장할 정보의 타입을 정수형이라고 알려준 역할을 합니다. 따라서 List에 정수를 저장할 수도 있고, List<double> 혹은 List<String>과 같은 형태로 실수나 문자열을 저장하는 것도 가능합니다. 이후는 어땠나요? List에서 제공하는 다양한 property와 member method들에 대해서, 저장하는 데이타 타입에 대한 별도 표시를 하지 않아도 동일한 문법으로 프로그래밍 할수 있었습니다. 이런 기술은 Dart 언어의 generics 문법을 통해서 개발할 수 있습니다.

Point Class using Generics with Explicit Types

클래스 챕터에서 우리는 Point 클래스를 만들어 보았습니다. 즉, 두 개의 좌표를 저장하는 클래스를 좀 더 구체적으로 해서, 정수형 타입 혹은 실수형 타입 등의 구체적인 형태의 데이타 타입을 가지는 클래스를 만듭니다. 코드를 먼저 보고 이에 대한 설명을 하도록 하겠습니다. Generics 기술을 통해서 만든 Point 클래스가 아래의 darttutorial-24-01.dart
프로그램 입니다.

darttutorial-24-01.dart

실제 Point 클래스를 사용하는 부분을 먼저 보면, 11~13번 줄에서, List 등과 같이 int, double, String의 타입명을 추가로 Point 클래스 이름 뒤에 < … > 괄호를 사용하여 추가한 것을 볼 수 있습니다. Point 클래스를 만드는 3~8번 줄을 보면, 앞서의 Point 클래스와 차이가 있는 것을 볼 수 있습니다. 먼저 클래스의 이름인 Point 뒤에 추가로 <T>라고 쓰여져 있는 것을 볼 수 있습니다. 이렇게 플래스 이름뒤에 < … >를 사용하여, 내부에 저장할 타입에 영향을 받는 부분을 제어할 수 있습니다. 일단 T라는 글자는 개발자가 임의로 준 것이며, 개발자가 희망하는 부분으로 정의하면 됩니다. T의 역할은 Point<int> 처럼 하면, T가 int로 바뀌는 효과를 준다고 선언한 겁니다. 따라서, 이후 Point 클래스의 내부에서 T라고 선언한 부분은, 이경우에 int라고 해석해도 된다는 점입니다. 따라서, 클래스 내부의 x, y와 constructor의 입력 파라메타들은 int 타입이 된다는 것입니다. 만약, Point<double>로 하면, 이들은 모두 double이 되는 것이지요.

이러한 이유로, 11~13번 줄을 정의하면, iPoint 내부는 정수들, dPoint 내부는 double 변수들, 그리고 sPoint 내부는 문자열 값을 갖도록 한다는 의미입니다. 의외로 어렵지 않은 것을 알수 있습니다. 15~17번 줄처럼, 이후로는 타입에 상관없이 동일한 방법으로 사용하면 됩니다.

Point Class using Generics with Implicit Types

darttutorial-24-01.dart 프로그램은 개발자가 일일이 int, double, String과 같은 타입을 직접 구체적으로 정의한 경우입니다. 하지만, 우리는 Dart의 type inference 기능을 통해서, 굳이 개발자가 구체적인 타입을 적어주지 않아도, Dart 언어가 알아서 타입을 유추하는 것을 배웠습니다. 그리고 Constructor를 통한 내부 변수 초기화도 단순한 방법으로 할 수 있다는 점을 알고 있습니다. 이를 적용하여 코드를 단순화한 프로그램이 darttutorial-24-02.dart 입니다.

darttutorial-24-02.dart

6번 줄을 보면, 두개의 입력 파라메타가 바로 내부 변수인 x와 y에 저장된다면, 같은 위치에 값을 받을 변수 명을 저장한 것을 볼 수 있습니다. 그리고 11~13번 줄에는 구체적인 타입을 명시하지 않고 있는 것을 볼수 있습니다.

마무리

Generics는 객체지향 프로그래밍을 지원하는 대부분의 언어에서 지원하는 기능입니다. 간단한 문법이지만, 데이타 타입별로 매번 코드를 개발자가 직접하지 않아도 되므로, 개발시간과 프로그램의 길이가 줄어들며, 데이타 타입에 상관없이 동일한 문법을 사용할 수 있으므로, 개발 오류도 줄어드는 효과를 제공합니다.

Creative Commons License (CC BY-NC-ND)

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다