[Java] 메소드 하나에 한해서 제너릭 사용하기

1
2
3
4
5
6
class B{
    static public <t> t toString(t a){
        System.out.println(a.toString());
        return a;
    }
}

 

 

이렇게 하면 객체를 생성하지 않아 제너릭 타입을 스테이틱 메소드에서는 사용이 불가능 하던 것을 스테이틱 메소드 하나에 한해서 제너릭을 사용이 가능하도록 할 수 있다. 명시된 리턴 타입 앞에 제너릭을 붙여준다.

 

이런 기법은 주로 Collection 프레임 워크에서 많이 사용한다..

댓글()

Throwable.getStackTrace() - 자신을 호출한 이전 메소드 혹은 클래스 정보 보기.

package test;

public class M {
    
    public static void main(String[] args) {
        new M().a();
    }
    
    void a(){
        b();
    }
    
    void b(){
         StackTraceElement[] a = new Throwable().getStackTrace();
         
         for(int i = a.length - 1; i > 0 ; i--){
             System.out.print("클래스 - " + a[i].getClassName());
             System.out.print(", 메소드 - "+a[i].getMethodName());
             System.out.print(", 라인 - "+a[i].getLineNumber());
             System.out.print(", 파일 - "+a[i].getFileName());
             System.out.println();
         }
    }
}
결과

클래스 - test.M, 메소드 - main, 라인 - 7, 파일 - M.java
클래스 - test.M, 메소드 - a, 라인 - 12, 파일 - M.java

Throwable 클래스의 getStackTrace 메소드를 이용하면 자신(메소드)를 호출한 이전 메소드나 클래스의 정보를 볼 수 있다.

댓글()

값 추가삭제변경이 불가능한 컬렉션 계열 클래스

리스트나 맵등 Collection과 Map계열 클래스들은 앞에 final을 붙혀주면 일반 변수와 마찬가지로 초기 선언한 값 외에 수정이 불가능 하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
          
          System.out.println(A.list.toString());
        
        A.list.add("d"); //변경하려고 하면 java.lang.UnsupportedOperationException이 발생한다.        
        System.out.println(A.list.toString());
                
    }
}
 
class A{
    public static final List<String> list = Arrays.asList(new String[] {"a""b""c"});
}

 

결과 :

[a, b, c]

Exception in thread "main" java.lang.UnsupportedOperationException
 at java.util.AbstractList.add(Unknown Source)
 at java.util.AbstractList.add(Unknown Source)
 at a.Main.main(Main.java:6)
 

- Collections.unmodifiable... 메소드를 이용하는 방법도 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Main {
    public static void main(String[] args) {
        
        System.out.println(A.list.toString());
 
        A.list.add("d");
        System.out.println(A.list.toString());
        
    }
}
 
class A{
    public static List<String> list = Collections.unmodifiableList(Arrays.asList(new String[] {"a""b""c"}));
}

결과는 위와 동일.

 

댓글()

대충 만들어본 로그 클래스

Logger.java
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
public class Logger {
    
    public static final int NO = LoggerConfigLoader.NO_STATUS;
    public static final int INFO = LoggerConfigLoader.INFO_STATUS;
    public static final int DEBUG = LoggerConfigLoader.DEBUG_STATUS;
        
    private int status = Logger.NO;
    private String className = "";
        
    public Logger(){};    
    
    public Logger(int status){
        this.status = status;
    }
    
    public Logger(Class<?> clazz, int status){
        this.className = clazz.getCanonicalName();
        this.status = status;
    }
    
    public void info(String text){ infoPrint(text); }
    public void info(Object text){ infoPrint(text.toString()); }
    public void info(boolean text){ infoPrint(String.valueOf(text)); }
    public void info(double text){ infoPrint(String.valueOf(text)); }
    public void info(short text){ infoPrint(String.valueOf(text)); }
    public void info(float text){ infoPrint(String.valueOf(text)); }
    public void info(long text){ infoPrint(String.valueOf(text)); }
    public void info(char text){ infoPrint(String.valueOf(text)); }
    public void info(byte text){ infoPrint(String.valueOf(text)); }
    public void info(int text){ infoPrint(String.valueOf(text)); }
    
    public void debug(String text){ debugPrint(text); }
    public void debug(Object text){ debugPrint(text.toString()); }
    public void debug(boolean text){ debugPrint(String.valueOf(text)); }
    public void debug(double text){ debugPrint(String.valueOf(text)); }
    public void debug(short text){ debugPrint(String.valueOf(text)); }
    public void debug(float text){ debugPrint(String.valueOf(text)); }
    public void debug(long text){ debugPrint(String.valueOf(text)); }
    public void debug(char text){ debugPrint(String.valueOf(text)); }
    public void debug(byte text){ debugPrint(String.valueOf(text)); }
    public void debug(int text){ debugPrint(String.valueOf(text)); }
    
    private void infoPrint(String text){
        if(((status & Logger.INFO) == Logger.INFO) || (status >= Logger.INFO)){
            printText(Logger.INFO, text);
        }
    }
    
    private void debugPrint(String text){
        if((status & Logger.DEBUG) == Logger.DEBUG){
            printText(Logger.DEBUG, text);
        }
    }
    
    private void printText(int status, String text){
        String statusString = "";
        
        switch(status){
        case Logger.INFO:
            statusString = "[info]";
            break;
        case Logger.DEBUG:
            statusString = "[debug]";
            break;
        }
        
        System.out.println(statusString + ((status >= 2)?this.className + " - " : "") + text); 
        
    }
 
}
 

 

- LoggerFactory.java(LoggerConfig.class, Wk5LoggerConfigLoadException.class 포함)

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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package com.wakeup.module.commons.log;
 
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
 
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
 
public class LoggerFactory {
    private LoggerFactory(){}
    
    public static Logger getLogger(Class<?> clazz){
        
        LoggerConfigLoader l = LoggerConfigLoader.getAndLoadLoggerConfig();
        
        return new Logger(clazz, l.getLogStatus());
    }
}
 
class LoggerConfigLoader{
    /* 설정 파일 값들 */
    /* 값 */
    protected static final int NO_STATUS = 0b00000000;
    protected static final int INFO_STATUS = 0b00000001;
    protected static final int DEBUG_STATUS = 0b00000010;
    
    /* 이름 */
    private final String NO_STATUS_NAME = "no";
    private final String INFO_STATUS_NAME = "info";
    private final String DEBUG_STATUS_NAME = "debug";
    
    /* 설정파일 이름 */
    private final String LOGGER_XML_CONFIG_NAME = "wk5logger.xml";
 
    
    /* 싱글턴을 위함. */
    private static LoggerConfigLoader instance = null;
    
    /* 설정 상태 값. */
    private int logStatus = NO_STATUS;
    
    /* 내부 작동을 위한 변수들 */
    private List<String> statusNameList = 
                Arrays.asList(new String[]{NO_STATUS_NAME, INFO_STATUS_NAME, DEBUG_STATUS_NAME});
    private List<Integer> statusValueList = 
                Arrays.asList(new Integer[]{NO_STATUS, INFO_STATUS, DEBUG_STATUS});
    private final Map<String, Integer> statusMap = new HashMap<String, Integer>();
    
    /* 생성자 */
    private LoggerConfigLoader(){
        /* 상태값을 맵에 넣음 */
        for(int i = 0; i < statusNameList.size(); i++){
            statusMap.put(statusNameList.get(i), statusValueList.get(i));
        }
        
        loadConfig();
    }
    
    /* 싱글턴을 위함. */
    protected static LoggerConfigLoader getAndLoadLoggerConfig(){
        
        synchronized (LoggerConfigLoader.class) {
            
            if(instance == null){
                instance = new LoggerConfigLoader();
            }
            
        }
        
        return instance;
    }
    
    /* xml설정파일을 로드하여 설정된 값을 logStatus에 넣음. */
    private void loadConfig(){
 
        try {
            
            File xmlConfigFile = getXmlConfigFile(LOGGER_XML_CONFIG_NAME);
                 //Wk5LoggerConfigLoadFailedException
            
            String getLogStatusString = getStatusAtConfigXmlfile(xmlConfigFile);
            
            if(statusNameList.contains(getLogStatusString)){
                logStatus = statusMap.get(getLogStatusString).intValue();
            }else{
                logStatus = NO_STATUS;
            }
            
        } catch (Wk5LoggerConfigLoadException e) {
            
            System.out.println(e.getMessage());
            logStatus = NO_STATUS;
        }
    }
    
    private File getXmlConfigFile(String xmlFileName) throws Wk5LoggerConfigLoadException{
        
        URL configPath = this.getClass().getClassLoader().getResource(xmlFileName);
            
        if(configPath == nullthrow new Wk5LoggerConfigLoadException();
        
        File xmlFile = new File(configPath.getFile());
        
        return xmlFile;
    }
    
    private String getStatusAtConfigXmlfile(File xmlConfigFile){
        
        try {
            DocumentBuilder documentBuilder = DocumentBuilderFactory.newInstance()
                      .newDocumentBuilder();
            Document xmlConfig = documentBuilder.parse(xmlConfigFile);
            
            xmlConfig.getDocumentElement().normalize();
            
            Node rootNode = xmlConfig.getFirstChild();
            
            String LogStatusString = rootNode.getOwnerDocument()
                      .getElementsByTagName("status").item(0).getTextContent();
            
            return LogStatusString;
            
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (SAXException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        } catch (IOException e) {
            e.printStackTrace();
            return NO_STATUS_NAME;
        }
        
    }
 
    public int getLogStatus() {
        return logStatus;
    }
    
}
 
class Wk5LoggerConfigLoadException extends Exception{
    private static final long serialVersionUID = 1L;
 
    public Wk5LoggerConfigLoadException(){
        super("wk5logger error! - "
                + "Set the log file does not exist or the file location is incorrect. "
                + "Set file at top-level source directory.");
    }
    
    public Wk5LoggerConfigLoadException(String messege){
        super(messege);
    }
    
}
 

-wk5logger.xml

1
2
3
4
<?xml version="1.0" encoding="UTF-8"?>
<logger>
    <status>debug</status>        
</logger>

  -Main.java

1
2
3
4
5
6
7
8
9
10
11
public class Main{
   Logger log = new Logger(Main.class);
//Logger log = new Logger(Logger.INFO);
//Logger log = new Logger();
 
   public static void main(String arg[]) {
      log.info("인포 로그입니다");
      log.debug("디버그 로그입니다");
   }
}
 

 

-출력

 [info] - 인포 로그입니다

[debug] Main - 디버그 로그입니다

 

- 클래스 이름을 생략 할 수도 있고, 인포로그만 혹은 출력안하게 할 수도 있다.

 

- 5. 17수정 인포로그는 클래스 이름 표시 안하도록 수정, 카운터 없앰

- 5. 31수정 외부 xml 설정파일를 통해 인포, 디버그 표시를 설정하도록 수정...

 

소스 파일을 볼 수 있도록 깃허브에 올려놓음.. https://github.com/wakeup5/module_git

댓글()

프로그래밍의 디자인 패턴.


한글화된 문서는 내용이 아직 채워지지 않았으므로 영어 문서를 보는 것을 추천.

출처 - http://kiros33.blog.me/130181116363


Reference

소프트웨어 디자인 패턴 분류

 

안녕하세요.

이번에 소개 해드릴 내용은 디자인 패턴입니다.

이번에는 간략하게 설명만 하고 자세한것은 추후에 다루도록 하겠습니다.

디자인 패턴은 크게 3가지(생성, 구조, 행위) 로 나뉘게 되고요. 각자 세부적인 패턴들이 있습니다.

사실 이미 알게 모르게 다 사용하고 잇는 내용이지요.

 

생성



 

구조



 

행위 



 

위키를 기준으로 텍스트로 다시 정리해봤습니다.

 

생성 패턴(Creational Patterns)

 

 

 

구조 패턴(Structural Patterns)

 

 

 

행위 패턴(Behavioral Patterns)

 




댓글()

자바 문법 문제 2


1.
/*
 * 1. - 주관식 - 기초문법 - 연산자와 키워드 - 중
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는?
 * 
 * -답안
 *  SU MO TU WE TH FR SA
 *              01 02 03
 *  04 05 06 07 08 09 10
 *  11 12 13 14 15 16 17
 *  18 19 20 21 22 23 24
 *  25 26 27 28 29 30 31
 */

package java2_total;

public class GrammerEx1 {
    public static void main(String[] args) {
        final int SUN = 1;
        final int MON = 2;
        final int TUE = 3;
        final int WED = 4;
        final int THU = 5;
        final int FRI = 6;
        final int SAT = 7;

        int start = 1;
        int end = 31;
        int startWeek = THU;
        System.out.println(" SU MO TU WE TH FR SA");
        for (int i = 1; i < startWeek; i++) {
            System.out.print("   "); // "공백3칸"
        }
        for (int i = start, n = startWeek; i <= end; i++, n++) {
            System.out.print((i < 10) ? " 0" + i : " " + i); // (i < 10)?
                                                                // "공백두칸"+i :
                                                                // "공백한칸"+i
            if (n % 7 == 0)
                System.out.println();
        }
    }

}


2.

/*
 * 2. - 주관식 - 기초문법 - 조건문/반복문 - 상
 * 다음은 행렬 곱셈을 구현한 코드이다.
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는?
 * 
 * -생각
 *  {54,0,}
 *  {0,0,}
 *  몰라
 *  
 * -결과
 *  {54,30,}
 *  {165,70,}
 */

package java2_total;

public class GrammerEx2 {
    public static void main(String[] args) {
        int x[][] = { { 3, 2, 3 }, { 5, 9, 8 } };
        int y[][] = { { 4, 7 }, { 9, 3 }, { 8, 1 } };

        int z[][] = Matrix.multiply(x, y);
        Matrix.print(z);
    }
}

class Matrix {
    public static int[][] multiply(int[][] m1, int[][] m2) {
        int m1Rows = m1.length;
        int m1Cols = m1[0].length;
        int m2Rows = m2.length;
        int m2Cols = m2[0].length;

        if (m1Cols != m2Rows) {
            throw new IllegalArgumentException();
        }

        int[][] result = new int[m1Rows][m2Cols];

        for (int i = 0; i < m1Rows; i++) {
            for (int j = 0; j < m2Cols; j++) {
                for (int k = 0; k < m1Cols; k++) {
                    result[i][j] += m1[i][k] * m2[k][j];
                }
            }
        }
        return result;
    }

    public static void print(int[][] a) {
        int rows = a.length;
        int cols = a[0].length;
        for (int i = 0; i < rows; i++) {
            System.out.print("{");
            for (int j = 0; j < cols; j++) {
                System.out.print(a[i][j] + ",");
            }
            System.out.println("}");
        }
    }

}


3.

Colored By Color Scripter

/*
 * 3. - 주관식 - 배열과 컬렉션 - 배열과 컬렉션 - 중
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는?
 * 
 * -생각
 *  set입력 1,2,9,7,4,6,0
 *  정렬 0,1,2,4,6,7,9
 *  
 *  결과 0,1,2,4,6,7,9
 *  
 * -결과
 *  0124679
 */

package java2_total;

import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

public class CollectionEx3 {
    public static void main(String[] args) {
        String[] arr = { "1""2""9""7""4""6""1""7""0" };
        Set set = new HashSet();
        for (String s : arr) {
            set.add(s);
        }

        List list = new LinkedList(set);
        Collections.sort(list);

        Iterator it = list.iterator();

        while (it.hasNext()) {
            System.out.print(it.next());
        }
    }
}


4.

/*
 * 4. - 주관식 - OOP특징 - 객체의 생성과 사용 - 상
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는? 컴파일시 에러가 발생한다면 라인번호와 그 원인과 해결책을 설명하시오.
 * 
 * -결과
 * 10
 * 10
 */

package java2_total;

public class OopEx4 {
    public static void main(String[] args) {
        Test t1 = Test.getInstance();
        Test t2 = Test.getInstance();
        t1.setX(5);
        t2.setX(10);
        System.out.println(t1.getX());
        System.out.println(t2.getX());
    }
}

class Test {
    private static Test t;
    private int x;

    private Test() {
    }

    public static Test getInstance() {
        if (t == null) {
            t = new Test();
        }
        return t;
    }

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

}


5.

/*
 * 5. - 주관식 - OOP특징 - Abstraction - 상
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는? 컴파일시 에러가 발생한다면 라인번호와 그 원인과 해결책을 설명하시오.
 * 
 * -생각
 *  first
 *  second
 *  third
 * 
 * -결과
 *  first
 *  second
 *  third
 */

package java2_total;

public class OopEx5 {
    public static void main(String[] args) {
        Template t = new Test1();
        t.play();
    }
}

abstract class Template {
    void play() {
        first();
        second();
        third();
    }

    abstract void first();

    abstract void second();

    final void third() {
        System.out.println("third");
    }
}

class Test1 extends Template {
    @Override
    void first() {
        System.out.println("first");
    }

    @Override
    void second() {
        System.out.println("second");
    }

}


6.

/*
 * 6. - 주관식 - OOP특징 - 다형성/인터페이스/동적바인딩 - 중
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는? 컴파일시 에러가 발생한다면 라인번호와 그 원인과 해결책을 설명하시오.
 * 
 * -생각
 *  r.test(s);
 *  test()의 매개변수는 Testable. Ship은 Testable를 구현하지 않았으므로 받지 못한다.
 * 
 * -결과
 * r.test(s); //error
 * 
 */


package java2_total;

public class OopEx6 {
    public static void main(String[] args) {
        Car c = new Car();
        Ship s = new Ship();
        Robot r = new Robot();
        r.test(c);
        r.test(s);
        r.test(r);
    }
}

class Elect {
    int value;
}

interface Testable {
}

class Car extends Elect implements Testable {
}

class Ship extends Elect {
}

class Robot extends Elect implements Testable {
    void test(Testable t) {
        if (t instanceof Elect) {
            System.out.println("test하다");
        }
    }

}


7.

/*
 * 7. - 주관식 - Java API - String class, StringBuffer, Wrapper - 중
 * 다음 프로그램 컴파일과 실행시 출력되는 결과는?
 * 
 * -생각
 *  true
 *  true
 *  true
 *  false
 *  false
 * 
 *  찍음..
 * 
 * -결과
 *  true
 *  true
 *  false
 *  true
 *  false
 * 
 * -결과에 대한 생각
 * Integer, String같은 매퍼타입 변수는 equals메소드를 오버라이딩 하여 참조하고 잇는 메모리의 값을 비교.
 * StringBuffer의 equals는 Object의 메소드 그대로 이므로 참조변수의 해쉬값을 비교.
 * 
 * Date역시 equals메소드를 오버라이딩 하였다.
 * d2.equals(d3)경우는 값이 같이 때문에 true
 * d1.equals(d4)는 new Date()한 시간이 서로 다르기 때문에 false.  
 */

package java2_total;

import java.util.Date;
import java.util.GregorianCalendar;

public class ApiEx7 {
    public static void main(String[] args) {
        Integer i1 = new Integer(1);
        Integer i2 = new Integer(1);

        String s1 = new String("one");
        String s2 = new String("one");

        StringBuffer sf1 = new StringBuffer("one");
        StringBuffer sf2 = new StringBuffer("one");

        Date d1 = new Date();
        Date d2 = new GregorianCalendar(2011, 7, 15).getTime();
        Date d3 = new GregorianCalendar(2011, 7, 15).getTime();
        Date d4 = new Date();

        System.out.println(i1.equals(i2));
        System.out.println(s1.equals(s2));
        System.out.println(sf1.equals(sf2));
        System.out.println(d2.equals(d3));
        System.out.println(d1.equals(d4));
    }

}


'웹 & 안드로이드 > JAVA & JSP' 카테고리의 다른 글

대충 만들어본 로그 클래스  (0) 2014.05.15
프로그래밍의 디자인 패턴.  (0) 2013.12.12
자바 문법 문제 1  (0) 2013.12.04
OR 연산자의 연산.  (0) 2013.12.03
[JSP] 안보이는 주석  (1) 2013.11.19

댓글()

자바 문법 문제 1

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

OR 연산자의 연산.

a || b;


a가 거짓일 경우 b도 검사하지만


a가 참일경우 b는 검사 하지 않고 참을 출력한다.

댓글()

[JSP] 안보이는 주석

jsp에서 클라이언트에서는 안보이는 주석을 달 수 잇다.


<%-- 주석 내용. --%>



<!-- --> 의 경우에는 html주석이기 때문에 클라이언트에서 소스보기를 하면 보이는 반면,


<%-- --%>는 jsp 주석이기 때문에 클라이언트 까지 가지 않는다.

댓글()

[Mybatis] like 파라메터값과 % 같이 쓰기

ban_name LIKE CONCAT('%', #{value}, '%')

<!-- ORACLE  : '%' || #{value} || '%' -->

댓글()