본문 바로가기
Dart/Dart Programming language

[고급] Dart 메타프로그래밍/ 어노테이션(Annotations) 사용법

by Maccrey Coding 2024. 9. 8.
728x90
반응형

 

프로그래밍을 하다 보면 코드에 추가적인 정보를 제공하거나 특정 행동을 지정해야 할 때가 있습니다.

이때 사용하는 것이 어노테이션(Annotations)입니다.

Dart에서 어노테이션은 코드를 더 명확하게 하고, 컴파일러나 런타임에 특별한 지시를 내리는 데 사용됩니다. 이번 글에서는 Dart에서 어노테이션이 무엇인지, 그리고 어떻게 사용하는지에 대해 초보자도 이해하기 쉽게 설명하겠습니다.

1. 어노테이션(Annotations)이란?

어노테이션은 코드에 메타데이터를 추가하는 방법입니다.

메타데이터는 코드의 동작을 변경하거나, 특정 행동을 하도록 지시할 수 있는 추가 정보입니다. Dart에서는 어노테이션을 @ 기호로 시작하며, 클래스, 메서드, 변수 등에 붙여 사용할 수 있습니다.

1.1 어노테이션의 역할

어노테이션은 다음과 같은 역할을 할 수 있습니다:

  • 코드 문서화: 코드에 대한 추가 설명이나 정보를 제공
  • 컴파일러 지시: 컴파일러에게 특정 행동을 하도록 지시
  • 런타임 동작 수정: 런타임에 코드를 특정 방식으로 동작하게 함
  • 테스트와 디버깅: 테스트 환경에서 특정 동작을 설정하거나, 디버깅 시 유용한 정보를 제공

2. Dart에서의 어노테이션 사용

Dart에서 기본적으로 제공되는 어노테이션이 몇 가지 있습니다. 또한, 필요에 따라 사용자 정의 어노테이션을 직접 만들 수도 있습니다.

2.1 기본 어노테이션

Dart에서는 몇 가지 기본 어노테이션이 있습니다. 가장 자주 사용되는 것은 @override, @deprecated, @required입니다.

2.1.1 @override

@override는 부모 클래스의 메서드를 재정의할 때 사용합니다.

이 어노테이션을 붙여, 해당 메서드가 상위 클래스의 메서드를 재정의하고 있다는 것을 명확하게 표시할 수 있습니다.

class Animal {
  void makeSound() {
    print('Animal sound');
  }
}

class Dog extends Animal {
  @override
  void makeSound() {
    print('Woof!');
  }
}

설명

  • Dog 클래스에서 makeSound 메서드를 재정의하며, @override 어노테이션을 사용해 이를 명시적으로 나타냅니다.

2.1.2 @deprecated

@deprecated는 더 이상 사용되지 않는 코드를 표시하는 데 사용됩니다. 해당 코드가 향후 버전에서 제거될 수 있음을 경고합니다.

class Calculator {
  @deprecated
  void add(int a, int b) {
    print(a + b);
  }

  void sum(int a, int b) {
    print(a + b);
  }
}

설명

  • add 메서드는 더 이상 사용되지 않음을 나타내며, 대신 sum 메서드를 사용할 것을 권장합니다.

2.1.3 @required

@required는 함수나 메서드에서 매개변수를 필수로 지정할 때 사용됩니다.

현재는 meta 패키지에서 제공되며, 최근에는 Dart의 새로운 문법인 required 키워드로 대체되고 있습니다.

import 'package:meta/meta.dart';

class Person {
  final String name;
  final int age;

  Person({@required this.name, @required this.age});
}

설명

  • Person 클래스 생성자에서 name과 age는 필수 매개변수로 지정되었습니다.

3. 사용자 정의 어노테이션 만들기

기본 어노테이션 외에도, Dart에서는 자신만의 어노테이션을 만들 수 있습니다. 이를 통해 특정 기능을 커스터마이즈하거나, 특별한 용도로 사용할 수 있습니다.

3.1 사용자 정의 어노테이션 정의하기

사용자 정의 어노테이션은 일반 클래스처럼 정의할 수 있으며, 인스턴스를 생성하지 않고 클래스 이름만으로 어노테이션을 사용할 수 있습니다.

class MyAnnotation {
  final String description;

  const MyAnnotation(this.description);
}

@MyAnnotation('This is a custom annotation')
class MyClass {
  void myMethod() {
    print('Hello from MyClass!');
  }
}

설명

  • MyAnnotation 클래스를 정의하여 어노테이션을 생성합니다.
  • @MyAnnotation('This is a custom annotation')를 사용해 MyClass에 어노테이션을 추가했습니다.

3.2 사용자 정의 어노테이션 활용하기

사용자 정의 어노테이션은 리플렉션(Reflection)과 함께 사용하여 특정 행동을 지정하거나, 런타임에 동작을 다르게 설정할 수 있습니다.

import 'dart:mirrors';

class MyAnnotation {
  final String description;

  const MyAnnotation(this.description);
}

@MyAnnotation('This is a custom annotation')
class MyClass {
  void myMethod() {
    print('Hello from MyClass!');
  }
}

void main() {
  ClassMirror classMirror = reflectClass(MyClass);
  var metadata = classMirror.metadata;

  for (var meta in metadata) {
    if (meta.reflectee is MyAnnotation) {
      print('Found annotation with description: ${meta.reflectee.description}');
    }
  }
}

설명

  • 리플렉션을 사용해 MyClass에 있는 MyAnnotation을 찾아 출력하는 예제입니다.
  • 런타임에 어노테이션의 설명을 확인할 수 있습니다.

4. 어노테이션 사용 시 주의점

어노테이션을 사용할 때는 몇 가지 유의사항이 있습니다:

  • 과도한 사용 자제: 어노테이션을 남발하면 코드가 복잡해질 수 있습니다. 필요한 곳에만 사용하는 것이 좋습니다.
  • 런타임 비용 고려: 리플렉션과 함께 어노테이션을 사용하는 경우, 런타임 성능에 영향을 줄 수 있으므로 주의해야 합니다.
  • 코드 가독성 유지: 어노테이션은 코드의 의미를 명확히 하는 데 도움을 주지만, 지나치면 오히려 가독성을 해칠 수 있습니다.

Dart에서 어노테이션은 코드를 더 명확하고 유연하게 만드는 강력한 도구입니다.

기본 어노테이션을 잘 활용하면 코드의 가독성과 유지보수성을 높일 수 있고, 사용자 정의 어노테이션을 통해 자신만의 기능을 추가할 수도 있습니다.

이 글을 통해 어노테이션의 기초 개념과 사용법을 이해하고, 실제 코드에 적용해 보세요!

 

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

728x90
반응형