참조

https://d2.naver.com/helloworld/1286587
https://www.holaxprogramming.com/2017/10/09/java-jvm-performance/



'IT > JAVA' 카테고리의 다른 글

Java Method Signature  (0) 2017.12.08
VO vs DTO  (0) 2017.01.12
String VS SringBuffer VS StringBuilder  (0) 2016.10.14
Annotaion  (0) 2016.05.09

Java의 Method Signature란

Java에서 메소드가 무엇인지 먼저 알아보자.

메소드는 일련의 코드를 포함하는 코드 블록으로 프로그램에서 파라미터를 지정하여 메소드를 호출하고 실행할 수 있다. Java에서 실행되는 모든 명령은 메소드의  Context에서 수행되며, main 메소드는 모든 Java 프로그램의 진입접으로 JVM(Java Virtual Machine)에 의해 호출된다. 


아래 간단한 메소드 예제이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Method {
    public static int Plus(int a, int b) {
        return a + b;
    }
 
    public static int Minus(int a, int b) {
        return a - b;
    }
 
    public static void main(String[] args) {
        int result = Plus(34);
        System.out.println(result);
 
        result = Minus(52);
        System.out.println(result);
    }
}
 
cs



메소드는 파라미터를 "()"로 묶고 ","로 구분한다. 빈 괄호는 메소드에 파라미터가 없다는 의미이지만 괄호를 생략할 수 없다.

또한 메소드는 클래서에서 public (공개), private(비공개), protect 와 같은 Access 수준과 abstract(추상), final(최종)과 같은 선택적 한정자, 반환값, 메소드 이름 및 메소드 파라미터를 지정하여 선언한다. 

이러한 메소드를 생성하기 위한 규칙들을 중 메소드의 이름과 파라미터 만을  메소드의 시그니처(Method Signature)라고 한다.




참고 : 

http://ngmaster.tistory.com/entry/151-Java-%EB%A9%94%EC%86%8C%EB%93%9C%EC%9D%98-%EC%8B%9C%EA%B7%B8%EB%8B%88%EC%B2%98-Methods-Signature

https://stackoverflow.com/questions/16149285/does-a-methods-signature-in-java-include-its-return-type

'IT > JAVA' 카테고리의 다른 글

GC 튜닝 절차  (0) 2018.11.09
VO vs DTO  (0) 2017.01.12
String VS SringBuffer VS StringBuilder  (0) 2016.10.14
Annotaion  (0) 2016.05.09

VO vs DTO

 

VO(Value Object)

-       데이터 그 자체로 의미 있는 것을 담고 있는 객체이다.

-       DTO와 동일한 개념이나 차이점은 Read–Only 속성 객체이다.

-       간단한 독립체( Entity ) 의미하는 작은 객체를 의미한다

-       관계데이터베이스의 레코드에 대응되는 자바클래스이다.

n   형태는 Database레코드를 구성하는 필드들을 VO Attribute로 하고 해당 변수에 접근 할 수 있는 Getter Setter 메소드의 조합으로 클래스를 형성되어진 클래스이다.

n   거의 불변성을 가지고 equals()로 비교할 때 객체의 모든 값을 비교해야 한다.

 

색상으로 예를 들어보겠다. 색상 중에 빨강과 초록을 RGBA로 나타내면 RGBA(255,0,0,0) RGBA(0,255,0,0) 표현된다. 나아가서 코드명이 붙은 색상도 존재할 거이다. 코드로 보면 아래와 같다.

 

1

2

3

4

5

6

7

8

9

10

11

12

13

class Color {

 

private int R,G,B,A;

 

public Color(int r,int g, int b, int a){…}

 

//getters and setters

 

public final static Color RED = new Color(255,0,0);

 

public final static Color GREEN = new Color(0,255,0,0);

 

}

Colored by Color Scripter

cs

 

위와 같은 색상 객체가 있고 빨강과 초록이 있다. 코드에서 빨강 또는 초록을 사용할 때, Color.RED, Color.GREEN 를 사용하면 된다. , 값 객체 Color.RED, Color.GREEN 자체로서 의미가 있게 된다.

 

DTO(Data Transfer Object)

-       전송되는 데이터의 컨테이너이다.

-       VO와 동일하게 데이터를 저장하여 사용하도록 하는 부분에서 필요하다.

-       VO와 비교를 하여 보면 DTO는 같은 시스템에서 사용되는 것이 아닌 다른 시스템으로 전달하는 작업을 처리하는 객체이다.

-       Layer간의 통신 용도로 오가는 객체를 말하기도 한다.

-       현재의 개발 환경에서 보통 데이터는 다음과 같이 흐름으로 이동한다.

n   서버 측 : Database Column Data -> DTO -> API(JSON or XML) -> Client

n   클라이언트 측 : Server -> API(JSON or XML) -> DTO -> View or Local Database System

 

VO DTO 정리 :

-       VO : 사용 되는 값이 객체로 표현 되며, 값 변경이 없는 경우를 말한다.

-       DTO : 데이터의 전송을 위한 객체이며, 비지니스 로직까지 담아서 사용하기 한다.

 

그런데 VO/DTO에 대한 논쟁도 많고 반드시 사용 용도를 구분하는 건 무의미해 보인다. 개발팀 내에서 용도를 정해서 사용하면 좋을 것 같다.

예를 들어 외부 시스템과 데이터 통신을 할 경우에는 DTO, DB에서 가져오는 DataVO로 정의해서 사용한다고 약속을 하면, 향후 DTO/VO를 수정할 경우 좀 더 고민할 여지가 생길것 같다.

 

참고 사이트

http://mrgamza.tistory.com/49

https://martinfowler.com/bliki/ValueObject.html

http://parkgaram.com/blog/vo-%EC%99%80-dto-%EC%B0%A8%EC%9D%B4/

'IT > JAVA' 카테고리의 다른 글

GC 튜닝 절차  (0) 2018.11.09
Java Method Signature  (0) 2017.12.08
String VS SringBuffer VS StringBuilder  (0) 2016.10.14
Annotaion  (0) 2016.05.09

이번에는 자바에서 많이 사용하게 되는 문자열 Class에 대해 알아보자.


Java에서 제공하는 문자열 Class String, StringBuffer, StringBuilder들이 있다.


보통은 String Class를 사용하지만 Java를 좀더 Deep 하게 알게 되고, 문자열 처리에서 시간이 너무 많이 걸렸던 문제를 경험하게 되면 StringBuffer를 사용하게 된다. 두 문자열 Class의 차이는 메모리 처리인데 그로 인해 상황에 따라 성능 차이가 발생하게 된다.


그럼 각 Class의 차이점에 대해 알아보자.


간단히 보면 아래 표와 같다.


String

StringBuffer

StringBuilder

Immutable(불변함)

Mutable(변함, 변하기 쉬움)

 

synchronized

unsynchronized


그럼 차이점을 기준으로 하나씩 이야기 해보겠다.


먼저 String StringBuffer/StringBuilder의 차이점부터 확인해보자.


String은 변경이 불가능한 immutable 클래스이다. (String는 내부적으로 char[]를 사용하는데 이 배열은 변경이 불가능하다. ) , 한번 생성되면 String 객체가 변할 수 없다. 여기서 변경이 불가능하다는 말이 무슨 뜻일까?


먼저 아래 소스를 보자.



String str = "Hello";

        str = str.concat(" World");

    str += " JAVA";



위에서 문자열 처리에 사용한 concat() 메소드와 “+” 연산자를 보면 처음 생성한 str String 객체가 변경이 가능한 것처럼 보인다. 하지만 String Class의 동작 원리를 보면 원래 객체와 다른 새로운 String 객체를 만들어 반환해 준다. 새로 String 객체가 생성되기 때문에 기존 String 객체가 가지고 있는 문자열은 변경되지 않은 체 사용 가능한 상태로 남아있는다

아래 그림을 통해 이해해 보자.

str에 문자열이 더해질 때 마다 추가한 문자열이 합쳐진 String 객체가 새로 생성하여 str 변수에 해당 객체의 주소 정보로 갱신해 주는 것이다.  다시 설명 하면 처음 “Hello” 문자열을 가진 객체의 내용을 바꾸는 게 아니라 새 String 객체를 만들어 “Hello World” 라는 문자열 저장하고 객체의 주소를 str 변수에 다시 할당해 주는 것이다. (, String 클래스 객체는 Heappermanent area(Garbage Collection 대상 영역)에 생성되며, 한 번 생성된 객체의 내부 내용을 변화시킬 수 없다그리고 기존 객체를 사용하는 곳이 없으면 GC로 회수된다.)


위와 같은 동작 원리 때문에 String Class의 변경은 객체를 생성하기 위한 시간과 메모리를 낭비하게 되고, GC의 발생 빈도를 높아지게 된다.


하지만 Immutable ClassString Class에서 문자열은 오직 생성자에서만 생성이 가능하고 변경이 불가능하기 때문에 변경을 원한다면, 원하는 값을 가진 새로운 객체를 생성해야 한다. 그래서 변경은 적고 읽기만 많은 경우, 또는 여러 쓰레드나 객체에서 공유하는 경우 synchronization(동기화) 와 같은 특별한 안정장치 없이도 안전하게 공유할 수 있게 된다.


이런 이유 때문에 대부분의 문자열이 복잡한 문자열 처리과정보다는 한번 설정된 문자열들을 여러 곳에서 공유하는 경우가 많으므로 자바에서 기본 문자열을 처리하는 클래스로 String 클래스를 immutable 패턴으로 설정했다.


그럼 이제 Mutable ClassStringBuffer/StringBuilder 클래스에 대해 알아보자.


StringBuffer/StringBuilder Classappend(), insert(), delete() 등의 메소드를 통하여 StringBuffer/StringBuilder 객체가 가지고 있는 문자열을 변경 할 수 있으며, Mutable Class이기 때문에 String Class처럼 새로운 객체를 생성하지 않고 기존의 문자열을 변경한다. (String과 마찬가지로 내부적으로 char[]을 사용하지만 이 값은 변경이 가능하다.)


먼저 아래 소스를 보자


StringBuffer sb = new StringBuffer();

        sb.append("Hello");

        sb.append(" World");

        sb.append(" JAVA");


위 코드를 실행하면 StringBuffer/StringBuilder new 연산자가 한번만 실행하게 된다. 다시 풀어 쓰면 한번 생성된 StringBuffer/StringBuilder 객체 크기를 증가시키면서 값을 더한다. 아래 그림의 통해 StringBuffer/StringBuilder Class가 어떻게 동작하는지 이해해 보자.

sb 변수에 처음 할당된 StringBuffer/StringBuilder() 객체의 주소의 변경 없이 기존 객체의 공간이 부족하게 되면 기존 버퍼의 크기를 증가 시키면서 새로운 문자열을 더하고 있다. 위와 같이 객체 생성을 생성하지 않는 원리 때문에 String 클래스 보다 효율적이라고 생각하기 쉽다. 하지만 동기화 처리 때문에 단순 참조일 경우에는 상대적으로 성능이 낮아 진다.


그럼 이제 StringBuffer StringBuilder 차이에 대해 알아보자. 기본적으로 두 클래스가 제공하는 메소드는 동일하지만 차이점은 StringBuffer는 멀티 쓰레드 상태에서 동기화를 지원하지만 StringBuilder는 동기화를 지원하지 않는다는 것이다. StringBuffer에서 제공하는 메소드에는 synchronized 적용되고 있다는 것이다. Class 소스 일부를 보면 아래와 같다.


public final class StringBuffer {

 public synchronized StringBuffer append(String str) {

super.append(str);

return this;

}

[...]

}

public final class StringBuilder {

public StringBuilder append(String str) {

super.append(str);

return this;

}

[...]

}



같은 메소드이지만 StringBuffer Class의 메소드는 synchronized keyword가 있는 걸 확인할 수 있다. 이로 인해 ThreadSafe한 설계가 가능해 진다. 그래서 여러 개의 스레드에서 하나의 StringBuffer 객체를 처리해도 문제가 되지 않는다. 그와는 반대로 StringBuilder Class의 메소드들은 ThreadSafe 하지 않기 때문에 여러 개의 스레드에서 하나의 StringBuilder 객체를 처리하게 문제가 발생하게 된다.


그렇기 때문에 멀티스레드 환경이라면 값 동기화 보장을 위해 StringBuffer를 사용하고, 단일스레드 환경이라면 StringBuilder를 사용하는 것이 좋다. 단일스레드환경에서 StringBuffer를 사용해도 문제는 없지만 동기화 처리 때문에 StringBuilder에 비해 성능이 떨어진다.


JDK 1.5 버전 이전에서는 문자열 연산(+, concat)을 할 때에는 조합된 문자열을 새로운 메모리에 할당하여 참조함으로 인해서 성능상의 이슈가 있었다그러나 JDK 1.5 버전 이후부터는 컴파일 단계에서 String 객체를 사용하더라도 StringBuilder로 컴파일 되도록 변경되었다그래서 JDK 1.5 이후 버전에서는 String 클래스를 활용해도 StringBuilder와 성능상으로 차이가 없어졌다.


단순한 성능만 놓고 본다면 연산이 많은 경우 아래와 같이 된다.


StringBuilder > StringBuffer >>> String


하지만 사용하는 환경에 따라 성능이 차이가 나기 때문에 다양한 고려 사항을 고민해서 선택해서 사용 해한다. 간단하게 정리하면 아래와 같다.


-       멀티 쓰레드 환경에서 하나의 문자열에 대하여 다른 문자나 문자열의 추가가 많이 발생할 경우 StringBuffer 클래스를 사용하는 게 유리하다.

-       멀티 쓰레드 환경에서 하나의 문자열에 대하여 다른 문자나 문자열의 추가가 많이 발생할 경우 StringBuilder 클래스를 사용하는 게 유리하다.

-       String 클래스는 문자열의 + 연산 회수가 많지 않을 경우에 유리하다.

참고 사이트
  • http://javacan.tistory.com/entry/39
  • http://skynaver.tistory.com/entry/String%EA%B3%BC-StringBuffer%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90
  • https://slipp.net/questions/271
  • http://fowler.egloos.com/1243657


'IT > JAVA' 카테고리의 다른 글

GC 튜닝 절차  (0) 2018.11.09
Java Method Signature  (0) 2017.12.08
VO vs DTO  (0) 2017.01.12
Annotaion  (0) 2016.05.09

1. JAVA Annotation이란?

- Java Annotation은 자바5(JEE5)부터 제공되기 시작한 문법 요소로서 @를 이용한 주석이다.

- 자바에서 사용하는 "//, /**/"와  같은 주석과는 다른 의미로, 클래스나, 멤버 변수, 멤버 메서드, 지역 변수, 매개 변수 등 구성요소에 '부착'되는 주석입니다.

@customAnnotation

public class CustomAnnotationSample 

{

...

}


- CustomAnnotationSample이라는 클래스에 @customAnnotation이라는 Annotaion을 사용했다. 단순히 CustomAnnotationSample  Class에 customAnnotation이라는 라벨를 달았다고만 생각하면 된다. Annotaion을 달았다고 어떤 기능이 동작하거나 생기는건 아니다. 제품들에 바코드가 붙었다고 무슨 기능을 하지 않는 것처럼 바코드 리더로 찍어보기 전에는 아무런 의미가 없다. 바코드를 읽는 바코드 리더기와 같이 Annotaion 부착된 구성요소는 자바의 Reflection 을 이용하여 기능을 부여할 수 있다.

2. Annotaion 사용 용도

- 데이터를 문서화하거나, 컴파일 타임이나 런타임시에 원하는 동작을 수행할 수 있도록 하는 데 사용

- 해당 엘리먼트에 대해 생성된 자바 바이트코드를 변경하지 추가 수식자 (modifier)라 할 수 있음

- 어노테이션이 나오기 전까지 메타데이터는 프로퍼티 파일과 XML파일을 활용


3. Annotation의 장점

- 코드의 가독성 증대 : 관련 코드 곁에 메타데이터를 설정할 수 있으므로 코드의 가독성 증대

- 개발 효율성 증대 : 복잡한 XML 스키마를 파악하지 않아도 되며, 개발시 개발 툴과 컴파일러의 도움을 받을 수 있으므로 개발 효율성이 증대

- 별도의 파서를 적용하지 않고도 간단히 런타임 시에 활용할 수 있는 편리함

- JUnit, Framework, Permission Module 에서 사용


4. Annotation의 단점

- Annotaion 처리시 리플렉션을 통해 해당 클래스를 분석해야 하는 오버헤드 발생

- XML 파일을 이용하는 방법도 오버헤드가 있으므로, 경우에 따라서 Annotaion이 더 빠를 수도 있음.

- Annotaion은 모듈이나 어플리케이션 전반적인 메타데이터를 설정할 수 없음 : Annotaion의 범위는 클래스나 패키지 레벨로 한정되기 때문에 여러 클래스에 걸친 공통적인 설정이나 모듈레벨 설정이 어렵움, 웹 어플리케이션 개발시 서블릿 필터나, 인터셉터를 이용해서 문제 해결이 가능함.



5. Annotaion 종류

Annotaion은 메타데이터 저장을 위해 클래스처럼 멤버의 개수에 따라 Marker/Single-Value/Full Annotaion으로 분류

1) Marker Annotaion 

 - 멤버 변수가 없으며, 단순히 표식으로서 사용되는 Annotaion이다. 컴파일러에게 어떤 의미를 전달

 - @AnnotationName

2) Single-Value Annotaion 

 - 멤버로 단일 변수만 갖는 Annotaion. 단일 변수 밖에 없기 때문에 (값)만을 명시하여 데이터를 전달

 - @AnnotationName(elementValue)

3) Full Annotaion 

 - 멤버로 둘 이상의 변수를 갖는 Annotaion으로, 데이터를 (값=쌍)의 형태로 전달

 - @AnnotationName(element=value, element=value, ...)


6. Built-In Annotaion

1) Standard Annotations

JAVA에서 지원하는 Annotaion으로 @Override, @Deprecated, @SuppressWarning등이 있다.

(1) @Override

    - 메소드에 대해서만 사용

- 해당 메소드가 부모 클래스에 있는 메소드를 오버라이드 했다는 것을 명시적으로 선언

- 만일 자식 클래스에 부모 클래스에 해당하는 메소드가 없으면 컴파일러가 인지하여 에러 발생 시킴


(2) @Deprecated

- Marker Annotaion으로 클래스, 메소드, 필드 등에 선언하며 지정한 요소가 더이상 사용되지 않음을 의미

- 컴파일러는 deprecated된 메소드나 클래스 혹은 변수를 사용할 때마다 경고를 발생


(3) @SuppressWarnings

- 클래스, 메소드, 필드의 선언, 컴파일러의 경고를 제거(이 부분에 대해서 경고문을 출력하지 말라는 의미)

- 참고로 다른 Annotation 과 다르게 속성값을 지정해 줄 수도 있다. 

- all, deprecation, unchecked, fallthrough, path, serial, finally 등의 금지 옵션이 있음.

 ex) @SuppressWarnings("deprecation"), @SuppressWarnings("serial")



2) Custom Annotations

 - 개발자가 정의하는 Annotaion으로 class 형태로 만들어짐

 - Annotaion 선언은 @interface 로 한다.

 - 이름 앞에 '@' 문자가 오는 것 외에는 기본적으로 인터페이스를 선언하는 것과 동일(메소드들의 내용은 없고 형태만 선언)

 - default 가 찍히지 않은 메소드는 필수로 입력해야 함

1. Custom Annotations 정의

// 메소드와 클래스가 여전히 작업중임을 나타내기 위해 정의한 Marker Annotaion

public @interface customAnnotation{}

       - Annotaion 정의 파일을 컴파일하고, 이파일을 클래스패스에서 참조할 수 있으면 다른 소스코드상에서 Annotaion을 사용 할 수 있다.

  

2. 멤버 추가하기

  - Annotaion 유형은 멤버 변수를 가질 수 있으며, 이 변수들 컴파일시 또는 런타임에 메타데이터로서 사용될 수 있다.

    이렇게 정의를 하면 자동으로 accessor와 mutator를 제공해준다.

 public @interface customAnnotation{

public int value();

}

- 정의한 Annotaion을 다음과 같이 사용한다.

@customAnnotation(vale = 1)

public void customAnnotationSample(){

// ..

}

- 단일 멤버를 갖을 경우에만 위와 같이 사용할 수 있다.

3. 디폴트 값 설정하기

public @interface customAnnotation{

public int value();

public String desc() default "My Custom Annotation"

}

- 디폴트값을 사용한 예는 다음과 같다.

@customAnnotation(vale = 1)

public void customAnnotationSample(){

// ..

}

3) Meta-Annotations

(1) @Target

 - 어노테이션을 정의 시 어노테이션이 사용 가능한 대상을 지정

 - ElementType의 상수로 정의

- ANNOTATION_TYPE : Annotaion 형

- CONSTRUCTOR : 생성자

- FIELD : enum 상수를 포함한 필드(멤버변수)

- LOCAL_VARIABLE : 지역변수

- METHOD : 메소드

- PACKAGE : 패키지

- PARAMETER : 매개변수

- TYPE : 클래스, 인터페이스(어노테이션 형 포함), 열거형

@Target({ElementType.TYPE,

ElementType.METHOD,

ElementType.CONSTRUCTOR,

ElementType.ANNOTATION_TYPE})

public @interface customAnnotation{

public int value();

public String desc() default "My Custom Annotation";

}

(2) @Retention

 - Annotaion정보의 유지 범위를 설정, JVM이 어떻게 사용자 어노테이션을 다루어야 하는지를 서술

 - RetentionPolicy의 상수로 정의

- SOURCE : Annotaion 정보를 클래스 파일에 저장되지 않고 소스를 처리하는 도구에서만 사용.

- CLASS : Annotaion 정보를 컴파일러는 클래스 파일에 저장하지만 VM에서는 읽지 않고 버려짐.

- RUNTIME : Annotaion 정보를 컴파일러는 클래스 파일에 저장하고, VM에서 저장된 정보를 읽음.

@Retention(RetentionPolicy.RUNTIME)

public @interface customAnnotation{

public int value();

public String desc() default "My Custom Annotation"

}  

(3) @Documented : @Documented 해당 어노테이션을 Javadoc에 포함

(4) @Inherited :서브 클래스가 부모 어노테이션을 상속받도록 함

7. Annotation 접근

 - 실행중인 프로그램에서 Annotation에 접근하는 방법을 알아보자.

 - 인터페이스 java.lang.reflect.AnnotateElement를 통해서 실행중인 Annotation에 접근 할 수 있다.

 - boolean isAnnotationPresent(Class<? extends Annotation> annotationType)

- Annotation 존재 여부를 반환한다.

- Annotation이 존재하면 true, 존재하지 않으면 false 반환

 - <T extends Annotation> T getAnnotation(Class<T> annotationType)

- Annotation을 반환

 - Annotation[] getAnnotations()

- 존재하는 모든 Annotation들을 반환 (private 제외)

 - Annotation[] getDeclaredAnnotations()

- 존재하는 모든 Annotation들을 반환 (private 포함)

앞에서 만든 Annotaion 값 확인해보자

import java.lang.reflect.Method;



@customAnnotation(value=0)

public class CustomAnnotationSample 

{

    @customAnnotation(value=1)

    public static void main(String[] args) {

    CustomAnnotationSample customAnnotationSample = new CustomAnnotationSample();

    customAnnotationSample.checkAnnotations(CustomAnnotationSample.class);

    }

 

    @customAnnotation(value=2)

    public void customAnnotation1() {

    }

    @customAnnotation(value=3, desc="My Second Custom Annotation")

    public void customAnnotation2() {

    }

    @customAnnotation(value=4, desc="My Third Custom Annotation")

    public void customAnnotation3() {

    }

 

    @SuppressWarnings({ "rawtypes", "unchecked" })

public void checkAnnotations(Class customAnnotationSampleClass){

    customAnnotation annotation = null;

    if(customAnnotationSampleClass.isAnnotationPresent(customAnnotation.class))

    {    

    annotation = (customAnnotation) customAnnotationSampleClass.getAnnotation(customAnnotation.class);

    int value = annotation.value();

            String desc = annotation.desc();

            System.out.println(customAnnotationSampleClass.getSimpleName() + " Class : value=" + value + " desc=" + desc);

    }

        Method[] methods = customAnnotationSampleClass.getDeclaredMethods();

        for ( Method tempMethod:methods ){

            annotation = tempMethod.getAnnotation(customAnnotation.class);

            if ( annotation != null ){

                int value = annotation.value();

                String desc = annotation.desc();

                System.out.println("This Method "+ tempMethod.getName() + "() : value=" + value + " desc=" + desc);

            } else {

                System.out.println("This Method "+ tempMethod.getName() + "() : Annotation is not exist");

            }

        }

    }

}


결과

CustomAnnotationSample Class : value=0 desc=My Custom Annotation

This Method main() : value=1 desc=My Custom Annotation

This Method customAnnotation1() : value=2 desc=My Custom Annotation

This Method customAnnotation2() : value=3 desc=My Second Custom Annotation

This Method customAnnotation3() : value=4 desc=My Third Custom Annotation

This Method checkAnnotations() : annotation is not exist



8. Annotation Processing Tool

 - Annotation의 소스를 체크하고 컴파일을 처리해줌

 - JDK 5에는 어노테이션을 읽고 이해하는 API가 표준화되어 있지 않아 JDK에 들어있는 썬 고유의 라이브러리를 사용했고, 자바 SE 6에 기본으로 포함되었다.

 - JDK 5에는 APT(Annotation Processing Tool)라는 패키지가 포함되어, JSR 269(JSR 269 Pluggable Annotation Processing API)가 나오기 전까지 임시로 그 역할을 대신했다.

 - Apache Ant에서는 APT에 대응하는 앤트 타스크를 따로 두어 지원하였다. http://ant.apache.org/manual/CoreTasks/apt.html에서 확인할 수 있다

 

참고 사이트

http://wiki.gurubee.net/display/DEVSTUDY/Annotation

http://hiddenviewer.tistory.com/88

http://gubok.tistory.com/167

http://secretroute.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%9D%98%E7%A5%9E-Vol1-Annotation

http://ellehu.com/java/3727

http://piece.tistory.com/7

http://www.nextree.co.kr/p5864/

'IT > JAVA' 카테고리의 다른 글

GC 튜닝 절차  (0) 2018.11.09
Java Method Signature  (0) 2017.12.08
VO vs DTO  (0) 2017.01.12
String VS SringBuffer VS StringBuilder  (0) 2016.10.14

+ Recent posts