레이블이 JAVA강의인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JAVA강의인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 9일 금요일

[ORACLEJAVA커뮤니티,강좌,oracle char]Char와 VarChar2 Type의 비교분석, 오엔제이프로그래밍

Char, Varchar type비교

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


A. CHAR Type

- 고정 길이 문자열을 저장한다. 사용자가 고정길이 보다 짧은 값을 저장하면 나머지 공
간은 Space로 체원진다.
- 1~255까지의 문자를 저장.
- 사용자가 후행 공백을 포함하여 고정길이 보다 큰 값을 입력하면 고정 길이에 맞게 값에서
공백이 잘린다.
- 값이 너무크면 Oracle Error발생
- 공백채움비교(blank-padded comparison semantics)를 사용한다.[비교문자열 둘다가
CHAR인경우]
a. 비교하는 두변수의 값이 길이가 다른 경우 짧은쪽을 공백으로 채운다는 것을 의미함

예) ‘a ‘ = ‘a’(우측의 갑은 1 Byte이므로 1 Byte를 공백으로 채워 2 Byte를 만든후 비교한다.)

- 데이타의 컬럼 길이가 짧고 거의 모든 데이타의 길이가 일정량을 넘어 확정된 크기에 대한 사용
비율이 높은 고정 길이인 경우 사용된다. 예를 들면 사번, 각 바이트가 의미가 있는 코드 등에
사용된다.

- 가변 길이로 지정할 경우 사이즈 증가로 인한 많은 체인 발생이 우려되는 경우
- 초기에는 데이타가 입력 되어 있지 않지만 일정 시간이 지나면 데이타가 입력 되어 지는 경우
- 오라클에서 권장하기는 CHAR보다는 VARCHAR2을 사용하는 것이 효과적임

B. VARCHAR2
- 가변길이 문자열을 저장한다. 1 ~2000 Byte 저장가능함.
- 최대 50자를 저장할수 있는 VARCHAR2 TYpe의변수에 10자를 저장한다면 실제 저장공간에 10자만을
저장한다.
- 공백채우지 않음 비교(non-padded comparison semantics)를 사용한다.[비교값 둘다 또는 한쪽
이라도 VARCHAR2 Type인 경우]

예)’a ‘ > ‘a’(우측의 값이 길이가 짧아도 공백으로 채우지 않으니까 왼쪽의 값이 큰 것은 당근)

- 처음 테이블 생성시 해당 블럭에 데이타 증분치를 고려하여 PCTFREE(디폴트 10)라는 파라메터를
지정하게 되는데 데이타 증분이 많이 발생하게 되면 이영역이 모두 소모 되어 체인이 발생하여
원하는 로우를 검색하고자 할때 필요없는 I/O를 발생 시킨다. 하지만 대개 테이블을 생성하게 되는
개발자는 테이블의 증분 가능성및 수치에 대해 예상하여 적절한 PCTFREE 값을 사전에 적절이
지정할 수 있을 뿐만 아니라, USER_TABLES라는 딕션널리 정보를 검색하여 발생한 체인 발생정도를
파악할 수 있다. 만일 심하게 체인이 발생할 경우 EXP/IMP 유틸리티를 이용하여 체인을 제거할
수 있으며 설령 약간의 체인이 존재할 경우라도 해당 테이블을 사용하는데 많은 제약이 되지 않는다.
또한 VARCHAR2 타입을 사용할때 DEFAULT라는 사용자 제약 조건에 의해 사전에 공간을 확보할 수 있다
- VARCHAR2 타입을 사용한다 할지라고 예견 못할 체인 발생에 대해 전혀 문제점이 없다는 것을
알수 있고, VARCHAR2 타입을 사용함으로서 보다 효과적으로 저장 공간을 이용할 수 있으며 이는
긍국적으로 수행 속도의 향상을 의미하게 된다.

------------------------------
적절한 문자 Data Type 선택방법
------------------------------
1. 비교의미 에서 ANSI 호환성이 필요한 경우 , 즉 후행공백이 중요하지 않으면 CHAR유형을
사용하고 중요하다면 VARCHAR2 Type을 사용한다.
2. 저장공간의 효율적 사용을 위해서는 VARCHAR2 Type을 사용한다.(char type 은 고정길이)
3.전체 테이블을 스캔할 경우 CHAR 형태로 저장된 테이블이 VARCHAR2 형태로 저장된 데이타 보다
많은 블럭 입출력을 발생시켜 속도가 느려질 수 있다. 반면 VARCHAR2 형태의 데이타가 증가 될때는
블럭 내 PCTFREE 영역을 사용하게 되고 만일 이 영역이 모자라는 경우 블럭 체인이 발생하여
원하는 데이타를 검색하고자 할 때 하나 이상의 블럭을 검색하게 되어 오히려 수행 속도에 악영향을
미칠 수 있다.

4.VARCHAR2 타입은 가능한 충분히 최대치를 부여하는 것이 효과적이다. 왜냐하면 실지 크기만
저장되지 컬럼 선언시 지정한 사이즈가 실지로 내부 블럭에 저장되지 않는다 따라서 되도록 큰
사이즈를 지정함으로서 길이 부족으로 인한 에러는 방지 할 수 있다. 흔히 현업에서 성명 타입의
사이즈를 결정할때 8 바이트 10바이트 12 바이트등 여러가지 논란이 있어 왔으나 오라클을
사용하는 경우 VARCHAR2 타입으로 넉넉히 확정하더라도 공간이용 측면에서 전혀 불이익이 없이
가변적인 성명(외국인 성명 포함) 길이를 수용할 수 있다.

5.CHAR 타입은 한 바이트라도 값이 들어간다면 지정된 크기 만큼 내부적으로 크기가 확정됨므로
가능한한 최소 길이로 확정하는 것이 효과적이다. 충분히 해당 크기를 예상할 수 있는 컬럼, 즉 사
번, 코드 등등 확정된 컬럼에만 지정하는 것이 효과적이다. 만일 매우 가변적인(컬럼내에 입력되는
데이타의 길이 편차가 클때) 경우 필요없는 공간 낭비를 가져올 수 있다는 사실을 명심해야 한다

2013년 8월 8일 목요일

[오라클자바커뮤니티]java awt Window,Frame,Font,Color

-------------------------

java.awt.Window

-------------------------


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  






경계바, 타이틀바, 메뉴바가 없는 컴포넌트, 거의 직접 사용되지 않습니다.

그다지 유용하지 않으며 확장하여 사용하거나, ToolTip, PopUp메뉴와 같은 특수한 용도로 사용 합니다.

Window및 그 하위컴포넌트는 다른 컴포넌트에 포함되지않는 최상위 Component

Window및 Dialog 컴포넌트는 부모 컴포넌트로 Frame 컴포넌트를 지정해야만 그 객체를 생성할 수 있습니다.

Window객체를 사용해서 팝업 메뉴를 구현할 수 있으며 창의 기본 배치 관리자는 BorderLayout

WindowOpened나 WindowClosed와 같은 창 이벤트를 생성할 수 있습니다.



생성자 : Window(Frame owner), Window(Window owner), Window(Window owner, GraphicConfiguration gc)

메소드

addNotify() : Window의 피어(peer)를 작성.

addWindowListener(WindowListener) : 지정된 Window 수신기(listener)를 추가하여 Window으로부터 Window 이벤트를 수신.

dispose() :Window에 사용한 자원을 해제 할 때 사용

getFocusOwner() : Window가 활성화된 경우에만 Focus가 있는 창의 하위 컴포넌트를 Return

getOwner() : Window의 Owner를 Return

getOwnedWindows() : 현재 Window를 소유하고 있는 Window 배열을 Return

isShowing() : Windwo가 화면에 나타나 있는지 여부를 점검 합니다.

pack() : Window의 하위 컴포넌트를 환경설정된 크기로 배치 합니다. (최적크기)

processEvent(AWTEvent) : window에 대한 이벤트를 처리 합니다.

processWindowEvent(WindowEvent) : Window에서 발생하는 Window 이벤트를 등록된 WindowListener 객체로 보내 처리 합니다.

removeWindowListener(WindowListener) : Window Event Listener를 제거

show() : Window를 표시하고 앞으로 가져 옵니다.

toBack() : Window를 뒤로 보냅니다.

toFront() : Window를 앞으로 가져 옵니다.





------------------------

java.awt.Frame

--------------------

메소드

Frame() : 초기에는 보이지 않는 Frame의 새로운 인스턴스를 구성

Frame(String) : 지정된 제목으로 초기에는 보이지 않는 새로운 Frame 객체를 구성

getTitle() : 프레임의 제목을 가져옴

setTitle(String) : 프레임의 제목을 Set

isResizable() : 프레임 크기를 재조정할 수 있는지를 표시

getIconImage() : 프레임의 아이콘 이미지를 가져 옵니다.

setIconImage(Image) : 프레임이 아이콘으로 될 때 이미지가 표시되도록 설정

getMenuBar() : 프레임의 메뉴 막대를 가져 옵니다.

setMenuBar(MenuBar) : 지정된 메뉴 막대로 프레임의 Menu component를 설정 합니다.


remove(MenuComponent) : 프레임에서 지정된 Menu Component를 제거





-----------------------

java.awt.Color

-----------------------

java.awt.Object --> java.awt.Color

Paint Interface 구현한 글래스, RGB형식을 사용하여 색을 캡슐화 --> (0,0,0) 검정, (255,255,255) 흰색

색의비교 equals(), Color객체의 getRGB()를 이용


생성자

Color(float, float, float) : 지정된 빨강, 초록, 파랑 값을 사용하여 색상을 만들며, 각 값의 범위는 0.0-1.0

Color(float, float, float, float) : 지정된 빨강, 초록, 파랑 값을 사용하여 색상을 만들며, 불투명도 추가(0.0~1.0)

Color(int) : 지정된 RGB 값으로 색을 만든다. 빨강 컴포넌트는 16-23 비트 인수, 초록 컴포넌트는 8-15 비트 인수, 파랑 컴포넌트는 0-7 비트 인수.

Color(int, int) : ,RGB색상, 불투명도를 정수(0~255)로 나타냄

Color(int, int, int) : 지정된 빨강, 초록, 파랑 컴포넌트로 색을 만듬. (0~255)

Color(int, int, int, int) : 지정된 빨강, 초록, 파랑 컴포넌트로 색을 만듬, 마지막 인자는 불투명도를 나타내는 값(0~255)

Color(ColorSpace, float[], float) : 지정된 ColorSpace, color components float배열,불투명도를 이용해 색을 만듬.



메소드

brighter() : 색을 더 밝게

darker() : 색을 더 어둡게

equals(Object) : 다른 객체가 이 색과 같은지를 결정. 색의 비교시 사용

getBlue() : 색의 파랑 컴포넌트를 가져옴. (0~255)

getColor(String) : 시스템 특성에서 색을 찾는다. String은 시스템 특성

getColor(String, Color) : 시스템 특성에서 색을 찻는다. 지정된 특성이 없거나 정수로 분석될 수 없으면, 두 번째 인수가 지정한 색상이 대신 리턴 됩니다.

getColor(String, int) : 시스템 특성에서 색을 찾습니다. 지정된 특성이 없거나 정수로 분석될 수 없으면, 정수값(int)이 대신 사용되고 색으로 변환

getGreen() : 색의 초록 컴포넌트를 가져온다. (0~255)

getRed() : 색의 빨강 컴포넌트를 가져온다. (0~255)

getRGB() : 기본 RGB ColorModel에 있는 색을 표시하는 RGB 값을 가져옵니다. 리턴되는 정수의 24-31 비트는 0xff를, 16-23 비트는 빨강 값을, 8-15 비트는 초록 값을, 0-7 비트는 파랑 값을 나타 냅니다.




--------------------------------

java.awt.Font - 사용방법

----------------------------

버튼을 생성한 후에 버튼의 라벨을 TimesRoman 형 폰트에 진한 글씨로 크기를 20으로 하고자 할 경우 다음과 같이 설정할 수 있습니다.

Button btn = new Button("확인"); Font font = new Font("TimesRoman", Font.BOLD, 20); btn.setFont(font);

그래픽 컨텍스트에 그려지는?글자에 폰트를 지정하는 방법은 다음과 같습니다.

public void paint(Graphics g) {

Font f = new Font("TimesRoman", Font.BOLD, 20);

g.setFont(f);

g.drawString("Hello, World!", 10, 10);

}


자바 폰트 이름 X 윈도우 폰트 이름 윈도우즈 폰트 이름

Helvetica adobe-hevetica Arial

TimesRoman adobe-times Times New Roman

Courier adobe-courier Courier New

Dialog b&h-lucida MS Sans Serif

DialogInput b&h-lucidatypewriter MS Sans Serif

ZapfDingbats itc-zapfdingbats WingDings

default misc-fixed Arial



[예제] // 폰트 패밀리, 논리폰트명 출력

import java.awt.*;
class FontSample {
static Font font1 = new Font("TimesRoman", Font.ITALIC, 45);
static Font font2 = new Font("Helvetica", Font.BOLD, 12);
static Font font3 = new Font("Verdana", Font.PLAIN, 16);
public static void main(String args[]) {
System.out.println("family name of font1 : " + font1.getFamily());
System.out.println("family name of font2 : " + font2.getFamily());
System.out.println("family name of font3 : " + font3.getFamily());
System.out.println("name of font1 : " + font1.getName());
System.out.println("name of font2 : " + font2.getName());
System.out.println("name of font3 : " + font3.getName());
System.out.println("style of font1 : " + font1.getStyle());
System.out.println("style of font2 : " + font2.getStyle());
System.out.println("style of font3 : " + font3.getStyle());
System.out.println("size of font1 : " + font1.getSize());
System.out.println("size of font2 : " + font2.getSize());
System.out.println("size of font3 : " + font3.getSize());
} }



[예제] // 논리 Font명 및 시스템속성

import java.awt.*;
import java.util.*;
public class SysInfo {
public static void main(String[] args) {
Toolkit thekit = Toolkit.getDefaultToolkit();
System.out.println("\n Screen Resolution : " + thekit.getScreenResolution() + "dots per inch");
Dimension screenDim = thekit.getScreenSize();
System.out.println("Screen Size : " + screenDim.width + " by "+screenDim.height + " pixels");
GraphicsEnvironment e = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontnames = e.getAvailableFontFamilyNames();
System.out.println("\n----- fonts available on this flatform ----");
for(int i=0; i<fontnames.length; i++) { System.out.println(fontnames[i]); }
//System Properties
System.out.println("---- System Properties...... ----");
Properties p = System.getProperties();
p.list(System.out);
}
}



[예제] // CharaterIterator/StringIterator

import java.text.*;

class CharacterIteratorSample
{ public static void main(String[] args) {
//begin index:1, end index=4-1, current:1
CharacterIterator iter= new StringCharacterIterator("abcde", 1, 4, 1);
System.out.println("CharacterIterator iter --> "+iter);
iterateBackward( iter );
}

public static void iterateBackward(CharacterIterator iter) {
for (char ch = iter.last(); ch != CharacterIterator.DONE; ch = iter.previous())
System.out.print(ch);
}
}

java awt Container, Panel [오라클커뮤니티, 자바교육, 오라클자바커뮤니티]

-------------------------------------

java.awt.Container(Abstract)

------------------------------------- 


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


java.lang.Object --> java.awt.Component --> java.awt.Container

자신의 영역안에 다른 Component를 포함할수 있는 Component

Container도 Component Class의 하위Class 이므로 그 자체도 Component로 취급되며 다른 Container에 부착될 수 있습니다.

일반적으로 GUI를 만들때는 Component를 Container에 배치하고, 그런 작은 Container를 더 큰 Container에 포함시켜서 GUI를 구성 합니다.

Frame과 Applet은 대표적인 최상위 Container이다. 최상위 Container란 다른 Container를 포함하여 맨 바깥쪽 Container로 사용되는 컨테이너를 지칭 합니다. 이에 비해 Panel은 다른 Container에 부착되어 일부 영역을 Control하는 경우에 사용 됩니다. Window는 많이 사용되지 않으며 하위 Class인 Frame이 많이 사용 됩니다.

Dialog와 FileDialog Container는 대화창에서 주로 사용 됩니다.

컴포넌트를 컨테이너에 추가할 때 색인이 지정되지 않을 경우, 목록 끝(즉, 스택 순서 아래)에 추가 됩니다.

Panel, ScollPane, Window의 상위 클래스


Window클래스나 Window 클래스의 파생클래스(Frame등)는 포함 할 수 없습니다.



Container – component 추가/제거/추출 메소드

add(Component) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, int) : 해당 위치에 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(Component, Object) : 지정된 컴포넌트를 컨테이너의 끝에 추가 합니다.

add(Component, Object, int) : 지정된 색인에서 지정된 제약 조건이 있는 컨테이너에 지정된 컴포넌트를 추가 합니다.

add(String, Component) : 컨테이너에 지정된 컴포넌트를 추가 합니다.

remove(Component) : 컨테이너에서 지정된 컴포넌트를 제거 합니다.

remove(int) : 컨테이너에서 index에 의해 지정된 컴포넌트를 제거 합니다.

remove() : 컨테이너에서 모든 컴포넌트를 제거합니다.

getcomponent(int) : 컨테이너에 있는 n번째 컴포넌트를 가져 옵니다.

getcomponentAt(int, int) : x,y 위치가 포함된 컴포넌트 위치를 찾습니다.

getcomponentAt(Point) : 지정된 지점이 포함된 컴포넌트를 가져 옵니다.

getcomponentCount() : 패널에 있는 컴포넌트의 수를 가져 옵니다.

getComponents() : 컴포넌트에 있는 모든 컴포넌트를 가져 옵니다.

isAncestorOf(Component) : 컨테이너의 컴포넌트 계층구조에 컴포넌트가 포함되어 있는지 확인 합니다.



Container – 그래픽/이벤트와 관련된 메소드

update(Graphics) : 컨테이너를 갱신 합니다.

paint(Graphics) : 컨테이너의 색상을 표시 합니다.

paintComponents(Graphics) : 컨테이너에 있는 각 컴포넌트의 색상을 표시 합니다.

print(Graphics) : 컨테이너를 인쇄합니다.

printComponents(Graphics) : 컨테이너의 각 컴포넌트를 인쇄 합니다.

addContainerListener(ContainerListener) : 컨테이너로부터 컨테이너 이벤트를 수신하기 위해 지정된 컨테이너 수신기(listener)를 추가 합니다.

processContainerEvent(ContainerEvent) : 등록된 ContainerListener 객체로 보내어 컨테이너에서 발생하는 컨테이너 이벤트를 처리 합니다.

processEvent(AWTEvent) : 컨테이너의 이벤트를 처리 합니다.

doLayout() : 컨테이너가 컴포넌트를 배치하도록 합니다.

getLayout() : 컨테이너의 배치 관리 프로그램을 가져 옵니다.

setLayout(LayoutManager) :컨테이너에 대한 배치 관리 프로그램을 설정 합니다.

validate() : 컨테이너와 모든 부속 컴포넌트를 확인합니다. 컨테이너와 하부 컴포넌트를 다시 배치 합니다.

invalidate() : 컨테이너와 모든 부속 컴포넌트가 다시 그려져야 한다고 표시 합니다.



Container – 기타 메소드

addNotify() : 컨테이너가 피어(peer)를 작성하도록 통지 합니다.

getAlignmentX() : x축을 따라 정렬 합니다.

getAlignmentY() : y축을 따라 정렬 합니다.

getInsets() : 컨테이너의 경계 크기를 표시하는 컨테이너의 인세트(inset)를 결정 합니다.

getMaximumSize() : 컨테이너의 최대 크기를 리턴 합니다.

getMinimumSize() : 컨테이너의 최소 크기를 리턴 합니다.

getPreferredSize() : 컨테이너의 선호 크기를 리턴 합니다.

invalidate() : 컨테이너를 무효로 합니다.

list(PrintStream, int) : 지정된 출력 스트림에 컨테이너 목록을 인쇄 합니다.

list(PrintWriter, int) : 지정된 들여쓰기 위치에서 시작하여 지정된 인쇄 작성자로 목록을 인쇄 합니다.

removeNotify() : 컨테이너와 모든 부속 컴포넌트가 피어를 제거하도록 통지 합니다.





------------------------------

java.awt.Panel

--------------------------

다른 Component나 그하위 Component들이 표시될수 있는 장소를 제공하나 , 스스로 화면에 그릴수는 업습니다.

자기를 스스로 그릴수 있는 다른 Window나 그하위의 Frame, Dialog 와 같은 Component에 포함시켜서 사용해야 합니다.

Panel Class에서만 제공하는 주요한 메소드 특별히 없습니다. 결국 다른 Component를 포함할수 있다는 점을 제외하면 Canvas와 별차이가 없다고 할수 있습니다.

Applet Class가 Panel Class를 상속합니다.

Applet은 브라우저창에서 실행되므로 자신을 그릴수 있는 기능을 제공하지 않는 Panel을 상속한다고 볼 수 있습니다.



[예제]

/* 프레임에 Panel을 올리는 예제 */
import java.awt.*;
public class PanelTest extends Frame{
public PanelTest(String s) {
super(s);
}
public static void main(String[] args) {
PanelTest f = new PanelTest("Frame에 Pamel을 넣는예제");
Panel p = new Panel();
f.setSize(300,300);
f.setLayout(null);
p.setSize(150,150);
p.setBackground(Color.blue);
f.add(p);
f.setVisible(true);
}

[오라클자바커뮤니티, ORACLEJAVANEW.KR]

Struts Framework의 DynaActionForm 클래스에 대해 알아봅니다...


오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷 실무전문 강의)  


ActionForm을 이용하면 개발 시간을 줄일 수 있는 이점이 있지만 심각한 단점이 있습니다. 그 단점이라 함은 Action이 늘어 날 때 마다 엄청난 ActionForm 클래스가 생겨나야 한다는 점 입니다.

비록 ActionForm을 여러 페이지에서 공유 한다고 하더라도 유지보스 역시 어려워지게 되는 것 입니다. 그래서 머리를 좀 써 ActionForm은 하나만 만들고 그 안에 모든 속성의 처리를 끝내 버리는 사람들도 있습니다. 그러나 이 방식은 여러 명이 공동 프로젝트를 수행 하는 경우엔 이 클래스에 대해 경합이 발생 하므로 좋지 못합니다.

그리고 또한 HTML폼으로부터 얻어내는 프로퍼티를 ActionForm안에 정의 해야 한다는 것이고 추가 되거나 제거 되는 경우엔 ActionForm이 다시 컴파일 되어야 한다는 것 입니다.

이러한 이유 때문에 동적이며 애플리케이션에서 ActionForm의 실제 구현 클래스를 만들 필요가 없는 새로운 ActionForm  클래스가 스트럿츠 프레임워크에 추가되게 된 것 입니다.

동적인 ActionForm과 그렇지 않은 ActionForm의 차이는 ActionForm이 정의하는 프로퍼티, validate() 메소드, reset() 메소드 입니다.


---------------------------
동적인 ActionForm 설정
---------------------------

DynaActionForm을 사용하기 위해서는 일반 ActionForm과 같이 설정 파일에 <form-bean>요소를 추가해야 합니다.

설정 파일에서의 차이점은 동적인 ActionForm은 프로퍼티를 갖기 위해 내부에 form-property를 하나 이상 포함해야 한다는 것 입니다. DynaActionForm은 프로퍼티의 키/값 쌍을 저장하기 위해 java.util.Map을 사용 합니다. 즉 프러임워크에서 form-property 요소를 Map으로 로딩하여 설정 합니다.

아래는 그 설정 예 입니다.

<form-beans>
<form-bean
name="loginForm"
type="org.apache.struts.action.DynaActionForm">
<!-- Specify the dynamic properties of the form -->
<form-property  name="email" type="java.lang.String "/>
<form-property name="password" type="java.lang.String "/>

<!-- You can also set the initial value of a property -->
<form-property  initial="false" name="rememberMe"  type="java.lang.Boolean "/>
</form-bean>
<form-beans>


이와 같이 설정하면 이 ActionForm을 동적으로 만들어 주는데 런타임에 DynaAction클래스의 인스턴스를 생성 하고 설정된 프로퍼티를 위한 get, set 함수를 제공해 줍니다. 새 프로퍼티를 추가 하기 위해서는 설정만 수정하면 자동으로 다 해결 되므로 소스코드를 수정 할 필요는 없습니다.

ActionForm의 reset() 메소드는 기본적으로 아무 동작도 하지 않았지만 DynaActionForm의 reset() 메소드는 모든  프로퍼티를 초기 값으로 초기화 합니다.


===========================================================

[예]

-----------------
설정 파일에서…
-----------------
<form-beans>
<form-bean name="CalcForm" type="org.apache.struts.action.DynaActionForm">                 
            <form-property name="s1" type="java.lang.String" />                   
            <form-property name="s2" type="java.lang.String" />   
        </form-bean>
    </form-beans>

----------------------------------
Action 클래스에서  값을 읽어 오기
----------------------------------

DynaActionForm dForm = (DynaActionForm)form;
           
int s1 = Integer.parseInt(dForm.get("s1").toString());
int s2 = Integer.parseInt(dForm.get("s2").toString()); 

2013년 8월 2일 금요일

JAVA AWT Text Event 예제

import java.awt.*;
import java.awt.event.*;

class TextEventTest extends Frame implements TextListener{
        TextArea ta;
       
        public TextEventTest() {
                ta = new TextArea("Text Area...");
                ta.addTextListener(this);
                add(ta, BorderLayout.CENTER);               
                addWindowListener(new WindowEventHandler());
        }
        class WindowEventHandler extends WindowAdapter {
                public void windowClosing(WindowEvent we) {
                        System.exit(0);
                }
               
        }
       
        public void textValueChanged(TextEvent te) {
                System.out.println(te.paramString());               
        }
       
        public static void main(String[] args) {
                Frame f = new TextEventTest();
                f.setSize(300,200);
                f.setVisible(true);
        }       

2013년 8월 1일 목요일

자바 InputStream (JAVA InputStream)

InputStream 클래스는 모든 파일 시스템으로부터 스트림의 한 바이트를 읽는다  

  int available(): 스레드가 대기하고 있는 상태에서 사용할 수 있는 바이트 반환, 실행을 중단하지 않고 입력 스트림에서 읽을 수  있는 바이트의 수를 리턴합니다. InputStream의 available 메소드는 0을 리턴합니다. 이 메소드는 서브클래스로 대체(override)되어야 합니다. 
  void close(): 입력 스트림을 닫는다.
  synchronized void mark(int i): 입력 스트림 상의 위치를 표시한다.
  public abstract int read(): 한 문자를 읽고 반환. 이때 스트림 끝은 -1
  int read(byte b[]): 바이트 배열을 읽는다.
  int read(byte b[], int off, int len): 배열 b의 off 위치에서 len 바이트 읽는다.
  sychronized void reset(): 마지막 표시를 반환하고, 계속 read()로 바이트를  읽을 수 있다.(mark 위치로 돌아감)
  void long skip(long i): 입력 스트림에서 n 바이트를 건너뛴다.
  public boolean markSupported() : 입력 스트림이 mark 및 reset 메소드를 지원하는지 여부를 테스트합니다
  System.in.read()는 표준 입출력 스트림으로부터 요구된 자료가 주어질 때까지 실행을 대기하고 있다가 리턴키가 전송될 때 비로소 진행한다. 읽는 단위는 ASCII의 8비트 문자단위이다.


// 읽은 문자를 정수(int)로 취급하는 경우
import java.io.*;
public class TestFile{
  public static void main (String args[]) throws IOException {
    StringBuffer buf=new StringBuffer();   
    int i; 
    while ((i=System.in.read())!=-1)// -1은 eof에 해당하는 코드
        buf.append((char)i); // ctrl+z은 -1에 해당한다.
    System.out.println();
    System.out.print(buf.toString());//StringBuffer를 string으로 변환
  }
}




//system.in.read()를 char로 형변환
import java.io.*;
public class TestFile1{
  public static void main (String args[]) throws IOException {
    StringBuffer buf=new StringBuffer(); 
    char c;
    while ((c=(char)System.in.read())!='\n')
        buf.append(c);
    // 여기서는 ctrl+z이 필요없다. 왜냐면 문자로 읽기 때문이다.
    System.out.print(buf.toString()); //StringBuffer를 string으로 변환
  }
}


------------------------------
BufferedInputStream –  예제
------------------------------
import java.io.*;
public class BufferedStatement {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream(args[0]);
BufferedInputStream bis = new BufferedInputStream(fis);
System.out.println("Stream 되돌리기 기능......"+bis.markSupported());
bis.mark(1024); //마킹을 해둔곳으로부터 1024 Byte 읽기전까지는 마킹이 유효
for(int i=0;i<10;i++) {
System.out.write(bis.read());
}
bis.reset();
System.out.println("\n reset() 호출");
for(int i=0; i< 20; i++) {
System.out.write(bis.read());
}
}
}


자바인터페이스(java interface)

자바와 다중상속
      - 다중 상속이라는 것은 말 그대로 하나의 클래스가 여러개의 수평적 상위클래스를 갖는 것이다. 
      - 다중 상속은 사용이 어렵고 오류를 범하기 쉬울 뿐 아니라 만약 사용한다고 하더라도 문법이 복잡해져 객체지향 기술 중에서도 많이 사용되지 않는 기능이다. 물론 다중 상속을 이용하면 하나의 클래스가 여러가지 일을 할 수 있는 기능을 제공할 수 있고 덕분에 유연한 프로그래밍이 가능해진다는 장점이 있다. 
      - C++과 같은 언어는 이러한 다중상속을 지원하지만 Java는 다중상속을 지원하는 것을 포기했다. 자바를 만든 이유는 작고 단순하고 안전한 프로그램을 만들자는 것이었다. 다중상속은 이러한 프로그램의 안정성을 저해하는 요소가 될 수 있기에 다중상속을 포기하게 된 것이다. 
      - 하지만 여전히 여러가지 기능을 가지는 클래스의 존재는 객체지향언어인 자바에서는 자주 필요하게 된다. 여러가지 기능을 가진 유연한 클래스를 만들기 위해 다중상속만을 지원하는 자바는 또 다른 방법을 고안해야 했다. 이것이 바로 인터페이스이다.


인테페이스
      - 인터페이스라는 단어는 두개의 장치 및 시스템을 결합하고 있는 소프트웨어 또는 하드웨어라는 의미이다.
- 상수와 추상메소드의 집합
 - 인터페이스를 사용할려면 클래스에서 구현해야 한다.(implements)
 - 클래스가 인터페이스를 구현하게 되면 인터페이스 내에 정의된 상수는 상속된 것 처럼 직접 사용할수 있다.
 - 인터페이스의 모든 메소드는 abstract가 생략되었다고 해도 암시적으로 abstract이다.
 - 메소드의 구현을 갖지 않으며, 몸체부분은 세미콜론으로 대체된다.
 - 오직 abstract 메소드만을 포함할수 있으며 클래스 메소드는 abstract가 될수 없으므로 인터페이스의 모든 메소드는 인스턴스 메소드 이다. 



      - 직원 중 운전을 할 수 있는 직원이 있으며 이 직원은 회사에서 보유하고 있는 차량을 사용할 수 있다. 만약 모든 직원이 자동차 면허를 가지고 있다면 Employee 클래스에서 자동차 면허에 대한 필드와 메소드를 만들면 되지만 모든 직원이 자동차 면허를 가지고 있을리는 없을 것이다. 때문에 다중 상속이 지원되지 않는 자바에서 자동자 면허를 가지고 있는 직원 클래스를 따로 만들고 그 클래스를 이용해 면허를 가진 영업팀 직원, 면허를 가진 Manager, 면허를 가진영업팀장 이라는 식의 클래스를 만들어야 구현이 가능하다.


Employee 클래스와 DriverEmployee 클래스가 서로 큰 연관성이 없으며 운전을 할 줄 아는 직원을 만들기 위해DriverEmployee 클래스를 따로 만들고 각 팀 직원들도 운전하는 직원을 따로 만들어야 한다면 프로그램 개발 시 일관성이 없고 복잡해 진다. 이런 문제를 해결하기 위해 운전하는 직원을 클래스로 따로 만드는 대신 운전이라는 인터페이스를 만들어 필요할 때 사용할 수 있으면 위와 같은 문제점을 해결할 수 있을 것이다. 

인터페이스는 모양은 클래스와 비슷하지만 다른 점이 있다. 클래스는 필드와 메소드로 구성되어 있고 또 그 메소드는 자신이 할 일을 구현하고 있다. 하지만 인터페이스는 선언만을 하게 된다. 만약에 2종 운전 면허에 대한 인터페이스 SmallDriver를 작성한다면 다음과 같다.
      public interface SmallDriver { 
          void driveSmallCar(); // 메소드 선언 
          int maxSmall = 5; // 필드(상수) 
      } 
클래스는 필드로 기본자료형, 클래스 등이 올 수 있지만 인터페이스는 int, double 등의 기본 자료형만이 필드로 사용될 수 있다. 또한 각 필드는 반드시 초기화가 되어야 한다. 초기화가 되어야 하는 이유는 인터페이스의 필드는 암시적으로 final과 static이 설정되어 있기 때문이다.
      int maxSmall = 5   static final int maxSmall = 5;


인터페이스는 메소드를 선언만 하고 구현하지는 않는다. 그리고 인터페이스의 모든 메소드는 접근지정이 기본적으로 public으로 설정된다. 그리고 모든 메소드는 추상메소드이다. 즉 위에서 void driveSmallCar();라고 선언하고 있는데 암시적으로 설정되는 public과 abstract 키워드를 추가하면 다음과. 같이 선언되어 있는 것과 같다.
      public abstract void driveSmallCar();
앞에서 만든 SmallDriver 인터페이스를 상속한 1종 운전면허 인터페이스 BigDriver를 만든다면 다음과 같다.
      public interface BigDriver extends SmallDriver { 
          void driveBigCar(); 
          void driveSmallCar(); // 다시 선언하는 경우 
          int maxBig = 15; 
      } 


상위 인터페이스에서 선언된 메소드를 하위클래스에서 동일한 명칭으로 선언한 경우 경우에 따라 두가지로 나눌 수 있다. 
첫째는 상위 인터페이스의 메소드와 하위 인터페이스의 메소드 선언이 완전히 동일한 경우이다. 상위 인터페이스의 메소드만 유효한 것으로 인정하고 컴파일 에러는 발생하지 않는다.
둘째는 상위 인터페이스의 메소드와 하위 인터페이스의 메소드가 가지는 매개변수의 갯수가 서로 틀린 경우인데 이 경우는 각각 서로 다른 메소드가 선언된 것으로 간주한다. 즉 메소드가 오버로딩 된 것으로 인식하는 것이다.
하지만 위 두가지의 경우에 해당되지 않고 이름과 매개변수가 같은데 반환형만 다른 경우는 컴파일 에러가 발생하게 된다
예를 들어 SmallDriver에 선언되어 있는 상수 maxSmall을 BigDriver에서 다시 선언한다면? 이 경우 메소드는 하나만 인정하지만 상수의 경우는 범위 규칙에 의해서 SmallDriver의 maxSmall과 BigDriver의 maxSmall을 서로 다른 것으로 인식하여 두개의 상수가 선언된 것으로 인정한다. 사용시에는 상수의 위치에 따라 인터페이스명.상수명의 형태로 사용해야 한다.


인터페이스에서  선언된 메소드의 구현은 인터페이스를 구현하도록 허락된 클래스에서 구현하게 된다. 인터페이스를 상속받는 클래스는 컴파일러에게 "나는 A 라는 클래스인데 인터페이스 B를 완성해서 도구로 사용할꺼야"라고 알려준다. 
      public class A implements B {
만약 영업팀 직원이 운전을 하는것을 구현할려고 하면 기존의 영업팀직원 클래스가 driveSmallCar()를 구현해야 하며 그렇게 하기 위해서는 interface를 implement한다고 클래스에 표시해야 한다.


//인터페이스 선언
interface SmallDriver { 
  void driveSmallCar(); // 메소드 선언 
  int maxSmall = 5; // 필드(상수) 
}
//직원 Class
abstract class Employee {
    String name;    String id;
  //생성자
    public Employee(String name1, String id1) {
name = name1;        id = id1;
    }
    public void gotoOffice() { System.out.println(name+"님 출근하였습니다..."); }
    public void gotoHome() {  System.out.println(name+"님 퇴근하였습니다..."); }
    public String toString() { return "직원의 이름은 " + name + "이다.";    }
    abstract public void startJob();
}

//직원클래스를 상속한 영업팀직원 클래스
class SalesEmployee extends Employee implements SmallDriver{
    //영업담당지역, 차종류 메소드내에서만 변수에 접근이 가능하다.


    private String chargeArea, carName;
    public SalesEmployee(String newName,String newID,String newArea,String carName) {
        //super는 상위클래스의 생성자를 의미
        super(newName, newID); this.chargeArea = newArea; this.carName    = carName;
    }
// SmallDrive 인터페이스의 메소드 구현 
    public void driveSmallCar() { 
System.out.println("영업팀 직원 " + name + "은 " + this.carName + "를 운전한다.");
    }
    public void startJob() {
        System.out.println(super.name + "님이 " + this.chargeArea + " 지역으로 영업업무를 나갑니다...");
    }
}
//Main Class
class InterfaceSample1 {
    public static void main(String[] args) {
        // 인터페이스가 클래스의 객체를 참조하도록...
        SmallDriver sm1 = new SalesEmployee("홍길동", "11111","서울", "아반테");       
        // 인터페이스의 메소드 사용
        sm1.driveSmallCar();
    }
}

JAVA, JAR EXAMPLE(자바 JAR, 자바실무교육, 오라클자바실무, 오엔제이프로그래밍)

JAR 명령어는 UNIX TAR와 비슷해서 공부하기도 쉽습니다.

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의) 


Jar c|t|u|x[f][m][M][0][v] [jar파일의이름] [menifest] [-C directory] [files]
  Jar –I[jar]
  - 처음 Option의 첫번째 문자(기본적인 연산을 지정)
  c : 새로운 Jar Archive를 생성, 마지막인자로 입력파일등을 표시, 새롭게 생성된 JAR File 
      은 첫번째 엔트리로 META-INF/MENIFEST.MF 파일을 가지며 이파일은 JAR File의 
      내용을 나열하며 각각의 파일에 대한 메시지 요약을 포함한다.
  t : Jar Archive의 내용을 나열한다. 
  u : Jar Archive 파일의 내용을 갱신, 커맨드라인에 나열된 파일은 이 아카이브에 추가된다. 
      m 옵션과 같이 사용된 경우에는 지정된 메니페스트 정보를 Jar File 에 추가한다.
 x : JAR Archive의 내용을 추출한다.
 - 한정자 옵션(4개의 명령지정문 뒤에서 연산에 관한 자세한 정보를 제공)
 f: jar가  Command Line의 지정된 이름의 JAR File에 대해 수행되는 것임을 나타낸다. 
    지정되지 않으면 표준입력으로 JAR File을 읽고 표준출력으로 JAR File을 쓴다.
m : 메니페스트 템플릿이 코맨드라인에 지정되었음을 JAR 명령에게 알린다.,(c,u Option과
    함께사용)


M : jar가 기본 메니페스트 파일을 생성하지 않도록 함(c, u와 함께 사용)
v : 여러 가지 출력을 내보내도록 함
0 : jar가 압축 없이 파일을 JAR 아카이브에 저장 하도록 함 

첫번째 옵션이 f를 포함한다면 jar파일의 이름을 기술하며, m을 포함한다면 menifest파일이름을 기술한다. 만약 첫번째 Option이 f,m을 모두 포함한다면 이와 동일한 순서로 나열해야 한다. Files에는 JAR Archive에 포함시킬 파일을 나열한다.

** 추가옵션
-C Directory : Jar가 다음파일및 디렉토리를 처리하는중에 지정된 dir을 바꾸도록 한다. –C Option은 몇개라도 사용이 가능하며, 다음 –C Option이 올때까지 유효하다.
-I jarfile : c,t,u,x 대신 사용, Jar File의 파일구조등의 인덱스를 산출하도록, META-INF/INDEX.LIST 파일에 저장
 추후 자바인터프리터나 애플릿뷰어등이 알고리즘의 최적화하고 불필요한 Jar File을 다운로드 하지 않기 위해서 이 인덱스 정보를 이용활수 있다.



jar cvf hello.jar HelloWorld*.class
jar cf hello.jar HelloWorld*.class -> 위의 것과 동일하나 화면에 출력이 나타나지 않는다.
jar cmf myMenifest test.jar HelloWorld.class -> test.jar File을 만들면서 myMenifest 라는 파일의 내용을 MENIFEST.MF File에 첨가한다.
Jar ufm test.jar myMenifest -> 이미 만들어져 있는 test.jar File의 MENIFEST.MF File을 myMenifest 를 참조하여 갱신한다.
Jar umf myMenifest test.jar

D:\자바프로그래밍\예제>jar tvf hello.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
D:\자바프로그래밍\예제>jar tf test.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class


D:\자바프로그래밍\예제>jar uf test.jar HelloWorld1.class

D:\자바프로그래밍\예제>jar uf test.jar HelloWorld2.class

D:\자바프로그래밍>jar cvf sample.jar -C 예제/  .  sample.jar file은 예제 dir에 생김

D:\자바프로그래밍\예제>jar tvf test.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
  391 Fri Jun 28 17:35:00 KST 2002 HelloWorld1.class
  354 Fri Jun 28 17:35:00 KST 2002 HelloWorld2.class

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA Jar 사용법

오라클자바커뮤니티에서 설립한 오엔제이프로그래밍 실무교육센터
(오라클SQL, 튜닝, 힌트,자바프레임워크, 안드로이드, 아이폰, 닷넷  실무전문 강의)




Jar c|t|u|x[f][m][M][0][v] [jar파일의이름] [menifest] [-C directory] [files]
  Jar –I[jar]
  - 처음 Option의 첫번째 문자(기본적인 연산을 지정)
  c : 새로운 Jar Archive를 생성, 마지막인자로 입력파일등을 표시, 새롭게 생성된 JAR File 
      은 첫번째 엔트리로 META-INF/MENIFEST.MF 파일을 가지며 이파일은 JAR File의 
      내용을 나열하며 각각의 파일에 대한 메시지 요약을 포함한다.
  t : Jar Archive의 내용을 나열한다. 
  u : Jar Archive 파일의 내용을 갱신, 커맨드라인에 나열된 파일은 이 아카이브에 추가된다. 
      m 옵션과 같이 사용된 경우에는 지정된 메니페스트 정보를 Jar File 에 추가한다.
 x : JAR Archive의 내용을 추출한다.
 - 한정자 옵션(4개의 명령지정문 뒤에서 연산에 관한 자세한 정보를 제공)
 f: jar가  Command Line의 지정된 이름의 JAR File에 대해 수행되는 것임을 나타낸다. 
    지정되지 않으면 표준입력으로 JAR File을 읽고 표준출력으로 JAR File을 쓴다.
m : 메니페스트 템플릿이 코맨드라인에 지정되었음을 JAR 명령에게 알린다.,(c,u Option과
    함께사용)


M : jar가 기본 메니페스트 파일을 생성하지 않도록 함(c, u와 함께 사용)
v : 여러 가지 출력을 내보내도록 함
0 : jar가 압축 없이 파일을 JAR 아카이브에 저장 하도록 함 

첫번째 옵션이 f를 포함한다면 jar파일의 이름을 기술하며, m을 포함한다면 menifest파일이름을 기술한다. 만약 첫번째 Option이 f,m을 모두 포함한다면 이와 동일한 순서로 나열해야 한다. Files에는 JAR Archive에 포함시킬 파일을 나열한다.

** 추가옵션
-C Directory : Jar가 다음파일및 디렉토리를 처리하는중에 지정된 dir을 바꾸도록 한다. –C Option은 몇개라도 사용이 가능하며, 다음 –C Option이 올때까지 유효하다.
-I jarfile : c,t,u,x 대신 사용, Jar File의 파일구조등의 인덱스를 산출하도록, META-INF/INDEX.LIST 파일에 저장
 추후 자바인터프리터나 애플릿뷰어등이 알고리즘의 최적화하고 불필요한 Jar File을 다운로드 하지 않기 위해서 이 인덱스 정보를 이용활수 있다.



jar cvf hello.jar HelloWorld*.class
jar cf hello.jar HelloWorld*.class -> 위의 것과 동일하나 화면에 출력이 나타나지 않는다.
jar cmf myMenifest test.jar HelloWorld.class -> test.jar File을 만들면서 myMenifest 라는 파일의 내용을 MENIFEST.MF File에 첨가한다.
Jar ufm test.jar myMenifest -> 이미 만들어져 있는 test.jar File의 MENIFEST.MF File을 myMenifest 를 참조하여 갱신한다.
Jar umf myMenifest test.jar

D:\자바프로그래밍\예제>jar tvf hello.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
D:\자바프로그래밍\예제>jar tf test.jar
META-INF/
META-INF/MANIFEST.MF
HelloWorld.class


D:\자바프로그래밍\예제>jar uf test.jar HelloWorld1.class

D:\자바프로그래밍\예제>jar uf test.jar HelloWorld2.class

D:\자바프로그래밍>jar cvf sample.jar -C 예제/  .  sample.jar file은 예제 dir에 생김

D:\자바프로그래밍\예제>jar tvf test.jar
    0 Fri Jun 28 19:07:24 KST 2002 META-INF/
    95 Wed Jul 03 00:08:38 KST 2002 META-INF/MANIFEST.MF
  430 Fri Jun 28 18:30:38 KST 2002 HelloWorld.class
  391 Fri Jun 28 17:35:00 KST 2002 HelloWorld1.class
  354 Fri Jun 28 17:35:00 KST 2002 HelloWorld2.class