프로그래밍을 하다 보면 코드에 추가적인 정보를 제공하거나 특정 행동을 지정해야 할 때가 있습니다.
이때 사용하는 것이 어노테이션(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.
'Dart > Dart Programming language' 카테고리의 다른 글
[고급] Dart 메모리 관리 및 최적화/가비지 컬렉션(Garbage Collection) 이해하기 (0) | 2024.09.09 |
---|---|
[고급] Dart 메타프로그래밍/ 코드 생성과 빌드 러너(Build Runner) (2) | 2024.09.08 |
[고급] Dart 메타프로그래밍/ 리플렉션(Reflection) 기초 (1) | 2024.09.08 |
[고급] Dart제네릭 프로그래밍/ 제네릭의 한계와 제약 조건 (0) | 2024.09.08 |
[고급] Dart제네릭 프로그래밍/ 제네릭 클래스와 함수 작성 방법 - 단계별 예제와 설명 (0) | 2024.09.08 |