[Java] 자바 이클립스 JDBC 3. try ~ catach~ 를 이용하여 자원 해제시키기


JDBC 프로그래밍 : 자원의 해제


방법 1) finally 블록의 이용



finally를 통한 자원 헤제의 예제


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_1 {
  public static void main(String[] args) {
 
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
   
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
      con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이트베이스명" /* 연결할 DMBS와 데이터베이스 정보 */
        "유저명", /* 사용자 아이디*/
        "1111" /* 사용자 암호 */);
   
      stmt = con.createStatement();
      rs = stmt.executeQuery("select mno, name, tel, email from memb");
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s\n",
            rs.getInt("mno"),
            rs.getString("name"),
            rs.getString("tel"),
            rs.getString("email"));
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
        // try 블록 안에 한꺼번에 close()를 써주게 되면 앞에 있는 close()에서 오류가 났을 경우,
        // 그 다음에 오는 close()를 실행하지 않고 예외를 던지기 때문에 각각 try 문을 써줘야 한다.
        try {rs.close();} catch (Exception e) {}
        try {stmt.close();} catch (Exception e) {}
        try {con.close();} catch (Exception e) {}
    }
  }

}






방법 2) 클로저 (closure)를 이용한 방법



try (...) 안에 클로저 기법을 이용해 자동 자원 해제를 설정해주는 예제


import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_2 {
  public static void main(String[] args) {
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
    } catch (Exception e) {
      e.printStackTrace();
      return;
    }
   
    try ( // 이 괄호 안에 선언하는 변수는 오직 java.lang.AutoCloseable 구현체 만이 가능하다.
      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이터베이스명",
        "유저명",
        "1111");
   
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("select mno, name, tel, email from memb");
    ) {
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s\n",
            rs.getInt("mno"),
            rs.getString("name"),
            rs.getString("tel"),
            rs.getString("email"));
      }
     
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}





블로그 이미지

필로그래머

,

[Java] 자바 이클립스 JDBC 2. java.sql 패키지의 주요 인터페이스 (규칙)


java.sql 패키지의 주요 인터페이스 (규칙)

 1) java.sql.Driver (=> com.mysql.jdbc.Driver 클래스)

    - JDBC Driver정보를 제공한다.

    - DBMS와의 연결을 관리하는 객체를 리턴한다.

 2) java.sql.Connection (=> com.mysql.jdbc.ConnectionImpl 클래스)

    - DBMS와 연결을 수행핸다.

    - DBMS에 SQL을 전달할 객체를 리턴한다.

 3) java.sql.Statement (=> com.mysql.jdbc.StatementImpl 클래스)

    - SQL을 MySQL 형식에 맞춰서 변환한 다음 서버에 보내는 일을 한다.

    - 서버가 보낸 결과를 다룰 객체를 리턴한다.

    - executeQuery() : SELECT 문을 실행한다.

    - executeUpdate() : INSERT, UPDATE, DELETE 등 DML, DDL 명령문을 실행한다.

    - executeBatch() : 여러 개의 SQL을 실행할 때 사용한다.

SELECT, INSERT, UPDATE, DELETE 등 모든 SQL 명령문이 실행 가능하다.

 4) java.sql.ResultSet (=> com.mysql.jdbc.ResultSetImpl 클래스)

    - DBMS 서버에서 SELECT를 실행한 후 생성된 결과를 가져온다.

    - next() : 서버에서 한 개의 레코드를 가져온다. 정상적으로 갸져왔으면 true를

     리턴하고, 가져올 레코드가 없으면 false를 리턴한다.

    - getXxx(컬럼 번호 또는 컬럼명) : 

 서버에서 가져온 레코드의 컬럼 값을 꺼낸다. 

컬럼의 타입에 따라 호출하는 메서드가 다르다.

숫자 -> getInt(), 문자 -> getString(), 날짜 -> getDate()


자원의 해제

 - 파일 I/O(HDD)나 소켓(랜카드)이나 DBMS(랜카드와 연결된 서버) API 처럼 

   컴퓨터에 붙어 있는 장비를 다루고 나면, 다른 프로그램이 사용할 수 있도록 자원을

   해제해야 한다. 

블로그 이미지

필로그래머

,

[Java] 자바 이클립스 JDBC 프로그래밍 : MySQL JDBC Type 4 드라이버 다운로드



1.

JDBC 프로그래밍 : MySQL JDBC Type 4 드라이버 다운로드

 - 절차

1) www.mvnrepository.com에 들어가 mysql을 검색한다.

2) MySQL Connector/J의 Gradle 의존 라이브러리 정보를 복사한다.

3.) 프로젝트 폴더에 있는 build.gradle 파일에서 dependencies {}를 선언해 

    블록 안에 복사한 정보를 붙여 넣는다.

4) 명령창(cmd)을 실행하고 java01 프로젝트 폴더에서 gradle 명령을 실행한다.

> gradle eclipse

5) 이클립스에서 프로젝트 폴더를 "Refresh(F5)" 한다

6) 드라이버 라이브러리 파일(mysql-connector-java-5.1.42.jar)에 있는 클래스를 로딩해본다.



2.
JDBC 프로그래밍: DriverManager 클래스
  - JDBC 드라이버를 관리하는 객체
  - 이 객체에 JDBC 드라이버 객체를 등록해야만 사용할 수 있다.
  - DBMS에 연결할 때도 이 객체가 필요하다.


DriverManager에 MySQL을 등록하는 예제

 * => JDBC 드라이버를 관리하는 객체
 * => 이 객체에 JDBC 드라이버 객체를 등록해야만 사용할 수 있다.
 * => DBMS에 연결할 때도 이 객체가 필요하다.
 */
import java.sql.DriverManager;
import java.sql.SQLException;
public class Test01_2 {
  public static void main(String[] args) throws Exception {
    // 1) MySQl JDBC 드라이버의 정보를 다루는 객체를 생성한다.
    //    => 이 객체를 통해 MySQL DMBS에 연결할 수 있다.
    com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
   
    // 2) MySQL JDBC 드라이버를 "드라이버 관리자"에 등록한다.
    //    => 반드시 java.lang.Driver 규칙에 따라 만든 클래스여아 한다.
    DriverManager.registerDriver(mysqlDriver);
   
    // 3) 드라이버 관리자를 통해 DBMS와 연결한다.
    //    => 직접 MySQL 드라이버를 사용하지 않고,
    //       이렇게 DriverManager 클래스를 통해 우회하여 DBMS와 연결한다.
    //    => 이렇게 우회하는 이유? 특정 DBMS에 종속되지 않기 위함이다.
    //       자바 코드를 작성할 때 특정 DBMS에서만 유효한 코드를 작성하게 되면,
    //       그 DBMS에 종속되게 되고 유지보수가 힘들어진다.
    //    => DriverManager의 getConnection()을 호출하여 DMBS와 연결한다.
    //       리턴 값은 DBMS와의 연결 정보를 갖고 있는,
    //       java.sql.Connection 규격에 따라 만든 객체이다.
   
    java.sql.Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이터베이스명" /* 연결할 DMBS와 데이터베이스 정보 */
        "유저아이디", /* 해당 DB를 사용할 수 있는 아이디*/
        "사용자 암호" /* 사용자 암호 */);
   
    // 4) 연결이 되었다는 걸 표시해보자
    System.out.println("DBMS와 연결되었음!");
  

  }


- 실행 결과 : 

Fri May 26 16:50:04 KST 2017 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

DBMS와 연결되었음!




3.

JDBC 프로그래밍: Statement 객체

 - Statement 객체는 Connection 객체로부터 얻는다.

 - SQL문을 DBMS에 전달하는 일을 한다.

   SELECT 문을 실행한 경우, 그 결과를 다루는 객체를 리턴한다.

 


Statement 객체를 만들고 결과값을 받는 ResultSet 객체를 

생성하는 예제를 위 예제에 추가한다.


// 5) SQL을 실행할 Statement 객체 얻기

    //    => java.sql.Statement 규격에 따라 만든 객체를 리턴한다.
    java.sql.Statement stmt = con.createStatement();
   
    // 6) SELECT SQL문을 DBMS에 보낸다.
    //    => Statement 객체가 SELECT 문을 DBMS에 보내는 일을 한다.
    //    => SQL을 문자열 그대로 보내는 것이 아니라,
    //       DBMS가 처리하기 쉬운 형태로 변환(컴파일)하여
    //       그 변환된 SQL을 DBMS에 보낸다.
    //    => 물론 DBMS 마다 그 변환 형식이 다를 것이다.
    //       변환하는 일은 각 DBMS의 JDBC 드라이버 클래스들 중에서
    //       Statement 객체가 할 것이다.
    //    => 주요함수
    //       executeQuery() : select 문을 보낼 때
    //       executeUpdate() : insert, update, delete 등 기타 SQL을 보낼 때
    //    => executeQuery()의 리턴 값
    //       서버가 SELECT을 실행한 후 준비한 결과 값을 가져오는 도구를 리턴한다.
    //    => 그 도구는 java.sql.ResultSet 규격에 따라 만든 객체이다.
    java.sql.ResultSet rs = stmt.executeQuery("select 컬럼명1, 컬럼명2, 컬럼명3, 컬럼명4 from 테이블명 ");
   
    // 7) ResultSet 객체를 통해 서버에 결과를 한 개씩 가져온다
    //    => 한꺼번에 다 가져오는 것이 아니라, 한 개씩 가져온다.
    //    => next() : 서버에서 결과를 한 개 가져온다.
    while (rs.next()) {
      // 서버에서 가져온 한 개의 레코드 값은 ResultSet 객체에 보관되어 있다.
      // 꺼내보자!
      System.out.printf("%d, %s, %s, %s\n",
          rs.getInt("컬럼명1"),
          rs.getString("컬럼명2"),
          rs.getString("컬럼명3"),
          rs.getString("컬럼명4"));
    }
   
    // 8) 지금까지 사용한 JDBC 관련 객체의 자원을 해제한다.
    //     => ResultSet을 더 이상 사용하지 않으면 자원을 해제하라!
    rs.close();
    //     => Statement를 더 이상 사용하지 않으면 자원을 해제하라!
    stmt.close();
    //     => DBMS와 연결을 끊고 싶다면 Connection의 close()을 호출하라!
    con.close();
   
    // => DriverManager는 close() 메서드가 없다.
  }



블로그 이미지

필로그래머

,

[Java] 자바 멀티태스킹 - Thread (스레드)의 우선 순위


멀티 태스킹 : 스레드의 우선 순위

 - 자바는 스레드의 우선 순위를 10단계로 나누어 관리한다.

    1~10까지 지정한다.

 - "main" 스레드의 기본 우선 순위는 5이다.

 - "main" 스레드에서 새 스레드를 만들면, 그 스레드는 "main"의 자식 스레드가 된다.

    자식 스레드는 부모 스레드의 우선 순위와 동일한 값을 갖는다.


 - 그런데, 사실상 자바의 우선 순위는 실행에 별 영향을 끼치지 못한다.

   이유 : 

   1) 스레드를 최종 관리하는 곳은 OS이기 떄문이다. 따라서 OS가 스레드를 관리하는

      방식(스케줄링 방식)에 따라 실행이 결정된다.

   2) 자바는 1~10까지 우선 순위의 단계가 있지만, 그 자바를 실행하는 OS는 

       그 종류에 따라 단계가 다르다. 예를 들면, WIndows는 7단계, Solaris는 

       65535단계 등 이렇게 OS와 자바 사이의 단계가 일치하지 않기 때문에 어차피

       자바의 우선순위를 정밀하게 조정할 수 없다.


 - 결론 :

   스레드의 우선 순위를 고려하여 프로그래밍 하지 말자!


블로그 이미지

필로그래머

,

[Java] 자바 소켓(socket) 프로그래밍 - 서버(server)와 클라이언트(client) 소켓 만드는 법


소켓(socket)

 - 통신에 필요한 정보를 담고 있는 객체이다. 이 객체를 이용하여 통신을 수행한다.

 - 소켓 생성에 필요한 값

1) 인터넷 주소(IP Address, 도메인 주소)

예) Socket socket = new Socket("localhost", 8888); localhost = 도메인 주소

2) 포트번호(통신하는 프로그램을 구분하기 위한 식별번호)

예) ServerSocket serverSocket = new ServerSocket(8888); 8888 = 포트번호

 - 용어

1) 클라이언트(client) : 접속을 요청하는 쪽

2) 서버(server) : 접속을 받아들이는 쪽

3) 포트번호 :

    - OS가 구분할 수 있도록 통신프로그램에 부여되는 식별 번호

    - 클라이언트 쪽 프로그램은 OS가 포트번호를 자동으로 부여한다.

    - 서버 쪽은 프로그램 스스로가 지정한다.

 단 사용 중인 포트 번호를 중복 사용할 수 없다.

 기존에 특정 목적으로 널리 이용되는 포트 번호도 피해야 한다.

 예) FTP(20,21), Telnet(23), SSH(22), SMTP(25), HTTP(80), POP3(110),

IMAP4(143), HTTPS(443), 프록시서버(8080), MySQL(3306)


4) 대기열 :

    - 클라이언트가 서버에 접속을 요청했을 때, 그 클라이언트의 연결 정보를 

저장한 목록이다.

    - 대기열이 꽉차있을 경우, 클라이언트의 연결 요청을 거절한다.

  - 종류

1) 서버 소켓

    - 서버측 프로그램을 작성할 때 사용한다.

    - ServerSocket 클래스를 이용하여 만든다.

    - 다른 프로그램과 중복되지 않도록 포트 번호를 지정한다.

2) 클라이언트 소켓

          - 클라이언트측 프로그램을 작성할 때 사용한다.

     - Socket 클래스를 이용하여 만든다.

     - 접속하려는 상대편 인터넷주소(IP 주소, 도메인 주소)를 지정한다.

     - 접속하려는 상대편의 포트번호를 지정한다.



(1) 단순하게 서버를 만들어보기만 해보자!


서버 소켓을 만드는 예제 I


import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test01_1 {
  public static void main(String[] args) throws Exception {
    System.out.println("서버 실행 중...");
   
    // 1) 서버 소켓 만들기
    ServerSocket serverSocket = new ServerSocket(8888);
  
    // 2) 대기열의 첫 번째 클라이언트의 접속을 승인한다.
    // => 만약 대기 중인 클라이언트가 없다면, 리턴하지 않고 접속할 때까지 기다린다.
    // => 여러 클라이언트가 대기 중이라면 그 중 첫 번째 클라이언트와 연결한다.
    // => 리턴 값: 대기열에 등록된 첫 번째 클라이언트의 연결 정보를 가지고 만든 소켓 객체이다.
    Socket socket = serverSocket.accept();
   
    // 3) 소켓을 통해 입출력을 할 수 있도록 스트림 객체를 만든다.
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
   
    // 4) 소켓으로 클라이언트와 연결되면 데이터를 주고 받는 순서는 상관없다.
    //    그러나 일반적으로 클라이언트에서 먼저 데이터를 전송한다.
    //    그래서 서버는 클라이언트의 데이터를 먼저 읽고 그에 대한 응답을 한다.
    int b = in.read(); // 클라이언트에서 1바이트를 보낼 때까지 계속 기다린다(blocking).
    System.out.printf("%x\n", b);
   
    out.write(0x01); // 서버가 보낸 1바이트 데이터를 클라이언트에서 읽을 때까지 리턴하지 않는다.
   
    // 5) 클라이언트와 데이터 입출력이 끝났으면 연결을 끊는다.
    in.close();
    out.close();
    socket.close();
    serverSocket.close();
  }

}


- 실행 결과 :

서버 실행 중...



클라이언트 소켓을 만드는 예제 I


import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
public class Test01_2 {
  public static void main(String[] args) throws Exception {
    // 1) 클라이언트 소켓 만들기
    // => 첫 번째 파라미터: 접속하려는 상대편 프로그램의 컴퓨터 주소
    // => 두 번째 파라미터: 접속하려는 상대편 프로그램의 포트 번호
    // => 자신의 포트번호?
    //    OS가 자동으로 부여한다.
    //    개발자가 신경쓸 필요가 없다.
    //    즉 쌍방 모두 포트 번호가 반드시 있어야 한다는 의미!
    //
    Socket socket = new Socket("localhost", 8888);
   
    // 2) 소켓을 통해 입출력을 할 수 있도록 스트림 객체를 만든다.
    InputStream in = socket.getInputStream();
    OutputStream out = socket.getOutputStream();
   
    // 3) 서버에서 먼저 데이터를 읽는다면, 클라이언트는 먼저 데이터를 보내야 한다.
    //    꺼꾸로 서버에서 데이터를 먼저 보낸다면, 클라이언트는 먼저 데이터를 읽어야 한다.
    out.write(0x77); // 클라이언트가 보낸 데이터를 서버가 모두 읽을 때까지 리턴하지 않는다(blocking).
    int b = in.read(); // 서버가 보낸 데이터를 1바이트 읽을 때까지 리턴하지 않는다.
    System.out.printf("%x\n", b);
   
    // 4) 서버와의 데이터 입출력이 끝났으면 연결을 끊는다.
    in.close();
    out.close();
    socket.close();
  }

}


- 실행 결과 :

서버 실행 중...

77






(2) 이번엔 직접 클라이언트로부터 값을 입력받아 서버에서 뿌려보자!


서버 소켓을 만드는 예제 II


public class Test02_1 {
  public static void main(String[] args) throws Exception {
    System.out.println("서버 실행 중...");
   
    // ServerSocket(port, backlog)
    // => port: 포트번호
    // => backlog: 대기열의 크기
    ServerSocket serverSocket = new ServerSocket(8888, 3);
    System.out.println("=> 서버 소켓 생성 완료!");
   
    // 대기열에 기다리고 있는 클라이언트가 없다면, 리턴하지 않는다.
    Socket socket = serverSocket.accept();
    System.out.println("=> 클라이언트 연결 승인!");
   
    InputStream in0 = socket.getInputStream();
    OutputStream out0 = socket.getOutputStream();
   
    Scanner in = new Scanner(in0);
    PrintStream out = new PrintStream(out0);
   
    String str = in.nextLine(); // 클라이언트로부터 문자열을 한 줄 읽는다.
    out.println(str); // 클라이언트가 보낸 문자열을 그대로 돌려준다.
   
    in.close();
    in0.close();
    out.close();
    out0.close();
    socket.close();
    serverSocket.close();
  }
}

- 실행 결과 :

서버 실행 중...

=> 서버 소켓 생성 완료!





클라이언트 소켓을 만드는 예제 II


import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Test02_2 {
  public static void main(String[] args) throws Exception {
    // 키보드에서 데이터를 읽는 스캐너 객체 준비
    Scanner keyScanner = new Scanner(System.in);
   
    // 1) 접속할 서버 주소 입력 받기
    System.out.print("서버 주소: ");
    String serverAddress = keyScanner.nextLine();
   
    // 2) 접속할 서버의 포트 번호 입력 받기
    System.out.print("포트 번호: ");
    int port = Integer.parseInt(keyScanner.nextLine());
   
    // 3) 사용자로부터 입력 받은 값을 가지고 서버에 접속한다.
    Socket socket = new Socket(serverAddress, port);
    System.out.println("=> 소켓 객체 생성 완료!");
   
    // 4) 입출력할 스트림 객체 준비
    InputStream in0 = socket.getInputStream();
    OutputStream out0 = socket.getOutputStream();
   
    // 5) 스트림 객체에 입출력 보조 객체를 연결한다.
    Scanner in = new Scanner(in0);
    PrintStream out = new PrintStream(out0);
    System.out.println("=> 입출력 스트림 준비 완료!");
   
    // 6) 키보드에서 서버에 보낼 메시지를 입력 받는다.
    System.out.print("서버에 보낼 메시지: ");
    String message = keyScanner.nextLine();
   
    // 7) 키보드에서 입력 받은 메시지를 서버에 보낸다.
    out.println(message);
    System.out.println("=> 서버에 메시지 전송 완료!");
   
    // 8) 서버가 보낸 메시지를 읽는다.
    String response = in.nextLine();
    System.out.println("=> 서버로부터 메시지 수신 완료!");
   
    // 9) 서버가 보낸 메시지를 화면에 출력한다.
    System.out.println(response);
   
    in.close();
    in0.close();
    out.close();
    out0.close();
    socket.close();
    keyScanner.close();
  }
}

- 다음과 같이 명령 프롬프트 창에서 실행시켜보자! (이클립스도 상관 x) 

결과는 다음과 같다.























블로그 이미지

필로그래머

,

[Java] 자바 멀티 태스킹 - 개요 및 JVM 기본 스레드와 스레드 그룹들


멀티 태스킹 : 개요 및 JVM 기본 스레드와 스레드 그룹들

 - CPU 한 개로 여러 프로그램을 동시에(?), 병행으로 실행하는 방법


 - 멀티 태스킹을 수행하는 방법

    1) 멀티 프로세싱

        - 프로세스(실행 중안 프로그램)를 복제하여 실행하는 방법

  - 원본 프로세스의 모든 메모리를 그대로 복제한다.

  - 특징

     1) 메모리 낭비가 심하다.

     2) 구현하기가 쉽다.

     3) 프로세스끼리 독립적이기 때문에 원본 프로세스의 영향을 받지 않는다.

    2) 멀티 스레딩

   - 메인 프로세스의 작업 중 "일부 작업만 독립해서 실행(스레드)"시키는 방법

   - 메인 프로세스의 힙 메모리는 공유하고 스택 메모리만 별도로 윶한다.

   - 특징

1) 메모리 낭비를 줄인다.

2) 프로세스 복제 방식 보다는 구현하기가 조금 복잡하다.

3) 스레드들은 원본 프로세스에 종속되기 때문에 원본 프로세스가 종료되면

   스레드들도 자동으로 종료한다.

 - 현재 대부분의 멀티 태스킹은 "멀티 스레드" 방식으로 처리한다.


스레드와 스레드 그룹

 - 스레드 : 프로세스의 작업 중에서 독립적으로 실행하는 작업.

 - 스레드 그룹 : 스레드들을 묶어 놓은 것


JVM이 기본으로 생성하는 스레드와 스레드 그룹

` OS와 Java 버전에 따라 다를 수 있다.

` 스레드 구조

 - TG("system")

    --> TG("main")

   -->T(''main")

    --> T("Reference Handler") : 인스턴스의 주소를 관리

    --> T("Finalizer")              : 인스턴스의 메모리 해제를 관리

    --> T("Signal Dispatcher")  : OS로부터 들어오는 인터럽트 신호를 감지

    --> T("Attach Listener")

블로그 이미지

필로그래머

,

[Java] 자바 프로그램 아규먼트 program argument (args) 종류


프로그램을 실행할 때 전달하는 아규먼트의 종류

 1) JVM 아규먼트

예) > java -cp bin -D프로퍼티명=값 -D프로퍼티명=값 폴더명.클래스파일명

 - -D 옵션 다음에 공백 없이 이름과 값을 전달한다.

 

2) 프로그램 아규먼트 String args[]

예) > java -cp bin 폴더명.클래스파일명 aaa bbb ccc

 - 클래스 파일명 다음에 오는 값이 프로그램 아규먼트라 부른다.

 - main() 메서드의 파라미터(args)를 통해 그 값을 꺼낼 수 있다.




JVM 아규먼트와 프로그램 아규먼트 String args[] 예제


  public static void main(String[] args)


throws Exception {
    // 1) 프로그램 아규먼트 출력
    for (String value : args) {
      System.out.println(value);
    }
    System.out.println("----------------------------");
   
    // 2) JVM 프로퍼티 출력
    Properties props = System.getProperties();
    System.out.printf("name=%s\n", props.get("name"));
    System.out.printf("age=%s\n", props.get("age"));
    // 프로퍼티 이름 중간에 점(.)이 있다고 해서 당황하지 말자
    // 그냥 이름의 일부일 뿐이다.
    // 다만, 점을 사용하면 이름을 분류하기에 좋다.
    System.out.printf("tel.home=%s\n", props.get("tel.home"));
    System.out.printf("tel.office=%s\n", props.get("tel.office"));
   
   
  }

}


- 출력 결과 :


블로그 이미지

필로그래머

,

[Java] 자바 데이터 프로세싱 스트림 클래스 (data processing stream) 클래스 - bufferedInputStream


데이터 프로세싱 스트림 클래스 (data processing stream) 클래스 

   1) 입출력 중간에 개입하여 데이터를 가공하는 역할을 수행한다.

   2) 데이터를 직접 파일이나 메모리, 다른 어플리케이션으로 입출력 할 수는 없다.


 - 예 :

    - DataInputStream/DataOutputStream

 - byte, short, int, long, float, double, boolean, char, String 타입의 데이터를

   바이트 배열로 가공하여 입출력을 수행한다.

    - BufferedInputStream/BufferedOutputStream

 - 데이터를 읽고 쓸 때 중간에 임시 저장소 버퍼(캐시;cache)를 사용한다.

 - 그래서 실제 파일로 입출력하는 횟수를 줄임으로써 읽고 쓰기 속도를 높이는

   방법이다.

    - ObjectInputStream/ObjectOuptStream

 - 객체를 바이트 배열로 만들어 출력하고, 바이트 배열을 다시 객체로 복원한다.



BufferedInputStream

 개념 :

 뷔페에서 만약 접시를 사용하지 않고 음식을 한 개씩 담는다면 먹고 싶은 음식이  

 생겼을 때 왔다 갔다 하느라 음식을 찾기 위한 이동 시간(Data seak time)이 오래 

 걸릴 것이다. 이러한 시간을 줄이기 위해 사람들은 테이블 위에 있는 음식을 가져올

 때 접시를 이용한다. 이 접시를 '버퍼'라고 부를 수 있다. 데이터를 읽어들일 대 

 최대한 바이트 배열 크기(한 접시. 보통 8096byte)만큼 한 번에 읽어들인다.


  - 이 객체는 내부에 데이터를 임시 저장할 바이트 배열을 내장하고있다.

  - 데이터를 읽어들일 때 최대한 바이트 배열 크기만큼 한 번에 읽어 들인다.

  - 그리고 그 배열에서 조금씩 퍼 쓰다가, 버퍼가 바닥나면 다시 그 버퍼만큼 읽어 들     인다.

  - 이렇게 함으로써 읽어 들이는 횟수를 줄이게 디어 읽기 속도가 향상된다.


블로그 이미지

필로그래머

,