본문 바로가기
Dart/Study

Dart에서 어노테이션 심화 학습: 초보자를 위한 가이드

by Maccrey Coding 2024. 7. 12.
728x90
반응형

이전 블로그 게시글에서는 Dart에서 어노테이션의 기본 개념과 활용 방법을 살펴보았습니다.
이번에는 어노테이션에 대한 심화 학습을 통해 더욱 깊이 있는 이해를 얻도록 도와드리겠습니다.

1. 어노테이션 메타데이터

어노테이션은 코드에 메타데이터를 추가하는 데 사용됩니다.

메타데이터는 코드 자체에 대한 정보를 의미하며, 다음과 같은 다양한 용도로 활용될 수 있습니다.

  • 코드 문서화: 어노테이션을 사용하여 코드의 기능, 사용 방법, 제약 조건 등을 명확하게 설명할 수 있습니다. 이는 코드를 이해하고 사용하는 다른 개발자들에게 큰 도움이 됩니다.
  • 코드 구성 및 조직화: 어노테이션을 사용하여 코드를 논리적으로 그룹화하고 분류할 수 있습니다. 이는 코드를 더욱 읽기 쉽고 유지 관리하기 용이하게 만듭니다.
  • 코드 분석 및 검사: 어노테이션을 사용하여 코드를 분석하고 검사하는 도구를 개발할 수 있습니다. 이는 코드 오류를 찾고 개선하는 데 도움이 됩니다.
  • 코드 생성 및 변환: 어노테이션을 사용하여 코드를 자동으로 생성하거나 변환하는 도구를 개발할 수 있습니다. 이는 개발 생산성을 향상시키는 데 도움이 됩니다.

2. 어노테이션 종류

Dart에서 제공하는 다양한 어노테이션 종류를 살펴보겠습니다.

  • @Retention: 어노테이션 정보가 유지되는 기간을 지정합니다. 옵션은 다음과 같습니다.
    • RetentionPolicy.CLASS: 컴파일 후에도 어노테이션 정보가 유지되지 않습니다.
    • RetentionPolicy.SOURCE: 컴파일 후에도 소스 코드에 어노테이션 정보가 유지됩니다.
    • RetentionPolicy.RUNTIME: 컴파일 후에도 런타임까지 어노테이션 정보가 유지됩니다.
  • @Target: 어노테이션을 사용할 수 있는 코드 요소를 지정합니다. 옵션은 다음과 같습니다.
    • ElementType.CLASS: 클래스에 사용할 수 있습니다.
    • ElementType.FUNCTION: 함수에 사용할 수 있습니다.
    • ElementType.FIELD: 필드에 사용할 수 있습니다.
    • ElementType.PARAMETER: 매개변수에 사용할 수 있습니다.
  • @Deprecated: 코드가 더 이상 사용되지 않음을 나타냅니다.
  • @Optional: 어노테이션 매개변수가 선택적임을 나타냅니다.
  • @Default: 어노테이션 매개변수의 기본값을 지정합니다.
  • @Assert: 코드 조건이 참인지 확인합니다. 조건이 거짓인 경우 예외를 발생시킵니다.
  • @BoolParam: 어노테이션 매개변수가 true 또는 false 값만 허용한다는 것을 나타냅니다.
  • @IntParam: 어노테이션 매개변수가 정수 값만 허용한다는 것을 나타냅니다.
  • @StringParam: 어노테이션 매개변수가 문자열 값만 허용한다는 것을 나타냅니다.
  • @DoubleParam: 어노테이션 매개변수가 실수 값만 허용한다는 것을 나타냅니다.
  • @ListParam: 어노테이션 매개변수가 값 목록을 허용한다는 것을 나타냅니다.
  • @MapParam: 어노테이션 매개변수가 키-값 쌍 맵을 허용한다는 것을 나타냅니다.

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

기본 어노테이션 외에도 사용자 정의 어노테이션을 만들 수 있습니다.

이는 코드에 더 많은 정보와 기능을 추가하는 강력한 도구입니다.

사용자 정의 어노테이션을 만들려면 다음 단계를 따릅니다.

 

1. 어노테이션 클래스 정의

  • @Retention 어노테이션을 사용하여 어노테이션 정보가 유지되는 기간을 지정합니다. 옵션은 다음과 같습니다.
    • RetentionPolicy.CLASS: 컴파일 후에도 어노테이션 정보가 유지되지 않습니다.
    • RetentionPolicy.SOURCE: 컴파일 후에도 소스 코드에 어노테이션 정보가 유지됩니다.
    • RetentionPolicy.RUNTIME: 컴파일 후에도 런타임까지 어노테이션 정보가 유지됩니다.
  • @Target 어노테이션을 사용하여 어노테이션을 사용할 수 있는 코드 요소를 지정합니다. 옵션은 다음과 같습니다.
    • ElementType.CLASS: 클래스에 사용할 수 있습니다.
    • ElementType.FUNCTION: 함수에 사용할 수 있습니다.
    • ElementType.FIELD: 필드에 사용할 수 있습니다.
    • ElementType.PARAMETER: 매개변수에 사용할 수 있습니다.
  • 어노테이션 클래스 이름을 정의합니다. 이 이름은 코드에서 어노테이션을 참조하는 데 사용됩니다.
  • 어노테이션 매개변수 (있는 경우)를 정의합니다. 매개변수는 어노테이션에 추가 정보를 제공하는 데 사용됩니다.

예시

다음은 로그 메시지를 기록하는 사용자 정의 어노테이션을 만드는 방법입니다.

import 'package:meta/meta.dart';

// 어노테이션 클래스 정의
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FUNCTION})
class Log {
  final String message;

  const Log(this.message);
}

// 어노테이션 사용
@Log('This is a log message.')
void logMessage() {
  print(message);
}
 

위 코드에서 @Log('This is a log message.') 어노테이션은 logMessage 함수를 호출할 때마다 "This is a log message." 메시지를 콘솔에 출력하도록 합니다.

 

2. 어노테이션 속성 정의

  • 어노테이션 매개변수를 정의합니다. 매개변수는 어노테이션에 추가 정보를 제공하는 데 사용됩니다. 매개변수 이름, 유형, 기본값 (있는 경우)을 지정합니다.
  • 필요한 경우 다른 속성을 정의합니다. 예를 들어, 어노테이션의 설명이나 문서를 정의할 수 있습니다.

예시

import 'package:meta/meta.dart';

// 어노테이션 클래스 정의
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FUNCTION})
class Log {
  final String message;
  final bool isImportant; // 추가된 속성

  const Log(this.message, {this.isImportant = false});
}

// 어노테이션 사용
@Log('This is an important log message.', isImportant: true)
void logImportantMessage() {
  print(message);
}
 

위 코드에서 Log 어노테이션은 message 매개변수 외에도 isImportant 매개변수를 추가합니다.

이 매개변수는 로그 메시지가 중요한지 여부를 나타냅니다.

 

3. 어노테이션 사용

  • 어노테이션을 사용하려면 @ 기호로 시작하고 어노테이션 이름을 작성합니다.
  • 괄호 안에 어노테이션 매개변수 값을 지정합니다.
  • 어노테이션을 클래스, 함수, 필드, 매개변수 등 다양한 코드 요소에 추가할 수 있습니다.

예시

import 'package:meta/meta.dart';

// 어노테이션 클래스 정의
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FUNCTION})
class Log {
  final String message;
  final bool isImportant;

  const Log(this.message, {this.isImportant = false});
}

// 어노테이션 사용
@Log('This is a log message.')
void logMessage() {
  print(message);
}

@Log('This is an important log message.', isImportant: true)
void logImportantMessage() {
  print(message);
}

 

설명

  1. package:meta 패키지 가져오기: meta 패키지는 어노테이션을 사용하기 위한 기본 클래스와 기능을 제공합니다.
  2. Log 어노테이션 클래스 정의
    • @Retention(RetentionPolicy.RUNTIME) 어노테이션: 어노테이션 정보가 런타임까지 유지되도록 합니다.
    • @Target({ElementType.FUNCTION}) 어노테이션: 이 어노테이션은 함수에만 사용될 수 있음을 나타냅니다.
    • final String message;: 어노테이션에 'message'라는 문자열 매개변수를 정의합니다. 이 매개변수는 로그 메시지를 저장합니다.
    • final bool isImportant;: 어노테이션에 'isImportant'라는 부울 매개변수를 정의합니다. 이 매개변수는 로그 메시지가 중요한지 여부를 나타냅니다. 기본값은 false입니다.
    • const Log(this.message, {this.isImportant = false});: 생성자를 정의합니다. 생성자는 어노테이션 인스턴스를 만들 때 사용됩니다.
  3. Log 어노테이션 사용
    • @Log('This is a log message.'): logMessage 함수에 Log 어노테이션을 추가합니다. 이는 logMessage 함수를 호출할 때마다 "This is a log message." 메시지를 콘솔에 출력하도록 합니다.
    • @Log('This is an important log message.', isImportant: true): logImportantMessage 함수에 Log 어노테이션을 추가하고 isImportant 매개변수를 true로 설정합니다. 이는 logImportantMessage 함수를 호출할 때마다 "This is an important log message." 메시지를 콘솔에 출력하고, 이 메시지를 중요한 것으로 표시합니다.

참고:

  • 이 예시는 기본적인 사용자 정의 어노테이션을 보여주는 것입니다. 실제 상황에서는 더 복잡한 어노테이션을 만들 수 있습니다.
  • 어노테이션을 사용하여 코드를 더욱 명확하고 이해하기 쉽게 만들 수 있으며, 코드 유지 관리에도 도움이 됩니다.

주의 사항

  • 어노테이션을 과도하게 사용하지 않도록 주의해야 합니다. 너무 많은 어노테이션을 사용하면 코드가 읽기 어려워질 수 있습니다.
  • 어노테이션을 사용하기 전에 meta 패키지에 대한 문서를 참조하십시오.

이 예시가 도움이 되었기를 바랍니다!

추가 질문이나 개선할 부분이 있다면 언제든지 코멘트를 남겨주세요.

728x90
반응형