카테고리 없음

2024. 7. 22. (월) 슈퍼코딩 부트캠프 Day 43 / 주특기 5주차

태영9922 2024. 7. 22. 13:31

 

1. Java Annotation

  • 현실 세계의 메타정보 : 다양한 측면에 대한 보조 정보(유통기한, 꽃말, 성분표 등)
  • Java Annotation : Java 프로그램의 추가적인 정보를 주는 메타데이터 (@표시 사용)
  • Java Annotation 종류
출처 :  https://velog.io/@anak_2/Java-annotations-%EC%9D%B4%EB%9E%80-%EC%84%A4%EB%AA%85-%ED%99%9C%EC%9A%A9

 

  • 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
출처 :  https://docs.gradle.org/current/userguide/java_plugin.html

 

- compile.java : 컴파일 과정

- javadoc : 문서화 작업

- check : 코드 테스트 및 리포트

- jar : java 압축화 파일(.jar) 생성