메타데이터 어노테이션이란 무엇인가
@로 시작하며 코드에 정적 부가 정보를 첨부합니다. 컴파일러, IDE, 정적 분석기가 읽으며 실행 로직에 영향을 주지 않습니다.
합법적인 작성 방식은 두 가지입니다:
- 컴파일 타임 내장 상수:
@override,@deprecated - 상수 생성자 호출:
@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)
Previous: Function
Next: Libraries 라이브러리