본문 바로가기
Dart

[Dart] 언어 기본기 - 제네릭편

by 가드 2022. 12. 15.
728x90

제네릭(Generic)

제네릭 프로그래밍은 데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식이다. 제네릭은 클래스나 메소드에서 사용할 내부 타입을 컴파일 타임 때 미리 지정된다. 컴파일 타임 때 타입 검사(Type Check)를 수행하여 클래스나 메소드 내부에서 사용되는 객체 타입 안정성을 높일 수 있다.

void main() {
  Book<String> book1 = Book('1', '왕좌의게임');
  book1.printIdType(); // String
  Book<int> book2 = Book(1, '왕좌의게임');
  book2.printIdType(); // int
}

class Book<T> {
  final T id;
  final String name;
  Book(this.id, this.name);
  
  printIdType() {
    print(id.runtimeType);
  }
}
  • Book 클래스를 선언했는데 <T> 키워드는 T 타입의 제네릭 클래스를 정의한 것이다. T가 아니어도 된다. 대문자로 개발자가 정하면 된다. 우리가 List를 사용할 때 List<String>이라고 선언한 것은 List 클래스에 String 제네릭 타입을 정의한 것이다. List에는 String 타입만 저장되어 사용되는 걸 이전 글에서 많이 봐왔을 것이다.
  • 제네릭을 선언한 Book 클래스의 id 값을 제네릭 타입으로 지정하였다. 이렇게 정의하여 id는 외부에서 String, id 등 클래스 타입을 정의해서 Book 인스턴스를 생성할 수 있다.
  • printIdType() 메소드를 정의하여 id 변수가 어떠한 타입이 되었는지 출력해주는 메소드도 추가해 주었다.
  • main() 함수에서 book1은 String 타입으로 지정하고 book2는 int 타입으로 지정하여 생성자에 타입 값을 전달하여 인스턴스를 생성하였다. 그리고 printIdType()으로 타입을 출력해 본 결과 당연하게도 book1의 id 타입은 String, book2의 id 타입은 int가 출력되었다

Dart언어를 처음 접하고 Dart언어 기본부터 공부하면서 글들을 정리해봤다. OOP의 프로그래밍은 어떤 언어든 문법이 크게 벗어나지 않아서 습득하기가 수월한 것 같다. 이제 Dart언어 기본기에 대한 글은 이번 편으로 마무리하려고 한다. Dart언어로 개발하다가 좋은 내용이 있으면 Dart 언어 대한 블로그 글을 다시 작성해봐야겠다.

 

번외. OOP

Object Oriented Programming 약자로 앞자만 따서 OOP라 한다 다른 말로는 객체 지향 프로그래밍이라 부른다. Dart언어도 OOP이다.

void main() {
  Test test = Test();
}

class Test{}

Test라는 아무것도 정의하지 않는 클래스를 정의하고 Test 클래스를 인스턴스 생성을 하였다. Test 클래스 변수에 리플렉션을 접근하면 정의하지 않은 메소드들이 노출된다.

위의 이미지를 보면 Test 클래스에서 정의하지 않은 hashCode, runtimtype, toString() 등의 변수 또는 메소드들이 노출되어 있다.

class Test extends Object{}

기본적으로 모든 클래스에는 extends Object가 생략되어 있다. 클래스 정의할 때 Object 상속을 구현하지 않아도 기본적으로 상속이 적용되는 클래스가 Object 클래스이다.

그래서 모든 클래스의 최상위 부모는 Object 클래스이기에 Object들의 관계를 정의하는 프로그래밍을 하게 되는 것이다. 그래서 객체 지향 프로그래밍이라 한다.

300x250

댓글