레이블이 JDK다운인 게시물을 표시합니다. 모든 게시물 표시
레이블이 JDK다운인 게시물을 표시합니다. 모든 게시물 표시

2013년 8월 8일 목요일

[ORACLEJAVA커뮤니티]자바 제어문, 반복문

이번 강좌에서는 자바의 제어문과 반복문에 대해 알아 보기로 하겠습니다.



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



1. 제어문(if else)

형식 :

if (boolean- 수식 ) 문장

if (boolean- 수식 ) 문장 else 문장



if문에 대해서는 별다른 설명이 필요 없을것 같습니다. (당연하죠^^)

[예제]

class IfTest {
public static void main( String args[] ) {
int i=3;
if (i%3 == 0)
System.out.println("3의 배수");
else if (i % 3 == 1)
System.out.println("3의 배수 + 1");
else
System.out.println("3의 배수 + 2 ");
}
}



[결과]

3의 배수



2. 제어문 (switch, case, break)

정수를 조건으로 해서 해당되는 실행문을 실행 하게 합니다. break 의 경우 자신을 둘러싸는 가가운 {} 를 벗어난 다음으로 실행 순서를 옮깁니다. default 는 case 로 명시하지 못한 정수 값 일때(이도 저도 아닐때)수행 되 는 겁니다.

[예제]

class SwitchTest
{
public static void main( String args[] )
{
func(1);
func(2);
}

static void func(int i)
{
switch( i % 3 )
{
case 0:
System.out.println( "3의 배수 " );
break;
case 1:
System.out.println( "3의 배수 + 1" );
default:
System.out.println( "3의 배수 + 2" );
}
}
}

[결과]
3의 배수 + 1
3의 배수 + 2
3의 배수 + 2

3. 제어문 (for, continue)

지정된 조건이 해당될 때까지 문장 ( 혹은 블록 ) 을 실행하는 반복문 입니다.For 문의 괄호 안은 3 가지 부분으로 나뉘어져 있는데 구 분 세미콜론 (;) 이며 첫번째 부분은 초기치 , 두 번째 부분은 조건 , 세번째 부분은 증감 부분 입니다.(다들 아시죠^^). 복잡한 다중 루프인 경우에는 label 을 사용하여 기존 언어의 goto문의 효과를 나타낼 수 있습니다.

continue 명령을 사용하면 그 이후부터 블록의 끝까지를 수행하지 않고(Skip해 버림) for 문이 있는 곳으로 제어를 이동 시킵니다. continue 에 label 을 기술하여 그 label 이후부터 다시 실행하게 할 수 있으며 Break 명령어의 경우도 label 을 써서 중첩된 구조를 빠져 나올 수 있으나 continue 와는 다르게 다음 반목 문을 수행하지 않습니다. For(;;) 의 경우 무한반복을 수행하며 빠져 나오기 위 해서는 별도의 조건을 이용하여 break 로 빠져 나옵니다 .

[예제]

//ForTest.java
class ForTest {
public static void main(String[] args) {
myLabel :
for(int i=0; i < 9; i++) { >
for(int j=0; j < 5; j++) { >
if (i % 2 ==0) {
System.out.println("continue myLabel");
continue myLabel;
}
else if (i == 5) {
System.out.println("break myLabel");
break myLabel;
}
System.out.println(i + " " + j);
}
}
}
}




[결과]
continue myLabel
1 0
1 1
1 2
1 3
1 4
continue myLabel
3 0
3 1
3 2
3 3
3 4
continue myLabel
break myLabel


4. 제어문 (while, do while)

‘ for ' 문과 마찬가지로 반복 수행을 가능하게 해주는 제어문 이며 지정된 조건이 참인 동안에 수행된다 .while문인 경우 만약 조건에 맞지 않다면 한번도 수행되지 않을 수 있지만 do~while문은 일단 한번 수행한 후 조건을 비교하므로 최소 한번은 수행한다는 것이 차이가 있습니다.

[예제]

//While.java
class While {
public static void main(String[] args) {
//1부터 10까지의 합을 구합니다.
int i=0, sum=0;
while(i<10) { >
i++;
sum += i;
}
System.out.println("while문으로 구한 합 : " + sum);

i=0; sum=0;
do
{
i++;
sum += i;
}while (i<10); >
System.out.println("do~while문으로 구한 합 : " + sum);
}

[결과]
while문으로 구한 합 : 55
do~while문으로 구한 합 : 55 

[ORACLEJAVA COMMUNITY, ORACLEJAVANEW.KR]자바, 식별자,자료형,주석

이번 강좌 부터는 기본적인 자바의 문법을 공부해 보도록 하겠습니다. 쉬운것이니 천천히 읽고 실습하시기 바랍니다. 먼저 주석에 대해 보자구요~


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




주석 (comment)
Line comment : //
Block comment :

식별자
변수, 메쏘드, 클래스, 패키지 이름을 정하는데 사용합니다.
유니코드 자바 문자 또는 유니코드 숫자
A-Z a-z _ $ 혹은 다양한 국가의 문자 사용 가능 합니다.
길이에 제한이 없으며, 대소문자 구분 합니다.
시작은 반드시 유니코드 자바 문자로 시작 해야 합니다.

[원칙]
대소문자 구별
클래스 및 인터페이스의 이름은 대문자로 시작
변수 및 메소드의 이름은 소문자로 시작
두 단어 이상으로 구성 시 각 단어의 시작은 대문자

리터럴 (Literals)
리터럴이란 원시타입, 스트링 타입, 널 타입을 나타내는 소스 코드를 의미 합니다.
Integer Literal, Floating Point Literal
Boolean Literal, Character Literal, String Literal
Null Literal

흔히 수식에서 사용하는 “34”라는 값을 프로그램 내에서 그대로 표현하는 것을 말합니다.
String s = "korea" --> 문자 리터럴
int i=10; --> 숫자 리터럴

자바에서의 자료형


기본자료형
기본 자료형(원시자료형)
byte : 8비트, 2의 보수 (-128 ~ 127)
short : 16비트 (-32768 ~ 32767)
char : 16비트, 유니코드 (0 ~ 65535)
int : 32비트 (-2147483648 ~ 2147483647)
long : 64비트 (-9223372036854775808 ~ 9223372036854775807)
float : 32비트
double : 64비트
boolean : true, false
종류
void 자료형(원시자료형) --> 아무런 값도 반환하지 않는 메소드 정의에 사용
참조형--> 객체의 참조 값을 나타내는 자료형(포인터와 유사)
배열 참조형,클래스 참조형,인터페이스 참조형
변수 --> 해당 자료형의 값을 기억할 수 있는 기억 장소
참고 : 닷넷에서는 자바의 기본자료형을 Value-Type, 참조형을 Reference-Type이라고 부릅니다.
[예제 -- 기본자료형과 참조형의 차이]
//기본자료형과 참조형의 차이
public class Sample1 {
static int a=10, b=10; //a와 b는 기본자료형 이다.(스택에 저장)
public static void main(String[] args) {
System.out.println("초기상태 : a="+a+", b="+b); //여기서는 각각 10으로 나온다.
a=1; //a를 1로...
b=a; //a의 값을 b로 복사해서 넣는다. 즉 b가 1이됨
a=2; //다시 a를 2로...
System.out.println("b="+b); //b는 1
Sample1 s1, s2; //s1과 s2는 객체 참조형으로 메모리힙에 있는 개체를 참조하고(쳐다보고) 있는 것이다.
s1 = new Sample1(); //메모리 힙에 Sample1의 인스턴스를 생성하고 s1이라는 변수가 처다보고 있슴...(포인터 변수 처럼)
s2 = s1; //s1이 쳐다보는 것을 s2도 쳐다 봄(s1이 실제 가지고 있는 값은 주소이다.. 그 주소를 s2에 넣은니 이제부터
//s1과 s2는 같은 곳을 쳐다 보고 있는 것이다. 그림으로 그려보라~
s1.a = 10; //s1에 있는 a라는 변수를 10으로 값을 바꾸었으니 당연히 s1의 a도 값이 바뀌어져 있는 것이다.
System.out.println("s2.a="+s2.a);
}
}

[결과]
초기상태 : a=0, b=0
b=1
s2.a=10



[오라클자바커뮤니티, ORACLEJAVANEW.KR,자바교육]DynaValidatorForm에서 reset하기

public class BoardInsertAction extends BaseActionLogin
{
        public ActionForward execute( ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)
        {
                        DynaValidatorForm dForm = (DynaValidatorForm)form;

       
                String title = dForm.get( "title" ).toString();
                        /*
                          게시판에 글을 입력하는 내용
                        */
                       
                        // 폼의 값들을 초기화하기 위해 reset함수 호출
                        dForm.reset( mapping , request );

                        return (mapping.findForward( "board_search_success" ));
                }
}

DynaValidatorForm을 사용했을 경우 위의 경우처럼 reset을 써도
다시 폼으로 돌아가면 예전에 입력했던 값이 남아 있습니다.
ActionForm에서는 reset함수가 먹히지만 DynaValidator폼에서는 폼의 특성상
리셋이 되지 않는 것 같습니다.
입력을 다시 하려고 입력화면에 들어갔는데
예전에 입력한 값이 남아있으면 보기에 좋지 않겠죠?
이런 경우 리셋을 하는대신 폼의 값을 없애 버리면 문제를 해결할수 있습니다.

리셋 함수를 호출하는 대신
  dForm.set( "title" , "" );
  <= 요렇게 하면 예전에 입력한 값이 보이지 않게 됩니다. ^^

[오라클자바커뮤니티, 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월 3일 토요일

[oracle hint]ACCESS 경로를 변경하는 힌트(INDEX) , 오라클,자바,교육,강좌

ACCESS 경로를 변경하는 힌트(INDEX)


구로디지털 오엔제이프로그래밍실무교육센터


이 힌트는 생긴 그대로 테이블에 있는 인덱스를 사용할 수 있도록 해주는 구문 입니다. 비트맵 인덱스에 대해서는 사용이 가능하지만 INDEX_COMBINE 힌트를 쓰는 것이 맞구요

사용법은 다음과 같습니다.

[형식]

[]

SQL> select index_name, table_name from user_indexes
  2  where table_name = 'MYEMP1';

INDEX_NAME                     TABLE_NAME
------------------------------ ------------------------------
IDX_MYEMP1_DEPTNO              MYEMP1
SYS_C0011302                   MYEMP1


인덱스가 있는 경우 where 절에 인덱스 컬럼이 보이면 오라클이 알아서 인덱스를 경유하여 데이터를 추출 한다.

SQL> select count(*) from myemp1
  2  where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:00.75
--------------------------------------------------------------------|   0 | SELECT STATEMENT  |                   |     1 |     2 |  3867   (1)|
|   1 |  SORT AGGREGATE   |                   |     1 |     2 |            |
|*  2 |   INDEX RANGE SCAN| IDX_MYEMP1_DEPTNO |  2000K|  3906K|  3867  


이번에는 인덱스를 숨겨보자. 숨긴 후 실행하면 9초 정도 걸린다.

SQL> alter index IDX_MYEMP1_DEPTNO invisible;

인덱스가 변경되었습니다.

SQL> select count(*) from myemp1
  2  where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:09.93

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT   |        |     1 |     2 | 16966   (1)| 00:03:24 |
|   1 |  SORT AGGREGATE    |        |     1 |     2 |            |          |
|*  2 |   TABLE ACCESS FULL| MYEMP1 |  2000K|  3906K| 16966   (1)|


다시 인덱스 보이도록 설정.

SQL> alter index IDX_MYEMP1_DEPTNO visible;

인덱스가 변경되었습니다.


Index 힌트만 사용한다면 오라클은 적절한 인덱스를 알아서 찾아 경유한다.
SQL>  select /*+ index */
  2          count(*)
  3    from myemp1
  4   where deptno = 2;

  COUNT(*)
----------
   2000000

   : 00:00:00.11

Execution Plan
----------------------------------------------------------
|   0 | SELECT STATEMENT  |                   |     1 |     2 |  3867   (1)|
|   1 |  SORT AGGREGATE   |                   |     1 |     2 |            |
|*  2 |   INDEX RANGE SCAN| IDX_MYEMP1_DEPTNO |  2000K|  3906K|  3867  


만약 테이블 명 다음에 인덱스 명을 여러 개 나열한다면 오라클 서버의 Optimizer는 적정한 인덱스를 찾아 실행 계획을 수립합니다.



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);
        }       

JAVA RandomAccessFile (자바 랜덤파일처리)

임의의 바이트, 텍스트등을 파일내 임의의 위치에 쓸수 있도록 허락
InputStream이나 OutputStream의 서브 클래스는 아니지만 파일의 읽기, 쓰기를 위한 독립적인 메소드를 제공한다. 


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

length() : 파일의 길이 
getFilePointer() : 현재 포인터의 위치 
seek() : 포인터 위치 설정 
readBoolean(), readByte(),readChar(), readShort(), readLong(), readInt(), readFloat(),readDouble(), readLine(), readUTF() : 해당타입의 데이터 읽기 
writeBoolean(), writeByte(),writeChar(), writeShort(), writeLong(), writeInt(), writeFloat(), writeDouble(), writeUTF() : 해당타입의 데이터 쓰기 
close() : 파일 닫기 



import java.io.*; class RandomTest { public static void main(String[] args) throws IOException {      RandomAccessFile raf=new 
                            RandomAccessFile("test.txt","rw");      raf.seek(raf.length());      raf.writeUTF("The end");      raf.close(); } }



----------------
메모장 –  예제
----------------
import java.awt.*;
import java.awt.event.*;
import java.io.*;
class NotePad extends Frame implements ActionListener {
TextArea text = null;
String filename = null;

public NotePad(String title) {
    super(title); // set title
    MenuBar menuBar=new MenuBar();
    Menu fileMenu = new Menu("File");
    menuBar.add(fileMenu);
    MenuItem openItem = new MenuItem("Open...", new MenuShortcut('O'));
    openItem.setActionCommand("Open"); // for getActionCommand
    openItem.addActionListener(this);
    fileMenu.add(openItem);


    MenuItem saveItem = new MenuItem("Save", new MenuShortcut('S'));
    saveItem.setActionCommand("Save"); // for getActionCommand
    saveItem.addActionListener(this);
    fileMenu.add(saveItem);
    MenuItem saveasItem = new MenuItem("Save As...", new MenuShortcut('V'));
    saveasItem.setActionCommand("SaveAs"); // for getActionCommand
    saveasItem.addActionListener(this);
    fileMenu.add(saveasItem);
    fileMenu.addSeparator();
    MenuItem exitItem = new MenuItem("Exit", new MenuShortcut('X'));
    exitItem.setActionCommand("Exit"); // for getActionCommand
    exitItem.addActionListener(this);
    fileMenu.add(exitItem);
    setMenuBar(menuBar);
    text = new TextArea();   


    add(text, "Center");
    addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we) {
            dispose();
            System.exit(0);
        }
    });
    setSize(500, 400);    setVisible(true);
}
public static void main(String args[]) throws Exception {
    new NotePad("Simple NotePad...");
}
public void actionPerformed(ActionEvent e) {
    String cmd=e.getActionCommand();
    if (cmd.equals("Exit"))
        System.exit(0);
    else if (cmd.equals("Open")) {
        FileDialog dialog=new FileDialog(this, "Text File Open", FileDialog.LOAD);
        dialog.show(); // file dialog is modal
        String filename=dialog.getFile();


      if (filename != null) {
            String directory=dialog.getDirectory();
            if (directory != null)
                filename=directory+filename;
            loadFile(filename);
        }
    }
    else if (cmd.equals("Save")) {
        if (this.filename != null) saveFile(this.filename);
        else {
            FileDialog dialog=new FileDialog(this, "Text File Save", FileDialog.SAVE);
            dialog.show(); // file dialog is modal
            String filename=dialog.getFile();
            if (filename != null) {
                String directory=dialog.getDirectory();
                if (directory != null)
                    filename=directory+filename;
                saveFile(filename);
            }
        }
    }


else if (cmd.equals("SaveAs")) {
        FileDialog dialog=new FileDialog(this, "Text File Save", FileDialog.SAVE);
        dialog.show(); // file dialog is modal
        String filename=dialog.getFile();
        if (filename != null) {
            String directory=dialog.getDirectory();
            if (directory != null)
                filename=directory+filename;
            saveFile(filename);
        }
    }
}


private void loadFile(String filename) {
    BufferedReader in = null; 
    text.setText("");

    try {
        in = new BufferedReader(new FileReader(filename),1024); 
        String string=null;


      while ((string=in.readLine()) != null) {  text.append(string+'\n');    }
        in.close();
    } 
    catch (IOException ie) {System.err.println("File Read Error : "+ie.getMessage()); }
    setTitle("FileName:"+filename);
    this.filename=filename;
}
private void saveFile(String filename) {
    BufferedWriter out = null; 
    try {
        out = new BufferedWriter(new FileWriter(filename));
      String string=text.getText();
        out.write(string); 
      out.close();
  }
    catch(IOException e) { System.err.println("File Read Error : "+e.getMessage()); }
    setTitle("FileName:"+filename);
    this.filename=filename;
}
}

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)JAVA Nateive Thread/Green Thread 선점형/비선점형

Sun의 JDK 1.2/1.3에는 JIT(just-In-time) 기술이 도입되어 loading 시점에  바이트코드를 실제 기계에서 수행되는 코드로 바꾼 후 실행하게 함으로써 상당한 성능 향상을 가져왔다 
네이티브와 그린 쓰레드는 자바에서 사용되는 쓰레드의 실제 구현상의 차이를 나타내는 것이다. 쓰레드를 자바 가상 기계 내에서 처리하는 것이 그린 쓰레드이고, 커널의 쓰레드 지원 기능을 이용하는 것이 네이티브 쓰레드이다.


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




비선점형(Non-preemptive)멀티태스킹 :운영체제가 제어권을 가지고 있지 않고 응용 프로그램이 제어권을 가지고 있는 것으로 응용 프로그램이 제어권을 운영체제로 돌려주지 않고 중앙 처리 장치를 독점하면 컴퓨터가 다운되는 현상이 생길 수 있다.(Win3.1, MacOS)

선점형(preemptive) 멀티태스킹 : 운영체제가 제어권을 응용 프로그램에게 부여하는 것으로 응용 프로그램이 제어권을 독점하는 것을 방지하여 안정적인 작업 환경을 지원하는 체제이다.(Win95/98, WinNT, Unix)