1. Java Annotation
- 현실 세계의 메타정보 : 다양한 측면에 대한 보조 정보(유통기한, 꽃말, 성분표 등)
- Java Annotation : Java 프로그램의 추가적인 정보를 주는 메타데이터 (@표시 사용)
- Java Annotation 종류
- Annotation의 용도 : 컴파일 타임 체크 및 오류 검출, Java 코드 문서화, 런타임 추가 기능 처리- >메타 프로그래밍에 사용됨
2. Java Annotation 컴파일 체크와 문서화
- 컴파일 타임 체크 : @Overriding(부모 메소드에 없으면 error 발생), @FunctionalInterface(메소드 1개 초과하면 error 발생), @Deprecate(사용되지 않는 메소드 표시)
@Override // 부모 클래스에 메소드 있는지 확인하여 오류 검출
public int calculatePrice(int price) {
price -= price * discountRatio;
this.bonusPoint += price * bonusRatio;
return price;
}
@FunctionalInterface //메소드가 1개 초과 있으면 오류 발생
public interface StringNum {
void printString(String s);
void printNum(int num);
}
@Deprecated. // 실행 부분에서 경고 메세지 현출
@Override
public int calculatePrice(int price) {
....
}
- Java 문서화 (= Java Docs) : 자바의 공식 문서화 도구, 클래스, 인터페이스 세부 정보 확인
public class FileUtil {
/**
* @param fileName String 읽을 파일 이름
* @return String 파일을 읽은 결과값
* @throws IOException 파일을 찾을 수 없는 경우 발생.
*/
public static String readFile(String fileName) throws IOException {
...
}
}
3. Java Meta Programming
- 주 사용 기술 : Java Custom Annotation(직접 정의한 Annotation), Java Reflection & Class 클래스(런타임때 해당 클래스의 메소드와 변수 접근 가능)
- Retention(Annotation 유지 기간 설정), Target(Annotation 적용 대상), Documented(Annotation이 javadoc에 포함 될지)
import java.lang.annotation.*;
@Retention(RetentionPolicy.RUNTIME) //런타임때까지 유지
@Target({ElementType.METHOD,ElementType.CONSTRUCTOR}) //메소드, 생성자에만 어노테이션 적용
@Documented //Javadoc에 사용자 정의 Annotation을 포함할지 여부
public @interface MyAnnotation {
String name();
int count() default 0; //count라는 속성의 default값 0으로 설정
}
-------------------------
@MyAnnotation(name = "Equals")
public boolean equals(Object obj) {
...
}
- Reflection과 Class 클래스
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Repeat {
int value();
}
public class MyClass {
@Repeat(value = 3)
public void printMessage() {
System.out.println("Hello World");
}
@Repeat(value = 10)
public void foo() {
System.out.println("this is another method");
}
}
public class AnnotationTest {
public static void main(String[] args) {
MyClass myObj = new MyClass();
AnntationUtils.executeMethodsByRepeatAnnotation(myObj);
}
}
public class AnntationUtils {
public static void executeMethodsByRepeatAnnotation(Object object) {
//어노테이션 정보를 가지고 실행하는 메소드
Class<?> clazz = object.getClass(); //어떤 클래스인지 뽑아냄
Method[] methods = clazz.getDeclaredMethods(); //클래스의 모든 메소드를 가져옴
for (Method method : methods) { //각 메소드에 대해 반복문 돌며
Annotation[] annotations = method.getDeclaredAnnotations();
//메소드에 정의된 모든 어노테이션 가져오기
for (Annotation annotation : annotations) {
//모든 어노테이션 중에
if (annotation instanceof Repeat) {
//Repeat라는 어노테이션 있으면
Repeat repeatAnnotation = (Repeat) annotation;
int repeatCount = repeatAnnotation.value();
//Repeat 어노테이션에서 value() 필드 접근
for (int i = 0; i < repeatCount; i++) {
try {
method.invoke(object);
//Repeat어노테이션이 붙어 있는 메소드 동적 실행
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
1. Java 빌드란? 빌드툴이란?
- 빌드 : Java Application을 실행할 수 있는 상태로 만들기 -> 빌드 : Compile + 기타 작업
- 빌드 툴 : 정형화된 빌드 작업을 자동화 하기 위한 시스템
2. Java Gradle 빌드 툴
- 간결한 스크립트, 빠른 빌드속도(Maven 5배 빠름), IntelliJ와 호환성 높음
- Gradle 빌드 툴을 잘 사용하려면 ?
- Java Gradle 프로젝트 구조, Java Gradle Tasks, Java Gradle DSL //3가지 개념 이해 필수
- Java Gradle 프로젝트
- Project : Java 코드,파일을 묶는 최상위 작업 단위
- Module : Java 코드, 파일을 묶는 단위
- ./gradle : gradle 명령 파일 모음 (= wrapper)
- ./src : Java 코드, 기타 파일을 모으는 폴더
--./src 구조
-- 0. resource : 실행, 테스트 시 사용할 java 외 파일
-- 1. org.example : Java Group 패키지
-- 2. /main : Java 실행코드, 파일 패키지
-- 3. Main.java : java 실행 클래스
-- 4. /test 패키지 : Java 테스트 코드, 파일 패키지
-- 5. .gradle 파일 : gradle 모듈 관련 파일
- Java Gradle Tasks
- compile.java : 컴파일 과정
- javadoc : 문서화 작업
- check : 코드 테스트 및 리포트
- jar : java 압축화 파일(.jar) 생성