'Java' 카테고리의 다른 글
Java log4j No appenders could be found for logger 에러 해결 하기 (0) | 2014.10.12 |
---|---|
Java Clone 사용 하기 (0) | 2014.10.10 |
Java HashMap Key 정렬 하기 (0) | 2014.09.24 |
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
Java Reflection 활용하기 (0) | 2013.11.18 |
Java log4j No appenders could be found for logger 에러 해결 하기 (0) | 2014.10.12 |
---|---|
Java Clone 사용 하기 (0) | 2014.10.10 |
Java HashMap Key 정렬 하기 (0) | 2014.09.24 |
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
Java Reflection 활용하기 (0) | 2013.11.18 |
JSP 파일 다운로드 시 한글 깨짐 현상 해결 하기 (0) | 2014.10.29 |
---|---|
JSP 파일 업로드 시 File has already been moved - cannot be transferred again 에러 해결 방법 (0) | 2014.10.14 |
JSP 게시판 구현 시 Paging 처리 하기 (4) | 2014.10.06 |
JSTL 에서 Date 객체 원하는 Pattern 으로 출력 하기 (0) | 2014.10.02 |
JSP JSTL 사용하기 (0) | 2012.11.16 |
Java Clone 사용 하기 (0) | 2014.10.10 |
---|---|
Java String.split(String regex) 사용 시 '|' 파싱 이 안되는 경우 (1) | 2014.10.08 |
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
Java Reflection 활용하기 (0) | 2013.11.18 |
Java Console 게시판 만들기 - 4 (4) | 2013.11.13 |
Reflection 이란 단어는 반사, 방향, 거울 등에 비친 상 이라는 의미를 담고 있습니다.
개발 당시 많이 사용 하는 new 연산자는 Class의 규칙에 의해서 객체화 된 Instance를 생성 합니다.
Test test = new Test();
Instance를 거울에 비추어 보면 반대로 Class의 정보를 얻을 수 있습니다.
거울의 역할을 하는 메소드는 Object Class의 getClass 라고 볼 수 있습니다.
아래는 실제 사용 예 입니다.
public final native Class<?> getClass();
이제 반대로 확인이 가능합니다. Class의 구성 요소인 생성자, 메소드, 전역 변수 등 정보가 필요 할 떄 사용되는 패키지가 java.lang.reflect 입니다.
패키지를 이용하면 변수의 값을 바꿀 수도 있고, 메소드를 실행도 할 수 있습니다. 막강한 기능인 패키지를 기반으로한 Instance 생성도 가능 합니다.
Java Framework 중 하나인 Spring의 중요한 기능인 DI(Dependency Injection) 가 동작이 가능한 것도 java.lang.Class<T>, java.lang.reflect 가 존재하기 때문 입니다.
DI 추가 설명 - http://blog.whitelife.co.kr/13
Spring ApplicationContent.xml 중 일부
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<bean class="kr.whitelife.controller.Wcontroller">
<constructor-arg ref="service"/>
</bean>
<bean id="service" class="kr.whitelife.service.Wservice">
<property name="dao" ref="dao"></property>
</bean>
<bean id="dao" class="kr.whitelife.dao.Wdao"/>
</beans>
<bean> 태그의 class 속성에 들어가 있는 정보를 가지고 package 기반의 Instance 생성을 할 수 있습니다.
간단한 예제 입니다.
import java.lang.reflect.Method; import java.lang.reflect.InvocationTargetException; public class Reflective { public void message(String choice) throws NoSuchMethodException, NullPointerException, SecurityException, IllegalAccessException, InvocationTargetException { this.getClass().getDeclaredMethod(choice, (Class<?>[]) null).invoke(this); } public void hello() { System.out.println("hello"); } public static void main(String[] args) { try { Reflective r = (Reflective) Class.forName("Reflective").newInstance(); r.message("hello"); } catch (NoSuchMethodException e) { System.out.println(e); } catch (NullPointerException e) { System.out.println(e); } catch (ClassNotFoundException e) { System.out.println(e); } catch (SecurityException e) { System.out.println(e); } catch (InstantiationException e) { System.out.println(e); } catch (IllegalAccessException e) { System.out.println(e); } catch (InvocationTargetException e) { System.out.println(e); } } }
위 기능은 Package를 이용한 객체 생성, method 정보를 찾아서 실행 까지 합니다. 기존에 new 연산자를 이용해서 Instance 생성을 했다면 reflect 패키지 활용 시 문자열을 활용하여 동적으로 Instance 제어가 된다.
Java의 상속, 인터페이스와 더불어 reflection과 결합하게 된다면 훨씬 개발이 요구사항에 따른 대응이 수월해지고, Class 단위의 분기를 했다면, Method 단위의 분기도 수월하게 처리가 가능 합니다.
※ 참고 사이트
Java API - http://docs.oracle.com/javase/6/docs/api/
이미지 URL - http://www.clker.com/cliparts/e/K/g/G/i/j/blue-stick-man-reflect-hi.png
Java HashMap Key 정렬 하기 (0) | 2014.09.24 |
---|---|
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
Java Console 게시판 만들기 - 4 (4) | 2013.11.13 |
Java Console 게시판 만들기 - 3 (0) | 2013.11.12 |
Java Console 게시판 만들기 - 2 (0) | 2013.11.11 |
[Java Console 게시판 만들기 - 3] - http://blog.whitelife.co.kr/165
윗 글의 게시판 소스 개선 입니다.
- Java API 사용
- List<E>
- ArrayList<E>
기존 방식은 String 2차원 배열을 사용 했기 때문에 수동으로 Array가 꽉 찼을 경우 재 할당을 해야 했습니다. 개선 방안으로는 Java API 중 List가 있습니다. 내부적으로 배열을 증가 시키는 로직이 있습니다.
import java.util.Scanner; import java.util.List; import java.util.ArrayList; public class Bbs { private Scanner s; private List<String[]> bbsList; private int seq; public Bbs() { this.s = new Scanner(System.in); this.bbsList = new ArrayList<String[]>(); this.seq = 1; } public void readme() { System.out.println("1. 등록, 2. 상세보기, 3. 수정, 4. 삭제, 5. 목록, x. 종료"); } public void exit() { System.out.println("프로그램을 종료 합니다."); } public String getInput() { return this.s.next(); } public void create() { String no = String.valueOf(seq); System.out.println("input title..."); String title = getInput(); System.out.println("input content..."); String content = getInput(); String[] bbs = new String[3]; bbs[0] = no; bbs[1] = title; bbs[2] = content; this.bbsList.add(bbs); this.seq++; System.out.println("등록이 완료 되었습니다."); } private String[] getSearch(String no) { for (String[] bbs : this.bbsList) { if (bbs != null && bbs[0].equals(no)) { return bbs; } } return null; } public void read(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = this.getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("no: " + bbs[0]); System.out.println("title: " + bbs[1]); System.out.println("content: " + bbs[2]); } public void update(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = this.getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("input title..."); String title = this.getInput(); System.out.println("input content..."); String content = this.getInput(); bbs[1] = title; bbs[2] = content; System.out.println("수정이 완료 되었습니다."); } public void delete(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = this.getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } this.bbsList.remove(bbs); System.out.println("삭제가 완료 되었습니다."); } public void getList() { for (String[] bbs : this.bbsList) { if (bbs != null) { System.out.println("no: " + bbs[0]); System.out.println("title: " + bbs[1]); System.out.println("content: " + bbs[2]); } } } public static void main(String[] args) { Bbs bbs = new Bbs(); while(true) { bbs.readme(); String choice = bbs.getInput(); if (choice.equals("1")) { bbs.create(); } else if (choice.equals("2")) { System.out.println("번호를 입력해 주십시오."); bbs.read(bbs.getInput()); } else if (choice.equals("3")) { System.out.println("번호를 입력해 주십시오."); bbs.update(bbs.getInput()); } else if (choice.equals("4")) { System.out.println("번호를 입력해 주십시오."); bbs.delete(bbs.getInput()); } else if (choice.equals("5")) { bbs.getList(); } else if (choice.equals("x")) { bbs.exit(); break; } else { System.out.println("잘못 입력 하셨습니다.\n다시 입력해 주십시오."); } } } }
Google Guava 라이브러리 사용하기 (0) | 2014.07.24 |
---|---|
Java Reflection 활용하기 (0) | 2013.11.18 |
Java Console 게시판 만들기 - 3 (0) | 2013.11.12 |
Java Console 게시판 만들기 - 2 (0) | 2013.11.11 |
Java Console 게시판 만들기 (1) | 2013.11.10 |
[Java Console 게시판 만들기 - 2] - http://blog.whitelife.co.kr/163
윗 글의 게시판 소스 개선 입니다.
- Object 형태로 변경
- 게시판 Array가 꽉 찼을 경우 동적 Array 생성
이제는 게시글을 제한 없이 입력이 가능 합니다.
import java.util.Scanner; public class Bbs { private Scanner s; private String[][] bbses; private int seq; private int gindex; public Bbs() { this.s = new Scanner(System.in); this.bbses = new String[9][]; this.seq = 1; this.gindex = 0; } public void addArray() { String[][] temp = this.bbses; this.bbses = new String[(int)temp.length + 10][]; System.arraycopy(temp, 0, this.bbses, 0, temp.length); } public void readme() { System.out.println("1. 등록, 2. 상세보기, 3. 수정, 4. 삭제, 5. 목록, x. 종료"); } public void exit() { System.out.println("프로그램을 종료 합니다."); } public String getInput() { return this.s.next(); } public void create() { if (gindex == bbses.length) { this.addArray(); } String no = String.valueOf(seq); System.out.println("input title..."); String title = getInput(); System.out.println("input content..."); String content = getInput(); String[] bbs = new String[3]; bbs[0] = no; bbs[1] = title; bbs[2] = content; this.bbses[this.gindex++] = bbs; this.seq++; System.out.println("등록이 완료 되었습니다."); } private String[] getSearch(String no) { for (String[] bbs : this.bbses) { if (bbs != null && bbs[0].equals(no)) { return bbs; } } return null; } private int getIndex(String no) { for (int i=0; i<this.bbses.length; i++) { String[] bbs = this.bbses[i]; if (bbs != null && bbs[0].equals(no)) { return i; } } return -1; } public void read(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("no: " + bbs[0]); System.out.println("title: " + bbs[1]); System.out.println("content: " + bbs[2]); } public void update(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = this.getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("input title..."); String title = this.getInput(); System.out.println("input content..."); String content = this.getInput(); bbs[1] = title; bbs[2] = content; System.out.println("수정이 완료 되었습니다."); } public void delete(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } int index = this.getIndex(no); if (index == -1) { System.out.println("게시글이 없습니다."); return; } this.bbses[index] = null; this.gindex--; int length = this.bbses.length; for (int i=0; i<length; i++) { if (index == 0) { break; } if (index == length-1) { break; } if (i > index) { if (i < length) { this.bbses[i-1] = this.bbses[i]; this.bbses[i] = null; } } } System.out.println("삭제가 완료 되었습니다."); } public void getList() { for (int i=0; i<this.bbses.length; i++) { if (this.bbses[i] == null) continue; System.out.println("index: " + i); System.out.println("no: " + this.bbses[i][0]); System.out.println("title: " + this.bbses[i][1]); System.out.println("content: " + this.bbses[i][2]); } } public static void main(String[] args) { Bbs bbs = new Bbs(); while(true) { bbs.readme(); String choice = bbs.getInput(); if (choice.equals("1")) { bbs.create(); } else if (choice.equals("2")) { System.out.println("번호를 입력해 주십시오."); bbs.read(bbs.getInput()); } else if (choice.equals("3")) { System.out.println("번호를 입력해 주십시오."); bbs.update(bbs.getInput()); } else if (choice.equals("4")) { System.out.println("번호를 입력해 주십시오."); bbs.delete(bbs.getInput()); } else if (choice.equals("5")) { bbs.getList(); } else if (choice.equals("x")) { bbs.exit(); break; } else { System.out.println("잘못 입력 하셨습니다.\n다시 입력해 주십시오."); } } } }
Java Reflection 활용하기 (0) | 2013.11.18 |
---|---|
Java Console 게시판 만들기 - 4 (4) | 2013.11.13 |
Java Console 게시판 만들기 - 2 (0) | 2013.11.11 |
Java Console 게시판 만들기 (1) | 2013.11.10 |
실행 시 Exception in thread "main" java.lang.UnsupportedClassVersionError: httpsclient : Unsupported major.minor version 51.0 해결 하기 (0) | 2013.04.24 |
[Java Console 게시판 만들기] - http://blog.whitelife.co.kr/161
윗 글의 게시판 소스 개선 입니다.
기존 main 함수로 작성 했던 부분을 기능별로 분리하여 작성 하였습니다.
import java.util.Scanner; public class bbs { private static Scanner s = new Scanner(System.in); private static String[][] bbses = new String[9][]; private static int seq = 1; private static int gindex = 0; public static void readme() { System.out.println("1. 등록, 2. 상세보기, 3. 수정, 4. 삭제, 5. 목록, x. 종료"); } public static void exit() { System.out.println("프로그램을 종료 합니다."); } public static String getInput() { return s.next(); } public static void create() { if (gindex == bbses.length) { System.out.println("게시글이 꽉 찼습니다.\n삭제 후 이용해 주세요."); return; } String no = String.valueOf(seq); System.out.println("input title..."); String title = getInput(); System.out.println("input content..."); String content = getInput(); String[] bbs = new String[3]; bbs[0] = no; bbs[1] = title; bbs[2] = content; bbses[gindex++] = bbs; seq++; System.out.println("등록이 완료 되었습니다."); } private static String[] getSearch(String no) { for (String[] bbs : bbses) { if (bbs != null && bbs[0].equals(no)) { return bbs; } } return null; } private static int getIndex(String no) { for (int i=0; i<bbses.length; i++) { String[] bbs = bbses[i]; if (bbs != null && bbs[0].equals(no)) { return i; } } return -1; } public static void read(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("no: " + bbs[0]); System.out.println("title: " + bbs[1]); System.out.println("content: " + bbs[2]); } public static void update(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } String[] bbs = getSearch(no); if (bbs == null) { System.out.println("게시글이 없습니다."); return; } System.out.println("input title..."); String title = getInput(); System.out.println("input content..."); String content = getInput(); bbs[1] = title; bbs[2] = content; System.out.println("수정이 완료 되었습니다."); } public static void delete(String no) { if (no == null || no == "") { System.out.println("잘못 입력 하셨습니다."); return; } int index = getIndex(no); if (index == -1) { System.out.println("게시글이 없습니다."); return; } bbses[index] = null; gindex--; int length = bbses.length; for (int i=0; i<length; i++) { if (index == 0) { break; } if (index == length-1) { break; } if (i > index) { if (i < length) { bbses[i-1] = bbses[i]; bbses[i] = null; } } } System.out.println("삭제가 완료 되었습니다."); } public static void getList() { for (int i=0; i<bbses.length; i++) { if (bbses[i] == null) continue; System.out.println("index: " + i); System.out.println("no: " + bbses[i][0]); System.out.println("title: " + bbses[i][1]); System.out.println("content: " + bbses[i][2]); } } public static void main(String[] args) { while(true) { readme(); String choice = getInput(); if (choice.equals("1")) { create(); } else if (choice.equals("2")) { System.out.println("번호를 입력해 주십시오."); read(getInput()); } else if (choice.equals("3")) { System.out.println("번호를 입력해 주십시오."); update(getInput()); } else if (choice.equals("4")) { System.out.println("번호를 입력해 주십시오."); delete(getInput()); } else if (choice.equals("5")) { getList(); } else if (choice.equals("x")) { exit(); break; } else { System.out.println("잘못 입력 하셨습니다.\n다시 입력해 주십시오."); } } } }
Java Console 게시판 만들기 - 4 (4) | 2013.11.13 |
---|---|
Java Console 게시판 만들기 - 3 (0) | 2013.11.12 |
Java Console 게시판 만들기 (1) | 2013.11.10 |
실행 시 Exception in thread "main" java.lang.UnsupportedClassVersionError: httpsclient : Unsupported major.minor version 51.0 해결 하기 (0) | 2013.04.24 |
JDBC로 Query 작성하기 (Mysql) (0) | 2012.12.19 |
최근 들어 자바란 아이에게 신경을 별로 쓰지 못 했다. ㅎㅎ
생각 없이 코딩을 하던 중 String 비교를 하는데 비교가 되지 않아서 equals 함수를 써서 해결을 했다. 무심했던 것 일까...
public class test { public static void main(String[] args) { String a = "test"; String b = "test"; String c = new String("test"); String d = new String("test"); System.out.println("a: " + System.identityHashCode(a)); System.out.println("b: " + System.identityHashCode(b)); System.out.println("c: " + System.identityHashCode(c)); System.out.println("d: " + System.identityHashCode(d)); System.out.println("a == b: " + (a == b)); System.out.println("a equals b: " + a.equals(b)); System.out.println("c == d: " + (c == d)); System.out.println("c equals d: " + c.equals(d)); } }
실행 결과
a: 1579880541 b: 1579880541 c: 1564441079 d: 1918924532 a == b: true a equals b: true c == d: false c equals d: true
c == d 부분을 보면 hash 값이 다른 것을 볼 수 있다. 당연히 주소 값을 비교 하기 때문이다. 뻘짓을 하다니 완전 좌절 했다. ㅋ
게시판을 만들어 보자
기능 정의
게시글의 최대 수는 9개로 제한 한다. 아래는 세부 기능 이다.
1. 등록
2. 상세 보기
3. 수정
4. 삭제
5. 리스트 보기
6. 종료
Sample
게시 글 항목은 번호, 제목, 내용 간단하게 3가지로 간다.
no: 1
title: title
content: content
Code
import java.util.Scanner; public class bbs { public static void main(String[] args) { Scanner s = new Scanner(System.in); String[][] bbses = new String[9][]; int seq = 1; int gindex = 0; while(true) { System.out.println("1. create, 2. read, 3. update, 4. delete, 5. list, x. exit"); String choice = s.next(); if (choice.equals("1")) { if (gindex == bbses.length) { System.out.println("게시글이 꽉 찼습니다.\n삭제 후 이용해 주세요."); continue; } String no = String.valueOf(seq); System.out.println("input title..."); String title = s.next(); System.out.println("input content..."); String content = s.next(); String[] bbs = new String[3]; bbs[0] = no; bbs[1] = title; bbs[2] = content; bbses[gindex++] = bbs; seq++; System.out.println("Complete..."); } else if (choice.equals("2")) { System.out.println("input no..."); String no = s.next(); boolean flag = false; for (String[] bbs : bbses) { if (bbs != null && bbs[0].equals(no)) { System.out.println("no: " + bbs[0]); System.out.println("title: " + bbs[1]); System.out.println("content: " + bbs[2]); flag = true; break; } } if (!flag) { System.out.println("게시글이 없습니다."); } } else if (choice.equals("3")) { System.out.println("input no..."); String no = s.next(); boolean flag = false; for (String[] bbs : bbses) { if (bbs != null && bbs[0].equals(no)) { System.out.println("input title..."); String title = s.next(); System.out.println("input content..."); String content = s.next(); bbs[1] = title; bbs[2] = content; flag = true; break; } } if (flag) { System.out.println("Complete..."); } else { System.out.println("게시글이 없습니다."); } } else if (choice.equals("4")) { System.out.println("input no..."); String no = s.next(); int index = -1; boolean flag = false; if (gindex == 0) { System.out.println("입력된 게시글이 없습니다."); continue; } for (int i=0; i<bbses.length; i++) { String[] bbs = bbses[i]; if (bbs != null && bbs[0].equals(no)) { bbses[i] = null; index = i; gindex--; flag = true; break; } } if (flag) { int length = bbses.length; for (int i=0; i<length; i++) { if (index == 0) { break; } if (index == length-1) { break; } if (i > index) { if (i < length) { bbses[i-1] = bbses[i]; bbses[i] = null; } } } System.out.println("Complete..."); } else { System.out.println("게시글이 없습니다."); } } else if (choice.equals("5")) { for (int i=0; i<bbses.length; i++) { if (bbses[i] == null) continue; System.out.println("index: " + i); System.out.println("no: " + bbses[i][0]); System.out.println("title: " + bbses[i][1]); System.out.println("content: " + bbses[i][2]); } } else if (choice.equals("x")) { System.out.println("프로그램을 종료 합니다."); break; } else { System.out.println("잘못 입력 하셨습니다.\n다시 입력해 주십시오."); } } } }
실행 결과
1. create, 2. read, 3. update, 4. delete, 5. list, x. exit
1
input title...
111
input content...
222
Complete...
1. create, 2. read, 3. update, 4. delete, 5. list, x. exit
1
input title...
333
input content...
444
Complete...
1. create, 2. read, 3. update, 4. delete, 5. list, x. exit
1
input title...
555
input content...
666
Complete...
1. create, 2. read, 3. update, 4. delete, 5. list, x. exit
5
index: 0
no: 1
title: 111
content: 222
index: 1
no: 2
title: 333
content: 444
index: 2
no: 3
title: 555
content: 666
1. create, 2. read, 3. update, 4. delete, 5. list, x. exit
x
프로그램을 종료 합니다.
심플한 게시판이 실행 되는 것을 확인 할 수 있다.
긴 글을 읽어 주셔서 감사합니다.
Java Console 게시판 만들기 - 3 (0) | 2013.11.12 |
---|---|
Java Console 게시판 만들기 - 2 (0) | 2013.11.11 |
실행 시 Exception in thread "main" java.lang.UnsupportedClassVersionError: httpsclient : Unsupported major.minor version 51.0 해결 하기 (0) | 2013.04.24 |
JDBC로 Query 작성하기 (Mysql) (0) | 2012.12.19 |
Date 함수 관련 (0) | 2012.12.03 |