데코레이터 (Decorator)
: 선언된 함수에 내용을 덧붙이지 않고 기능을 추가하는 파이썬의 기법
: @ 기호를 앞에 붙혀서 사용
: JAVA의 어노테이션과 비슷하지만 다른 개념
def decorate(func):
def func_wrapper():
print "welcome to"
func()
print "with python"
return func_wrapper
@decorate
def function():
print "hello world"
function()
# outputs
# welcome to
# hello world
# with python
def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
return func_wrapper
@p_decorate
def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)
print get_text("John")
# Outputs <p>lorem ipsum, John dolor sit amet</p>
: @ 기호 뒤에 데코레이트할 함수의 이름을 정의하면 됨
어노테이션 (Annotation)
: 소스코드에 추가해서 사용할 수 있는 메타 데이터의 일종
: @ 기호를 앞에 붙혀서 사용하며 JDK 1.5 버전 이상 부터 지원
: JAVA의 어노테이션은 클래스 파일에 임베드 되어 컴파일러에 의해 생성된 이후 JVM에 포함되어 동작함
- 기능
: 컴파일러에게 코드 작성 문법 에러를 체크하도록 정보 제공
: 소프트웨어 개발 환경에게 빌드나 배포 시 코드를 자동으로 생성할 수 있도록 정보 제공
: 런타임에 특정 기능을 실행하도록 정보 제공
JAVA 빌트인 어노테이션
- @Override
@Override
public void getInfo() {
System.out.println("test");
}
: 메서드를 오버라이드 하겠다는 의미
: 상속 받은 부모 클래스 또는 구현해야할 인터페이스에서 해당 메서드가 없으면 컴파일 오류가 발생
- @Deprecated
@Deprecated
public void deprecatedMethod() {
System.out.println("test");
}
: 메서드를 Deprecated 시키겠다는 의미
: 이 메서드를 사용하는 애플리케이션을 컴파일 할 경우 컴파일 경고가 발생
: 하위 호환을 위해 메서드 자체를 없에지는 못하지만 사용하지 말 것을 경고 하기 위함
- @SpperessWarnings
: 컴파일러 경고를 출력하지 않도록 설정
: all, cast, dep-ann, deprecation 등의 파라미터를 사용
ex) @SpperessWarnings("all")
- @SafeVarargs
: 제너릭 같은 가변인자 매개변수를 사용할 때 경고를 무시
- @FunctionInterface
: JAVA에서 람다 함수를 위한 인터페이스를 지정
: 함수형 인터페이스에 사용하기 적합하지 않은 경우 (메서드가 없거나 두 개 이상인 경우)에 컴파일 에러 발생
JAVA 메타 어노테이션
- @Retention
: 어노테이션의 리텐션 기간 명명
ex) @RetensionPolicy.Class
- @documented
: JAVA 문서에도 어노테이션 정보를 표현
- @Target
: 생성할 어노테이션이 적용될 수 있는 위치를 나열
ex) @ElementType.TYPE
- @Inherited
: 자식 클래스가 어노테이션을 상속 받을 수 있음
- @Repeatable
: 반복적으로 어노테이션을 선언할 수 있음
JAVA 커스텀 어노테이션
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value() default "MyAnnotation : default value"
}
class MyObject {
@MyAnnotation
public void testMethod1() {
System.out.println("This is testMethod1");
}
@MyAnnotation(value = "My new Annotation")
public void testMethod1() {
System.out.println("This is testMethod1");
}
}
public class MyMain {
public static void main(String[] args) {
Method[] methodList = MyObject.class.getMethods();
for (Method method : methodList) {
if(method.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation annotation=method.getDeclaredAnnotation(MyAnnotation.class);
String value=annotation.value();
System.out.println(method.getName() + ":" + value);
}
}
}
}
Reference
'Development > Development' 카테고리의 다른 글
패키징과 번들링 (0) | 2023.03.10 |
---|---|
GOF (Gang Of Four)와 디자인 패턴 (0) | 2023.03.10 |
추상 클래스와 인터페이스의 차이 (0) | 2023.03.10 |
함수형 프로그래밍에 대해 알아보자 (0) | 2023.03.10 |
객체 지향 프로그래밍에 대해 알아보자 (0) | 2023.03.10 |