1. Annotation 이란?
        - 본질적인 목적은 소스 코드에 메타데이터를 표현하는 것이다. 
            (메타데이터 : 데이터에 대한 데이터, 즉 어떤 목적을 가지고 만들어진 데이터)
        - 리플렉션(reflection)을 이용하면 어노테이션 지정만으로도 원하는 클래스를 주입하는 것 등이 가능하다.
 (리플렉션이란 객체를 통해 클래스의 정보를 분석해 내는 프로그램 기법을 말한다.)
        - 비지니스 로직에는 영향을 주지 않지만, 해당 타겟의 연결 방법이나 소스코드의 구조를 변경 할 수 있다.
        - Annotation의 종류에는 빌트인 어노테이션, 메타 어노테이션, 커스텀 어노테이션이 있다.

       



 2. 빌트인(Built-in) 어노테이션
         
    - 자바 SDK에서 지원하는 어노테이션으로 @Override, @Deprecated, @SuppressWarnings 등이 있다.

  • @Override : 어노테이션은 현재 메소드가 수퍼클래스의 메소드를 오버라이드한 메소드임을 명시한다.
                  만약 수퍼클래스 또는 구현해야할 인터페이스에 해당 메소드가 없으면 컴파일러가 에러를 발생시킨다.

  • @Deprecated : 해당 메소드가 더 이상 사용되지 않음을 표시한다. 
                      만약 사용할 경우 컴파일 경고를 발생시킨다.

  • @SuppressWarnings : 선언한 곳의 컴파일 경고를 무시하도록 한다.
                          Object형을 Element로 하는 컬렉션을 사용하면 컴파일러 경고가 발생하는데, 이 어노테이션을
                        사용하여 프로그래머의 의도적인 Object형 사용임을 알려 경고를 제거할 수 있다.

  • @SafeVarargs : 제너릭 같은 가변인자의 매개변수를 사용할 때의 경고를 무시한다.
  • @FunctionalInterface : 함수형 인터페이스를 지정하는 어노테이션.
                             만약 메소드가 존재하지 않거나, 1개 이상의 메소드가 존재할 경우 컴파일 오류를 발생시킨다.





      

 3. 메타(Meta) 어노테이션

  • @Retention : 자바 컴파일러가 어노테이션을 다루는 방법과 관련이 있다. 
                                        소스파일, 클래스파일, 런타임 중 어느 시점까지 어노테이션을 보유하고 있을 것인지를 결정한다.

  • @Target : 어노테이션이 적용할 위치를 선택한다.  @Target (ElementType.~)
    • ElementType.PACKAGE : 패키지 선언시
    • ElementType.TYPE : 타입 선언 시
    • ElementType.ANNOTATION_TYPE : 어노테이션 타입 선언시
    • ElementType.CONSTRUCTOR : 생성자 선언시
    • ElementType.FIELD : 멤버변수 선언시
    • ElementType.LOCAL_VARIABLE : 지역 변수 선언시
    • ElementType.METHOD : 메소드 선언시
    • ElementType.PARAMETER : 파라미터 선언시
    • ElementType.TYPE_PARAMETER : 파라미터 타입 선언시
    • ElementType.TYPE_USE : 타입선언시
  • @Documented : 해당 어노테이션을 Javadoc에 포함시킨다.
  • @Inherited : 어노테이션의 상속을 가능하게 한다.
  • @Repeatable : 연속적으로 어노테이션을 선언할 수 있게 해준다.


  (커스텀 어노테이션은 다음 글 : )




백준 2170번 선 긋기


문제 바로가기 : boj.kr/2170



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.BufferedReader
import java.io.InputStreamReader

fun main(args: Array<String>) {
    val br=BufferedReader(InputStreamReader(System.`in`))
    val n=br.readLine()!!.toInt()
    data class Pair(val start:Int,val end:Int):Comparable<Pair>{
        override fun compareTo(other: Pair): Int {
            return this.start.compareTo(other.start)
        }
    }
    val line=Array(n){ val (start,fin)=br.readLine()!!.split(" ").map { it.toInt() }
        Pair(start,fin)
    }
    line.sort()
    var now=line[0].start
    var res=0
    for(i in 0 until n){
        if(line[i].end>now){
            res += if(now>=line[i].start) {
                Math.abs(line[i].end - now)
            } else{
                Math.abs(line[i].end-line[i].start)
            }
            now = line[i].end
        }
    }
    println(res)
}
cs


백준 1017번 소수 쌍


문제 설명


 각 수에 대해 다른 수와 합이 소수이면 선택 가능하도록 간선을 만들어준다.

그리고 첫번째 수에 가능한 수를 하나씩 고정시켜놓고, 나머지를 이분매칭 시켜서 모두 매칭이 되면 res에 추가.

 

 1) 두 수의 합이 최대 2000까지이므로 에라토스테네스의 체로 2000까지 Boolean Array로 감별

 

 2) 하나의 숫자에 대해 다른 숫자와의 합이 소수이면 간선 추가.


 3) adj[0][0] , adj[0][1] ... adj[0][adj.size-1] 에 대해

 각각 B[adj[0][i]]=0 (즉, 첫번째 수와 i번째 수를 매칭시킴)

 그리고 나머지에 대해 이분매칭 



문제 바로가기 : boj.kr/1017


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*

fun main(args: Array<String>) {
    val br= BufferedReader(InputStreamReader(System.`in`))
    val n=br.readLine()!!.toInt()
    val arr=br.readLine()!!.split(" ").map { it.toInt() }
    val chkPrimeNum=BooleanArray(2001){true}
    val adj=Array(n){ LinkedList<Int>() }
    val visit=BooleanArray(n)
    val B=IntArray(n){-1}

    chkPrimeNum[1]=false
    for(i in 2..2000){ // 에라토스테네스의 체로 2000까지
        var j=2
        if(chkPrimeNum[i]) {
            while (i * j <= 2000) {
                chkPrimeNum[i*j]=false
                j++
            }
        }
    }

    for(i in 0 until n){ //간선 연결
        for(j in 0 until n){
            if(i==j)    continue
            if(chkPrimeNum[arr[i]+arr[j]]){
                adj[i].add(j)
            }
        }
    }

    fun go(here:Int):Boolean{
        if(visit[here]) return false
        visit[here]=true
        for(there in adj[here]){
            if(B[there]==-1||go(B[there])){
                B[there]=here
                return true
            }
        }
        return false
    }

    val res=LinkedList<Int>()
    for(i in 0 until adj[0].size){
        B.fill(-1)
        B[adj[0][i]]=0
        var count=1
        for(j in 1 until n){
            visit.fill(false)
            visit[0]=true
            if(go(j))   count++
            else break
        }
        if(count==n) res.add(arr[adj[0][i]])
    }
    if(res.isEmpty())   println(-1)
    else{
        res.sort()
        println(res.joinToString(" "))
    }
}

cs









+ Recent posts