메타데이터 어노테이션

메타데이터 어노테이션이란 무엇인가

@로 시작하며 코드에 정적 부가 정보를 첨부합니다. 컴파일러, IDE, 정적 분석기가 읽으며 실행 로직에 영향을 주지 않습니다.

합법적인 작성 방식은 두 가지입니다:

  1. 컴파일 타임 내장 상수: @override, @deprecated
  2. 상수 생성자 호출: @Deprecated("안내 문구"), 커스텀 어노테이션 @Todo("xxx", "xxx")

주로 클래스, 메서드, 변수, 함수, 매개변수, 임포트, 열거형 등에 사용합니다.

@Deprecated

폐기된 API를 표시합니다. 대체 방안과 삭제 예정일을 반드시 적어야 하며, 세분화된 제한 시나리오용 정적 메서드도 제공됩니다.

class Television {
  /// 대체: turnOn 사용
  @Deprecated('대신 turnOn()을 사용하세요. 이 메서드는 2026년 말에 삭제됩니다')
  void activate() {
    turnOn();
  }

  void turnOn() {
    print("TV 켜짐");
  }
}

// 세분화된 폐기 제한 예시
@Deprecated.instantiate() // new로 클래스 인스턴스 생성 금지
class OldDevice {}

@Deprecated.extend() // 다른 클래스가 상속하는 것을 금지
class Base {}

// Base를 상속하면 편집기에 폐기 경고가 표시됨
class Sub extends Base {}

void main() {
  Television tv = Television();
  // @Deprecated 표시 메서드 호출 시 IDE에 취소선과 경고가 표시됨
  tv.activate();
  // 권장하는 새 메서드
  tv.turnOn();

  // OldDevice 인스턴스 생성 시 @Deprecated.instantiate() 경고 발생
  OldDevice device = OldDevice();
}
Code language: Dart (dart)

위 코드는 정상적으로 컴파일 및 실행되며, IDE와 컴파일러에만 경고 메시지가 출력됩니다. Android Studio 또는 IntelliJ IDEA로 테스트할 수 있습니다.

@deprecated

사용자 정의 안내 문구 없이 단순 폐기 표시만 합니다. @Deprecated("설명") 사용을 권장합니다.

@deprecated
void oldFunc() {}
Code language: Dart (dart)

@override

부모 클래스 / 인터페이스의 동일한 이름 멤버를 재정의했음을 표시합니다. IDE에서 검증하며 메서드 이름을 잘못 쓰면 빨간 오류가 표시됩니다.

class Animal {
  void speak() {}
}

class Dog extends Animal {
  // @override: 부모 클래스의 speak 메서드를 재정의함
  @override
  void speak() {
    print("멍멍");
  }
}

class Cat extends Animal {
  @override
  void speak() {
    print("야옹");
  }
}

class Pig extends Animal {
   // 재정의 없음
}

void main() {
  Animal dog = Dog();
  Animal cat = Cat();
  Animal pig = Pig();

  dog.speak(); // 출력: 멍멍
  cat.speak(); // 출력: 야옹
  pig.speak();
}
Code language: Dart (dart)

@pragma

컴파일러, 정적 분석기에 저수준 최적화 / 인식 명령을 전달하며 주로 저수준 개발에 활용합니다.

// 예시: 컴파일러에 이 함수를 인라인 처리하도록 지시
@pragma('vm:prefer-inline')
int add(int a, int b) => a + b;
Code language: Dart (dart)

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다