[Dart] Generic, Dart Type System

세현·2024년 7월 26일
0

flutter

목록 보기
2/2

제네릭을 알아봐야겟다고 생각한 이유는 riverPod을 사용하다가 Provider에 제네릭 타입으로 명시해주는 것을 보고 한 번 자세히 알고 가면 좋겠다고 생각이 들어서이다.

제네릭은 보통 타입 세이프티 때문에 사용한다고 합니다.

배열이 문자열 값만 가지게 하고 싶다면

List<String>

으로 선언해주면 됩니다.

제네릭을 사용하는 또 다른 이유는 코드 중복을 줄이기 위함입니다.

공식 문서의 예입니다.

abstract class ObjectCache {
  Object getByKey(String key);
  void setByKey(String key, Object value);
}

abstract class StringCache {
  String getByKey(String key);
  void setByKey(String key, String value);
}

객체를 캐싱하는 인터페이스라고 합니다. 사용자가 객체 뿐만이 아니라 문자열 버전이 필요할 수도 있습니다.
위 코드는 2개의 예시 뿐이지만 Number 버전이 필요할수도 있고 다른 타입의 버전이 필요할 수도 있습니다.

이런 경우에

abstract class Cache<T> {
  T getByKey(String key);
  void setByKey(String key, T value);
}

제네릭 타입으로 명시를 해준다면 명시해준 타입으로 함수를 사용할 수 있습니다.

또한 제네릭 타입을 구현할 때, 인자가 특정 타입의 서브타입이 되게 해야 할 경우가 발생하는데, 이 때 extends를 사용하면 가능하다고 합니다.

flutter를 사용하다보면 Non-nullable을 보장할떄가 있는데 Object? 대신 Object의 서브타입으로
또한 다른 클래스의 서브 타입 또는 객체로 사용하는 것이 가능합니다.

class Foo<T extends SomeBaseClass> {

}
class FooSecond extends SomeBaseClass {
}

var someBaseClassFoo = Foo<SomeBaseClass>();
var fooSecondFoo = Foo<Extender>();

메소드와 함수에서도 타입 인자를 사용할 수 있습니다.

타입

이런 제네릭 타입을 공부하고 사용하다보면서 느낀 점은 타입에 민감한다? 그런 느낌을 받았습니다.

다트 공식 문서에 Dart 타입 시스템에 관한 말이 있어서 그에 대해 읽어 보았습니다.

우선 Dart는 타입이 안전한 프로그래밍 언어라고 합니다. Dart는 변수값이 항상 정적 또는 안전한 타입과 일치한지 확인하기 위해 정적 타입 검사와 런타임 검사를 사용한다고 합니다. 타입은 필수지만, 타입 추론 덕분에 타입 어노테이션은 선택적이라고 합니다.

런타임 검사

런타임 검사는 컴파일 타임에서 감지하지 못하는 타입 안정성 이슈를 처리합니다.

List<Animal> animals = [Dog()]
List<Cat> cats = animals as List<Cat>;

위 코드와 같이 강아지 타입의 리스트를 고양이 타입의 리스트로 캐스팅 하는 것은 에러이므로 런타임에서 예외를 발생시킨다고 합니다.

캐스팅 = 형 변환

타입 추론

Dart의 Analyzer는 필드, 메서드, 지역 변수와 대부분의 제네릭 타입 인자를 추론합니다. 만약 특정 타입을 추론할 만큼의 정보가 없다면 dynamic 타입을 사용합니다.

정적 타입 검사의 장점 중 하나는 Dart의 static analyzer를 사용하여 컴파일 타임에 버그를 찾을 수 있다는 것입니다.
List 타입의 변수를 printInts() 함수에 넣었을때 list에 대한 타입 에러를 발생시키는 예도 있습니다.

타입 안정성

타입 안정성은 프로그램이 유효하지 않는 상태가 되지 않도록 하는 것입니다. 표현식의 정적 유형이 String인 경우 문자열만 얻을 수 있도록 런타임에서 보장하는 것입니다.
예르들어 String을 int에 할당하는 것은 컴파일 타입 에러이고, 객체가 String이 아닌 경우 as String을 사용하여 객체를 String으로 변환하면 런타임 에러가 발생하여 실패한다고 합니다.

타입 안정성의 이점

  • 타입 관련 버그를 컴파일 타임에 찾을 수 있습니다.
  • 코드의 가독성이 높아집니다.
  • 코드의 유지관리가 쉬워집니다.
profile
안녕하세요

0개의 댓글

관련 채용 정보