만약 특정 작업을 수행할 메서드를 구별하는데 메서드 이름을 사용한다고 가정해보자.

만약 testRoute라는 메서드를 tsetRoute라고 잘못 기입했다면? 이는 실행되지 않을 것이다. 
이렇게 이름을 통해서 특정 기능을 실행하게 한다면, 오타와 같이 특수상황에서 실행이 되지 않았다는 것을 알기 어려울 뿐만아니라, 사용하기에도 네이밍 규칙을 지켜야하기 때문에 좋은 방법이 아니다.

이를 해결하기 위해서 사용하는 방법이 자바 1.5버전에 나온 어노테이션이다.

어노테이션을 이용하게 되면 실행될 메소드 지정하기 수월할 뿐 아니라 해당 메서드 안에서 예외가 발생하면 메서드가 실패한 것으로 지정하기도 편하다.

어노테이션 만들기

어노테이션 선언부 위에 존재하는 Retention, Target이라는 어노테이션들은 메타-어노테이션(Mete-annotation)이라고 부른다.

@Retention(RetensionPolicy.RUNTIME)은 Test가 실행시간에도 유지되어야 한다는 뜻.
@Target(ElementType.METHOD)는 Test가 메서드 선언부에만 적용할 수 있다는 뜻.

자세한 추가 어노테이션 생성 방법은 다음 사이트 참조.
http://i5on9i.blogspot.kr/2014/06/annotation.html 



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package effective35;
 
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
/**
 * Wedul라는 어노테이션 선언
 * 
 * @author wedul
 *
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Wedul {
    String value() default "hypocrisy";
}
cs




선언된 어노테이션을 사용



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
package effective35;
 
/**
 * Anotation 사용
 * 
 * @author wedul
 *
 */
public class AnotationClass {
    @Wedul
    public static void m1() {
        System.out.println("m1 run.");
    }
    
    @Wedul(value = "cjung")
    public static void m3() {
        System.out.println("m3 run.");
        throw new RuntimeException("Boom");
    }
    
    @Wedul
    public void m5() {
        System.out.println("m5 run");
    }
}
cs




어노테이션을 사용한 메서드 조작

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package effective35;
 
import java.lang.reflect.*;
 
public class WedulRun {
    public static void main(String[] args) throws Exception {
        for (Method m : AnotationClass.class.getDeclaredMethods()) {
            if (m.isAnnotationPresent(Wedul.class)) {
                try {
                    m.invoke(nullnull);
                } catch (Exception ex) {
                    System.out.println(m + " method is failed " + ex.getCause());
                }
            }
        }
    }
}
cs



다음과 같이 클래스를 로드한 후, 리플렉션기능을 이용하여 어노테이션이 붙은 메서드만을 호출할 수 있다.

출력결과
m3 run. 
public static void effective35.AnotationClass.m3() method is failed java.lang.RuntimeException: Boom 
m1 run. 
public void effective35.AnotationClass.m5() method is failed null 


결론
작명패턴을 이용하여 특정패턴의 이름을 가진 메소드를 실행하거나 하는 프로그램을 만들지 말고, 어노테이션을 사용하여 개발을 하면 위와 같이 정보의 품질을 향상시킬 수 있다.

하지만 어노테이션을 한번 잘못 정의하여 수정하게 되는경우 해당 어노테이션을 사용하는 부분에 다 수정을 해주어야 하기 때문에 신중하게 설계하여 만들어야 한다.

출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙35 인용.

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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
package java8;
 
 
 
public class Node {
 
 
 
 public Node next;
 
 public Node prev;
 
 private String value;
 
 
 
 public Node(String value) {
 
  this.value = value;
 
 }
 
 
 
 public Node() {
 
  
 
 }
 
 
 
 public String getValue() {
 
  return value;
 
 }
 
 
 
 public void setValue(String value) {
 
  this.value = value;
 
 }
 
}
 
 
 
 
 
 
 
 
package java8;
 
 
 
import java.util.Scanner;
 
 
 
public class MainClass {
 
 public static void main(String args[]) {
 
  System.out.print("값을 입력하세요. : ");
 
  Scanner in = new Scanner(System.in);
 
  Node parentNode = new Node(in.next());
 
  Node curr = parentNode;
 
  StringBuilder str = new StringBuilder();
 
 
 
  while (true) {
 
   System.out.print("값을 입력하세요. : ");
 
   String input = in.next();
 
   if (input.equals("-1")) {
 
    break;
 
   }
 
   Node node = new Node(input);
 
   curr.next = node;
 
   node.prev = curr;
 
   curr = node;
 
  }
 
 
 
  curr = parentNode;
 
 
 
  while (true) {
 
   System.out.print(curr.getValue() + " ");
 
   if (curr.next == null)
 
    break;
 
   curr = curr.next;
 
  }
 
  System.out.println();
 
 
 
  while (curr != null) {
 
   System.out.print(curr.getValue() + " ");
 
   if (curr.prev == null)
 
    break;
 
   curr = curr.prev;
 
  }
 
 }
 
}
cs


'JAVA > 알고리즘' 카테고리의 다른 글

정렬알고리즘 - 선택정렬  (0) 2018.05.28
10진수 2진수 변환  (0) 2018.05.28
더블링크드 리스트 구현하기  (0) 2018.05.28
백준 1924 - 요일 맞추기  (0) 2018.05.28
백준 2839 - 설탕 배달  (0) 2018.05.28
선택정렬, 버블정렬, 삽입정렬 예제  (0) 2016.12.22

하이브리드 앱

-> 웹 기술을 통해 앱을 개발하여 다양한 OS에 지원되는 앱을 칭한다



하이브리드 앱과 네이티브, 웹앱 비교

네이티브 앱

장점 : 빠르다, 네이티브 API 사용의 편의성

단점 : 언어의 제약, 플랫폼 한정적


웹앱

장점: 유지보수의 편리성, 크로스 플랫폼

단점 : 네이티브 액세스 못함


하이브리드 앱

장점 : 웹개발과 동일하여 개발의 연속성, 크로스 플랫폼

단점 : 성능이 느리다. (저사양 기기에서 호환안됨, 최저 OS 버전 필요)




아이오닉 소개

아니오닉

-> 웹 사이트와 웹 애플리케이션 개발에 사용했던 html, css, javaScript 등을 그대로 사용할 수 있게 해주는 도구와 유틸리티의 모음

-> AngularJS를 사용하여 웹 애플리케이션을 지원

-> 사용자 인터페이스와 UX를 지원

-> CLI 환경에서 명령어 사용을 통해 조작


코르도바

->플랫폼과 애플리케이션 사이의 브릿지를 생성하기 위한 도구이며, 설치 가능한 네이티브 앱을 만들어 준다.

 

 
개발환경 구축

-> node.js 설치하여 onic CLI 설치, 코르도바 설치

-> npm install -g cordova ionic



+ Recent posts