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

2013년 8월 9일 금요일

(java array)자바에서의 배열에 대해 알아 보기로 하겠습니다. ORACLEJAVANEW.KR

자바에서의 배열에 대해 알아 보기로 하겠습니다.  자바에서의 배열을 잘 공부해 두시면 닷넷등에서도 비슷하게 사용 되니 닷넷을 공부 할때 도움이 되실 겁니다.  열공!!


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


 

배열이란? 배열도 객체 이며 ,,, 그래서 Memory Heap에 메모리가 할당 됩니다. 동일한 자료형을 갖는 자료의 배열이며, 배열 선언은 선언할때 크기 명시 안 한다는곳 기억 하시구요..

int[] a; ( 혹은 int a[];)

배열에 Access 하기 위한 첨자는 int 형 이며 long 인 경우에는 Type Casting을 해야 합니다.

배열 생성
a = new int[3];
int[] a = {1, 2, 3};
int[] a; a = new int[] {1, 2, 3};

배열 길이
a.length

배열의 재사용
int[] a = {1, 2, 3};
a = new int[50]; //이때 이전의 배열a의 내용은 버려지며 새로운 메모리 공간이 할당 됩니다.

[예제]

class ArrayTest {
public static void main( String[] args ) {
int[] a = {1, 2, 3}; // int형 배열 선언 및 값 할당
int a2[]; // int형 배열 선언
a2 = new int[] {7, 8, 9, 10, 11}; // 이름 없는 배열 생성
System.arraycopy(a, 0, a2, 3, 2); //배열을 복사(a라는 배열의 0번째를 a2라는 배열의 3번째 인덱스 부터
//2개 복사하라는 의미 입니다. a2는 7,8,9,1,2가 되겟네요...
System.out.println( a.length ); // 3
for(int i = 0; i < a.length; ++i) >
System.out.print( a[i] + " "); // array

// 스트링 객체의 참조값의 배열 생성
String[] as = { "i", "am", "boy", };
String[] as2 = { "me", "to", };

System.out.println("\n" + as.length ); // 3
for(int i = 0; i < as.length; ++i) >
System.out.print( as[i] + " "); //i am boy

as = as2;

System.out.println("\n" + as.length ); // 2
for(int i = 0; i < as.length; ++i) >
System.out.print( as[i] + " " ); //me to
as2 = null;
}
}


[결과]
3
1 2 3
3
i am boy
2
me to



배열의 배열 ( 다차원 배열 ) 

배열은 또 다른 배열을 포함 할 수 있으며 하위 배열은 모두 다른 크기를 가질 수 있습니다. 이를 자바에서는 배열의배열의 형태로 다룰 수 있습니다. 예를들면 1행은 열이 2개, 2행은 열이 3개,,, 이런게 가능하다는 이야기죠^^;;;

[예제]

class MultiArrays {
public static void main(String[] args) {
String[][] 자동차 = {
{"그랜져","소나타","아반테"},
{"매그너스","누비라"},
{"카니발","세피아"}
};

for(int i=0; i<자동차.length; i++) { >
System.out.print(자동차[i].length + ":");
for(int j=0; j<자동차[i].length; j++) { >
System.out.print(자동차[i][j] + " ");
}
System.out.print("\n");
//System.out.println();
}
}
}


[결과]
3:그랜져 소나타 아반테
2:매그너스 누비라
2:카니발 세피아




배열의 예외 

NegativeArraySizeException : 음수크기를 갖는 배열 객체를 만들고자 할때 발생 합니다.
ArrayStoreException : 배열의 자료형과 틀린 자료값을 저장 할려고 하는 경우에 발생 합니다. 예를들면 int형 배열을 선언하고 3.3 이라는 값등을 넣을때 나는 오류 입니다.
ArrayIndexOutOfBoundsException : 배열의 첨자 범위를 벗어 났을때 발생 합니다. A라는 배열을 방2개짜리로 만들면 인덱스는 0, 1을 가질수 있는데 A[2]라는 형태로 사용하는 경우 나는 오류 입니다.
NullPointException : null 값을 갖는 배열 객체 참조 변수를 참조하려고 할때 발생 합니다.

2013년 8월 8일 목요일

[오라클자바커뮤니티, 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" , "" );
  <= 요렇게 하면 예전에 입력한 값이 보이지 않게 됩니다. ^^

[ORACLEJAVA커뮤니티]struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법

struts-config.xml이나 메시지 리소스 파일을 수정 후 웹서버를 Restart하지 않고 변경사항을 반영하는 방법 


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


1.        새로운 ActionServlet을 하나 만듭니다.

package yfarm;

import javax.servlet.ServletException;
import javax.servlet.ServletConfig;
import org.apache.struts.action.ActionServlet;
import java.io.IOException;

//struts-config.xml과 메시지 Resource 파일을 수정 했을 때 자동으로 인식할 수 있게...
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.util.RequestUtils;

public class NewActionServlet extends ActionServlet {
       
    protected void Process (HttpServletRequest request, HttpServletResponse response)
                                  throws IOException, ServletException {
        String uri = request.getRequestURI();
       
        if(uri.indexOf("reload.do") != -1) {
            init();
           
            RequestUtils.selectModule(request, getServletContext());
           
            ModuleConfig config = getModuleConfig(request);
           
            getRequestProcessor(config).init(this, config);
           
            RequestDispatcher dispatcher = request.getRequestDispatcher("/reload.jsp");
           
            dispatcher.forward(request, response);           
        }
        else {
            super.process(request, response);
        }
    }
}
                       
위의 NewActionServlet은 URL에 reload.do가 포함되어 있는 경우 초기화를 수행 하도록 합니다. 초기화는 두 단계로 진행하는데 첫째 ActionServlet의 init() 호출하여 struts-config.xml을 초기화 하며 둘째 RequestProcessor 클래스를 초기화 합니다. RequestProcessor 클래스가 초기화 되지 않으면 struts-config.xml이 수정되기 전에 사용된 Action 클래스들이 재사용 되므로 수정된 내용이 반영되지 않을 수도 있습니다.

2.        web.xml을 수정 합니다.
(사용자의 요청을 NewActionServlet이 수행하도록 수정 합니다.)

<servlet>
                <servlet-name>action</servlet-name>
                <servlet-class>yfarm.NewActionServlet</servlet-class>
                <init-param>
                        <param-name>config</param-name>
                        <param-value>/WEB-INF/struts-config.xml</param-value>
                </init-param>
                <load-on-startup>1</load-on-startup>               
        </servlet>

3.        ReloadStrutsConfigAction 클래스를 만듭니다. ( 이 클래스가 reload action인 reload.do에 대해 대응을 하는데 아무 일도 하지 않습니다.)

/*
 * Created on 2005. 5. 6.
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package oraclejava;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 이종철
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */

public class ReloadAction extends Action {
    public ActionForward execute(
        ActionMapping mapping,
        ActionForm form,
        HttpServletRequest  request,
        HttpServletResponse response) throws Exception {
        return null;     
    }
}

4.        struts-config.xml에 아래를 추가 합니다. (action-mappings에 추가)

<action
            path="/reload"
            type="oraclejava.ReloadAction"   
    />


5.        XML파일이나 메시지 리소스 등을 수정 후 URL에서 /reload.do를 불러주면 웹 서버를 재시작 하지 않더라도 수정 사항이 반영 됩니다.

2013년 8월 6일 화요일

[ORACLEJAVA, 오라클자바교육강좌]struts DataBase 접근하기(DBCP)

DataBase 접근하기 


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

스트럿츠를 이용한 대부분의 개발은 데이터베이스에 대한 접근을 하게 됩니다. 가장 좋은 구성은 Action이 프리젠테이션 영역과 비즈니스 로직 영역을 연결하는 thin adapter 역할을 하도록 구성 하는 겁니다.

DAO approach인 경우 데이터에 대한 접근은 Business Interface의 뒤쪽에 숨어 있게 됩니다. 비즈니스 클래스에 대한 구현은 Connection Pool을 지원하는 DataSource를 통해 이루어 지므로 대부분의 데이터베이스에 대한 접근은 Connection Pool을 이용한다고 보면 됩니다.

Connection Pool이라는 것은 간단히 말해 DB에 연결을 맺은 Connection 객체를 미리 만들어 주어 사용자가 접속하면 할당을 하는 형태로 DB접속을 관리하는 것을 말합니다. 실제 테스트를 해보면 아시겠지만 데이터베이스에 대한 Connection을 수립하는데도 많은 비용이 드는 것은 사실이니까요… 생성과 삭제, 관리등을 Connection Pool에서 알아서 관리 해줍니다.

대부분의 컨테이너와 데이터베이스 시스템은 DataSource에 대한 구현을 번들로 제공 합니다. DataSource는 JNDI를 통해 접근이 가능하며 JNDI approach인 경우 별다른 고민 없이 DataSouce에 대한 비즈니스 클래스의 접근을 용이하게 해 줍니다.



-------------------------------
Struts DataSource Manager
-------------------------------

비즈니스 로직 계층에서는 데이터액세스에 대한 상세한 부분과 데이터베이스의 Conenction을 얻는  부분을 캡슐화 합니다. Struts에서는 DataSource Manager 라는 것이 있어 Action 클래스가 데이터 액세스 요구에 위해 리소스(DB Connection등)를 생산해 내는 것을 쉽게 만들어 줍니다.

가능하다면 데이터를 액세스 하는 경우 DAO(Data Access Object) 패턴을 사용하기를 권고 하며 그래서 Action 클래스는 내부의 메커니즘을 알 필요가 없게 되는 것입니다. 

DataSource Manager는 1.X 버전과의 호환을 위해 존재하며 향후 2.x 버전에서는 사라질 예정 입니다.

DataSource Manager는 struts-config.xml 파일에서 설정하며 javax.sql.DataSource 인터페이스를 구현한 어떠한 Conenction Pool에서도 deploy해서 사용 할 수 있습니다.

만약 현재 사용하고 있는 DB or 컨테이너가 javax.sql.DataSouce 인터페이스를 구현한 클래스를 제공 하다면 있는 것을 사용하셔도 무방 합니다.  대부분의 엔터프라이즈 애플리케이션 개발에서 보다 나은 성능을 위해 다른 connection pool을 사용하고 있죠^^

이 강좌에서는 Jakarta Commons dbcp's BasicDataSource(org.apache.commons.dbcp.BasicDataSource)를 이용하여 DataSource를 사용해 보도록 하겠습니다.

DBCP는 다음  URL에서 다운 받으시기 바랍니다.

http://jakarta.apache.org/commons/dbcp/downloads.html

1.        DBCP BasicDataSource를 사용하기 위한 설정은 아래와 같습니다…(struts-config.xml에 설정)

<!-- =============== for DataSource ======================= -->
<data-sources>
<!-- configuration for commons BasicDataSource -->
<data-source key="mysql" type="org.apache.commons.dbcp.BasicDataSource">
            <set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
            <set-property property="url" value="jdbc:mysql://localhost/test" />
            <set-property property="username" value="root" />
            <set-property property="password" value="pw" />
            <set-property property="maxActive" value="10" />
            <set-property property="maxWait" value="5000" />
            <set-property property="defaultAutoCommit" value="true" />
            <set-property property="defaultReadOnly" value="false" />
            <set-property property="maxIdle" value="10000" />
        </data-source>
        <data-source key="oracle" type="org.apache.commons.dbcp.BasicDataSource">
            <set-property property="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <set-property property="username" value="scott" />
            <set-property property="password" value="tiger" />
            <set-property property="url" value="jdbc:oracle:thin:@localhost:1521:WINK" />
            <set-property property="maxActive" value="50" />
            <set-property property="maxIdle" value="10000" />
            <set-property property="maxWait" value="100" />
            <set-property property="defaultAutoCommit" value="true" />
</data-source>
</data-sources>

2. 소스 코드에서는 아래와 같이 사용 합니다.

public ActionForward
      execute(ActionMapping mapping,
              ActionForm form,
              HttpServletRequest request,
              HttpServletResponse response) throws Exception
{
 javax.sql.DataSource dataSource;
 java.sql.Connection myConnection;
 try {
  //for oracle
  javax.sql.DataSource dataSource = getDataSource(request,"oracle");
  myConnection = dataSource.getConnection();
 } catch (SQLException sqle) {
    getServlet().log("Connection.process", sqle);
 } finally {
    //enclose this in a finally block to make
    //sure the connection is closed
    try {
      myConnection.close();
    } catch (SQLException e) {
      getServlet().log("Connection.close", e);
    }
  }
}

3.        다중 데이터 소스를 사용하는 경우에는 struts-config.xml에서 다음과 같이 선언 합니다.

<data-sources>
  <data-source key="A" type="org.apache.commons.dbcp.BasicDataSource">
      ... properties as before ...
  </data-source>
  <data-source key="B" type="org.apache.commons.dbcp.BasicDataSource">
      ... properties as before ...
  </data-source>
  ...
</data-sources>


4.        다중 데이터 소스인 경우 프로그램에서는 다음과 같이 사용 합니다.

...
  try {
      dataSourceA = getDataSource(request, "A");
      dataSourceB = getDataSource(request, "B");
  ...

2013년 7월 28일 일요일

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)자바 리플렉션(JAVA Reflection)에 대해 ,

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


Runtime에 클래스를 전달받아서 임의의 method를 실행하는 시스템이 있다고 가정하면 이 때 전달되는 파라미터, return되는 파라미터 모두 개발당시에는 알지 못한다고 하자 이러한 시스템에는 임의의 클래스가 주어졌을 때, 그 클래스에 대한 정보, 다시 말해서 해당 클래스의 생성자 (constructor), 멤버변수, method, 슈퍼 클래스 , 상위 인터페이스에 대한 정보를 얻을 수 있는 기능이 필요하다 이렇게 임의의 클래스에 대한 정보를 얻을 수 있게 해 주는 API가 바로 reflection API이다. 

Ex) import java.lang.reflect.*;
    Object o;
    Class c = o.getClass();
    ……
    Method m = c.getMethod(“setText”, new Class[] {String.class} );
    ……


import java.lang.reflect.*;
import java.awt.*;
class ReflectionTest {

public static void main(String[] args) {
      Button b = new Button();
      getNameSuperClass(b);
}
static void getNameSuperClass(Object o) {
      Class c = o.getClass();
      String s = c.getName();
      String s1 = c.getSuperclass().toString();
      System.out.println(s + "\n" + s1);
  }
}
 
 

(오라클자바개발자실무교육,오엔제이프로그래밍실무교육센터)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)