3.1 패키지(package)


패키지란, 클래스의 묶음이다. 패키지에는 클래스 또는 인터페이스를 포함 시킬 수 있으며, 서로 관련된 클래스들끼리 그룹 단위로 나누어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 
또한 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하므로, 자신만의 패키지 체계를 유지함으로써 다른 개발자가 개발한 클래스 라이브러리의 클래스와 이름이 충돌하는 것을 피할 수 있다. 
지금까지는 단순히 클래스명으로만 클래스를 구분 했지만 클래스의 실제 이름(full name)은 패키지명을 포함한 것이다. 예를 들면, String클래스의 패키지명을 포함한 이름은 java.lang.String이다. 즉, java.lang패키지에 속한 String클래스라는 의미이다. 그래서 같은 이름의 클래스일 지라도 서로 다른 패키지에 속하면 패키지명으로 구별이 가능하다. 
클래스가 물리적으로 하나의 클래스파일(.class)인 것과 같이 패키지는 물리적으로 하나의 디렉토리이다. 그래서 어떤 패키지에 속한 클래스는 해당 디렉토리에 존재하는 클래스파일(.class)이어야 한다. 

예를 들어, java.lang.String클래스는 물리적으로 디렉토리 java의 서브디렉토리인 lang에 속한 String.class파일이다. 그리고 우리가 자주 사용하는 System클래스 역시 java.lang패키지에 속하므로 lang디렉토리에 포함되어 있다. 



String클래스는 rt.jar파일에 압축되어 있으며 아래의 그림은 압축을 풀기 전과 후의 그림이다. 클래스와 관련 파일들을 압축한 것이 jar파일(*.jar)이며, jar파일은 jar.exe이외에 알집이나 winzip으로 압축을 풀 수 있다. 



디렉토리가 하위디렉토리를 가질 수 있는 것처럼, 패키지도 다른 패키지를 포함할 수 있으며 점(.)으로 구분한다. 예를 들면 java.lang패키지에서 lang패키지는 java패키지의 하위패키지이다. 


- 하나의 소스파일에는 첫 번째 문장으로 단 한번의 패키지 선언을 허용한다. 
- 모든 클래스는 반드시 하나의 패키지에 속해야한다. 
- 패키지는 점(.)을 구분자로 하여 계층구조로 구성할 수 있다. 
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다. 





3.2 패키지의 선언

패키지를 선언하는 것은 아주 간단하다. 클래스나 인터페이스의 소스파일(.java)에서 다음과 같이 한 줄만 적어주면 된다. 


package 패키지명; 



위와 같은 패키지 선언문은 반드시 소스파일에서 주석과 공백을 제외한 첫 번째 문장이어야 하며, 하나의 소스파일에 단 한번만 선언될 수 있다. 해당 소스파일에 포함된 모든 클래스나 인터페이스는 선언된 패키지에 속하게 된다. 
패키지명은 대소문자를 모두 허용하지만, 클래스명과 쉽게 구분하기 하기위해서 소문자로 하는 것을 원칙으로 하고 있다. 

모든 클래스는 반드시 하나의 패키지에 포함되어야 한다고 했다. 그럼에도 불구하고 지금까지 소스파일을 작성할 때 패키지를 선언하지 않고도 아무런 문제가 없었던 이유는 자바에서 기본적으로 제공하는 '이름없는 패키지(unnamed package)' 때문이다. 

소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다. 결국 패키지를 지정하지 않는 모든 클래스들은 같은 패키지에 속하는 셈이 된다. 
간단한 프로그램이나 애플릿은 패키지를 지정하지 않아도 별 문제 없지만, 큰 프로젝트나 Java API와 같은 클래스 라이브러리를 작성하는 경우에는 미리 패키지를 구성하여 적용하도록 한다. 

[예제7-9] PackageTest.java

package com.javachobo.book; 

class PackageTest 

      public static void main(String[] args) 
      { 
            System.out.println("Hello World!"); 
      } 


위의 예제를 작성한 뒤 다음과 같이 '-d' 옵션을 추가하여 컴파일을 한다. 


C:\j2sdk1.4.1\work>javac -d . PackageTest.java 


'-d'옵션은 소스파일에 지정된 경로를 통해 패키지의 위치를 찾아서 클래스파일을 생성한다. 만일 지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동적으로 생성한다. 
'-d'옵션 뒤에는 해당 패키지의 루트(root)디렉토리의 경로를 적어준다. 여기서는 현재디렉토리(.) 즉, 'C:\j2sdk1.4.1\work' 로 지정했기 때문에 컴파일을 수행하고 나면 다음과 같은 구조로 디렉토리가 생성된다. 



기존에 디렉토리가 존재하지 않았으므로 컴파일러가 패키지의 계층구조에 맞게 새로 디렉토리를 생성하고 컴파일된 클래스파일(PackageTest.class)를 book디렉토리에 놓았다. 

[참고] 만일 '-d'옵션을 사용하지 않으면, 프로그래머가 직접 패키지의 계층구조에 맞게 디렉토리를 생성해야한다. 

이제는 패키지의 루트 디렉토리를 클래스패스(classpath)에 포함시켜야 한다. com.javachobo.book패키지의 루트 디렉토리는 디렉토리 'com'의 상위 디렉토리인 'C:\j2sdk1.4.1\work'이다. 이 디렉토리를 클래스패스에 포함시켜야만 실행 시 JVM이 PackageTest클래스를 찾을 수 있다. 
[참고]클래스패스는 컴파일러(javac.exe)나 JVM 등이 클래스의 위치를 찾는데 사용되는 경로이다. 

Windows 98이하에서는 autoexec.bat파일에 다음과 같은 명령을 한 줄 추가하면 된다. 


SET CLASSPATH=.;C:\j2sdk1.4.1\work; 


Windows 2000에서는 '시스템등록정보-고급-환경변수-새로만들기'를 통해 아래의 그림과 같이 설정해 준다. 

 

';'를 구분자로 하여 여러 개의 경로를 클래스패스에 지정할 수 있으며, 맨 앞에 '.;'를 추가한 이유는 현재 디렉토리(.)를 클래스패스에 포함시키기 위해서이다. 
클래스패스를 지정해 주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정되지만, 이처럼 클래스패스를 따로 지정해주는 경우에는 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 이처럼 별도로 추가를 해주어야 한다. 
jar파일을 클래스패스에 추가하기 위해서는 경로와 파일명을 적어주어야 한다. 예를 들어 C:\j2sdk1.4.1\work\util.jar파일을 클래스패스에 포함시키려면 다음과 같이 한다. 

SET CLASSPATH=.;C:\j2sdk1.4.1\work;C:\j2sdk1.4.1\work\util.jar; 

이제 클래스패스가 바르게 설정되었는지 확인하기 위해 다음과 같은 명령어를 입력해보자. 


C:\WINDOWS>echo %classpath% 
.;C:\j2sdk1.4.1\work; 


현재 디렉토리를 의미하는 '.'와 'C:\j2sdk1.4.1\work'가 클래스패스로 잘 지정되었음을 알 수 있다. 자, 이제 PackageTest예제를 실행시켜보자. 

[실행결과]
C:\WINDOWS>java com.javachobo.book.PackageTest 
Hello World! 

실행 시에는 이와 같이 PackageTest클래스의 패키지명을 모두 적어주어야 한다. 

J2SDK에 기본적으로 설정되어 있는 클래스패스를 이용하면 위의 예제에서와 같이 클래스패스를 따로 설정하지 않아도 된다. 새로 추가하고자 하는 클래스를 'J2SDK설치디렉토리\jre\classes'디렉토리에, jar파일인 경우에는 'J2SDK설치디렉토리\jre\lib\ext'디렉토리에 넣기만 하면 된다. 

[참고] jre디렉토리 아래의 classes디렉토리는 J2SDK설치 시에 자동으로 생성되지 않으므로 사용자가 직접 생성해야한다. 

또는 실행 시에 '-cp'옵션을 이용해서 일시적으로 클래스패스를 지정해 줄 수도 있다. 

C:\WINDOWS>java -cp c:\j2sdk1.4.1\work com.javachobo.book.PackageTest 



3.3 import문

소스코드를 작성할 때 다른 패키지의 클래스를 사용할 때는 패키지명이 포함된 이름을 사용해야한다. 하지만, 매번 패키지명을 붙여서 작성하기란 여간 불편한 일이 아닐 것이다. 
클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스이름에서 패키지명은 생략할 수 있다. 

import문의 역할은 컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다.컴파일 시에 컴파일러는 import문을 통해 소스파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다. 

[참고] import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 걸릴 뿐이다. 



3.4 import문의 선언

모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야한다. 그리고 import문은 package문과는 달리 한 소스파일에 여러 번 선언할 수 있다. 


일반적인 소스파일의 구성은 'package문-import문-클래스선언'의 순서로 되어 있다. 


import문을 선언하는 방법은 다음과 같다. 


import 패키지명.클래스명; 
또는 
import 패키지명.*; 


키워드import와 패키지명을 생략하고자 하는 클래스의 이름을 패키지명과 함께 써주면 된다. 같은 패키지에서 여러 개의 클래스가 사용될 때, import문을 여러 번 사용하는 대신 '패키지명.*'을 이용해서 지정된 패키지에 속하는 모든 클래스를 패키지명 없이 사용할 수 있다. 
[참고] 클래스이름을 지정해주는 대신 '*'을 사용하면, 컴파일러는 해당 패키지에서 일치하는 클래스이름을 찾아야 하는 수고를 더 해야 할 것이다. 단지 그 뿐이다. 다른 차이는 없다. 


import java.util.Calendar; 
import java.util.Date; 
import java.util.ArrayList; 


이처럼 import문을 여러 번 사용하는 대신 


import java.util.*; 


위와 같이 한 문장으로 처리할 수 있다. 한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 '패키지명.*'과 같이 하는 것이 편리하다. 

하지만, import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다. 
한가지 더 알아두어야 할 것은 import문에서 클래스의 이름 대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니라는 것이다. 


import java.util.*; 
import java.text.*; 


그래서, 위의 두 문장 대신 다음과 같이 할 수는 없다. 


import java.*; 


[예제7-10] ImportTest.java

import java.text.SimpleDateFormat; 
import java.util.Date; 

class ImportTest 

      public static void main(String[] args) 
      { 
            Date today = new Date(); 
            
            SimpleDateFormat date = new SimpleDateFormat("yyyy/MM/dd"); 
            SimpleDateFormat time = new SimpleDateFormat("hh:mm:ss a"); 

            System.out.println("오늘 날짜는 " + date.format(today)); 
            System.out.println("현재 시간은 " + time.format(today)); 
      } 

[실행결과]
오늘 날짜는 2003/01/07 
현재 시간은 01:59:53 오후 

현재 날짜와 시간을 지정된 형식에 맞춰 출력하는 예제이다. SimpleDateFormat과 Date클래스는 다른 패키지에 속한 클래스이므로 import문으로 어느 패키지에 속하는 클래스인지 명시해 주었다. 그래서 소스에서 클래스이름 앞에 패키지명을 생략할 수 있었다. 
만일 import문을 지정하지 않았다면 다음과 같이 클래스이름에 패키지명도 적어줘야 했을 것이다. 


java.util.Date today = new java.util.Date(); 
            
java.text.SimpleDateFormat date = new java.text.SimpleDateFormat("yyyy/MM/dd"); 
java.text.SimpleDateFormat time = new java.text.SimpleDateFormat("hh:mm:ss a"); 


import문으로 패키지를 지정하지 않으면 위와 같이 '이름없는 패키지'에 속한 클래스를 제외한 모든 클래스이름 앞에 패키지명을 반드시 붙여야 한다. 
지금까지 System과 String 같은 java.lang패키지의 클래스들을 패키지명 없이 사용할 수 있었던 이유는 모든 소스파일에는 묵시적으로 다음과 같은 import문이 선언되어 있기 때문이다. 


import java.lang.*; 


java.lang패키지에는 매우 빈번히 사용되는 중요한 클래스들이 속한 패키지이기 때문에 따로 import문으로 지정하지 않아도 되도록 한 것이다. 
출처 -  http://cafe.naver.com/javachobostudy 

'Development > JavaEssential' 카테고리의 다른 글

변수와 메서드  (0) 2012.04.18
클래스와 객체  (0) 2012.03.18
인터페이스(Interface)  (0) 2012.01.24
추상클래스(Abstract class)  (0) 2012.01.24
클래스변수 & 인스턴스 변수  (0) 2011.12.28
Posted by linuxism
,

이식(移植) 또는 포팅(porting)은 컴퓨터 과학에서 실행 가능한 프로그램이 원래 설계된 바와 다른 컴퓨팅 환경(이를테면 CPU운영 체제, 서드 파티 라이브러리 등)에서 동작할 수 있도록 하는 과정을 가리킨다. 이 용어는 소프트웨어나 하드웨어가 다른 환경에서 사용할 수 있게 변경되는 것에도 해당한다. 소스 하나로 여러 플랫폼에서 사용할 수 있는 것을 크로스 플랫폼으로 부른다.

목차

  [숨기기

[편집]개요

컴퓨터에 있어서는 다양한 사상에 기초한 각종 컴퓨터 및 프로그래밍 언어는 다양한 제조 업체로부터 판매되고 있다. 옛날에는 IBM 등의 수많은 제조 업체가 메인 프레임 컴퓨터 시장에서 점진적으로 IBM 호환 기기 제조 업체로 집계되었다. 오늘날 개인용 컴퓨터의 대부분이 윈도 또는 매킨토시 시리즈에 집약되어 대부분의 사용자는 자신이 사용하고 있는 PC의 운영 체제만을 생각하도록 되어 있다.

이 PC는 운영 체제에서 제공하는 API와 그들에 의해 이용되는 장치 작동 통해 제조 업체는 원래보다 하드웨어의 차이와 메모리 구성의 차이 등에 상관없이 모두 동일한 소프트웨어를 사용할 수있다. 이들은 OS가 제공하는 표준화된 환경에서 동작하기 때문에, 제조 업체 및 모델의 차이는 관계가 없다.

그러나 윈도와 매킨토시 시리즈에서는 일부 소프트웨어를 제외하고는 동일한 소프트웨어가 작동하지 않는다. 이들은 운영 체제가 제공하는 환경이 다르기 때문이다. 이와 마찬가지로, 전세계 다양한 프로그래밍 언어가 동일한 동작을 컴퓨터에 적용하기 위해서는 각각의 프로그래밍 언어 사양에 부합하는 프로그램을 작성하지 않으면, 동작하는 소프트웨어는 만들 수 없다.예를 들면, 프로그래밍 기초 중의 기초가 되는 Hello world를 들 수있다.이 "Hello world!"로 표시하면, 불과 몇 십 자 정도의 프로그램은 프로그래밍에 사용하는 언어에 따라 다양하게 변화한다.

[편집]이식의 역사

특히 동작 환경이 다른 컴퓨터에서 주로 동일한 동작 작업을 하기 때문에, 전혀 다른 프로그램을 만들어야 한다면 기존의 하드웨어 구성의 차이를 보정하는 OS 및 드라이버가 없었던 시대에는 같은 제조사별 시리즈의 컴퓨터 사이에서도 프로그램의 대부분을 수정하는 작업이 필요했다.

따라서 별도의 PC가 보급되기 시작하던 1980년대에는 각 소프트웨어 업체 모두 채산성에서 점유율이 낮은 기종 등 판매를 기대할 수 없는 기종은 소프트웨어의 이식을 하지 않는 경우도 볼 수 있었다. 한편, 채산성도 가지고 그렇다면, 아주 성능이 낮은 PC 전용도, 소프트웨어 제작자는 상당한 프로그래밍 기술과 시행 착오 둥 노력이 필요하지만 이식 소프트웨어를 만들고 유지했다. 일본의 PC 시장의 경우 1980년대 말에는 8 비트 세대가라는 세 강과 다양한 제조 업체에서 호환 MSX 시리즈의 과점화 경향이 정착하고 있었다.

반면 정보 기술 분야에서 다양한 컴퓨터 제조 업체에서 다양한 대형 소형을 불문하고 1970년대 이후 각종 컴퓨터 출시 공급되었지만, 플랫폼마다 조작 방법이 크게 다른 것을 벽역하는 이용자도 많았다. 그 중에서 다중 사용자 사상에서 태어난 유닉스는 널리 산관학 분야에 받아들여지고 각종 컴퓨터에 작동하는 유닉스의 흐름을 이어받은 운영 체제가 이식되었다.

그 안에는 가정용 PC에서도 동일한 운영 체제를 사용하고 싶다는 사용자들이 나타나면서, 리눅스나 FreeBSD 등, PC/AT PC상에서 동작하는 것도 개발되어 오늘에 이른다. 특히 리눅스에 이르러 가정용 게임기와 휴대 기기 과거의 컴퓨터 하드웨어 등으로 동작시키는 것이 일부 마니아 사이에서 시험하고 개발한 결과, 엑스박스와 플레이 스테이션에서도 실행할 수 있게 개발되고 있다.

[편집]컴퓨터 게임 이식

컴퓨터 게임의 게임 소프트웨어는 한 종류의 게임기에서만 지원하기 때문에 다른 기종에 동일한 내용의 게임을 제공하기 위해 소프트웨어 개발 업체, 또는 외주 내지 라이선스를 받은 다른 소프트웨어 개발 업체 (타사)의 이식이 필요하다. 이식 패턴은 다음과 같이 4가지이다.

  1. 과거의 게임을 현행 기종에 이식하는 경우
  2. 비교적 최근의 소프트웨어를 보다 대중적인 지금의 기계로 이식하는 경우
  3. 아케이드 게임 하드에서 가정용 게임기로 이식하는 경우
  4. 같은시​​기에 대중적인 여러 가정용 게임기에 이식하는 것을 처음부터 전제로 만들어진 경우

여러 기종으로 이식은 경우에 따라서는 같은시기에 출시하기 위해 병행하여 이식을 하는 경우도 있다.

한때는 8 비트 세대가 같이 중요한 플랫폼이 긴장 상태로여러 존재 시장을 다투고 있던 시대에는 제조 업체의 개발진에 여력이있는 경우, 신제품의 소프트웨어를 여러 기종에 같이 동작하도록 개발하고, 거의 동시 발매 (예 : DAIVA)도 자주 행해졌지만, 너무 규모가 크지 않은 기업에서도 1 기종 선행 판매하고, 눈사태 식에 다음 기종으로 이식 작업을 계속 다음들에게 많은 기종 전개하는 메이커도 볼 수 있었다 (예 : 레리쿠스).또한 외주 및 라이센스를 하여 결과적으로 여러 기종 확장 사례도 볼 수 있다.)

게임의 이식에서 자신의 문제는 연산 장치이다.컨트롤러의 버튼 수와 그 배치, 아날로그적 입력의 유무 등 기종마다 다르기 때문에 위화감이 없는 작업을 재현하기 위해 이식된 기계에 맞춘 편곡이나 조정이 필요한 경우가있다.각 기종 간의 프레임 속도, 해상도의 차이도 큰 문제가 될 수있다.이러한 이식되는 게임기(가정용)의 성능과 사양의 차이에 의한 게임 내용 변경 등도 한때 자주 행해지고 있었다.

예를 들어, 8 비트 PC의 시대에는 '타이니제비우스'(→ '제비 우스')와 같이 게임 규칙은 변경하지 않고 게임의 영상면을 대폭 생략하거나 패밀리 컴퓨터 '그라디우스'처럼 작업 장치 (입력 장치)의 차이로 인해 아케이드 게임에서는 3 버튼 (파워업 공중 공격 지상 공격)이던 것이 2 버튼 (파워업 공중과 지상 공격)으로 변경된 것이다.이러한 다운 그레이드적인 수정은 컨슈머 제품의 기능을 아케이드 게임기에 미치지 못하는 시대에는 종종 볼 수 있었지만, 2000년대 무렵부터 1980- 1990년대의 오래된 게임을 최신 기종에 이식하는 경우는 반대 그림과 음악의 업그레이드를 도모할 수 있다 (아래 참조).

또한 이식시 버그 (비법으로 인식되는 플레이어 - win 것도 포함) 수정과 밸런스 조정 요소 추가 등이 실시되는 경우도 많다. 예를 들어 아케이드 게임에서는 "적과의 접촉이 바로 실수"였다. 게임 라이프 제 도입에서 "적과의 접촉을 할 경우 생명이 줄어들어 게임 오버"가 된 것도 있다. 이 경우 게임 규칙 수정 등도 있어, 원작을 바탕으로 다른 내용의 작품을 만들어내는 리메이크와의 구별이 애매하다.

플레이 스테이션 등 세대에서 하드웨어의 성능 향상에 따라 제조 업체는 다른 기종에서 완전 이식을 목표로하고 있지만, 제조 업체 이식 정도는 제각각이며, 일부는 치명적인 버그를 포함한 이식 프로그램이나 혹은 진짜 리메이크있는 것도 존재한다.또한 카세트 테이프 또는 CD-ROM 등 기록 매체의 정보량 증가에 따라 주가되는 소프트웨어는 리메이크 그들이지만, 오리지널 모드라고하여 원작의 충실한 이식 판을 포함하는 소프트웨어를 그대로 나타내주는 'Space'와 '팩맨 '등 한때 유명한 게임은 여러 모드를 가지고 있는 프로그램도있다.

엄밀한 의미에서 이주에 관해서는, 특히 아케이드 게임 이식을 기다리고있는 사용자들은 이 이식도 힘든 경향도 보인다.예를 들어 아케이드 게임 해 포함 플레이를 즐기는 선수에게는 입력 기기의 조작감의 차이도 있지만, 아케이드 게임에서 갈고 닦은 기술을 사용할 수 없다고 불평을 토로하고, 아케이드 버전에서 버그 내지 설정 미스 등의 형태로 존재하고 있던(별로 중요시되고 보이지 않는) 요소가 이식시 수정되어 있거나 하면 재현성의 차이에 악평을 언급 것과 같은 경우이다.이러한 경향은 게이머 중에서도 코어 게이머 (소정 작품에 애착이 강한 게임 매니아)에 나타나는 요소이다.

단, 컴퓨터 게임 프로그램 개발이 점차 대규모로 되어가는 과정에서 다른 플랫폼에서 동일하게 동작하는 환경을 미리 구축하고 그 위에 게임을 동작시키려는 움직임도있다. 게임 엔진이라고 하는 일반적인 프로그램은 게임 소프트웨어 개발의 수고를 줄이기 위해 사용되고 있지만, 반면에 자주 이용되는 게임 엔진은 다양한 플랫폼에 이식하는 것으로, 그 게임 엔진을 이용하여 게임 소프트웨어 이식에 필요한 노력과 비용 절감에도 도움이 되고 있다.

[편집]같이 보기




'System > Common' 카테고리의 다른 글

윈도우에서 ntkrnlmp.exe 파일은  (0) 2012.02.09
WBEM (Web-Based Enterprise Management)  (0) 2012.02.09
매뉴얼 페이지 섹션의 형식  (0) 2012.01.29
SCSI & SAS  (0) 2012.01.27
UNIX  (0) 2012.01.27
Posted by linuxism
,

JDBC(Java Database Connectivity)는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다. JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다. 

개요

JDBC는, JDK 1.1 버전 이래 Java Standard Edition 의 일부였습니다. JDBC 클래스는, Java 패키지 java.sql에 포함됩니다. 버전 3.0으로부터 시작해, JDBC는 Java Community Process에서 개발되었습니다. JSR 54는 JDBC 3.0(J2SE 1.4에 포함되어있음)을 명세하고 있으며, JSR 114는 JDBC Rowset을 추가로 명세하고 있습니다. 그리고, JSR 221은 JDBC 4.0를 명세합니다 (Java SE 6에 포함되어있음) [1]

JDBC는 Java로 작성된 프로그램을, 일반 데이터베이스에 연결하기 위한 응용프로그램 인터페이스 규격입니다. 이 응용프로그램 인터페이스는 데이터베이스 관리 시스템에 넘겨질 SQL 형태의 데이터베이스 접근요구 문장을, 각 시스템에 맞도록 바꾸어줍니다. API는 동적으로 올바른 Java 패키지를 로드하고, JDBC 드라이버 매니저에 등록하기 위한 메커니즘을 제공합니다. 드라이버 매니저가, JDBC connection을 생성하기 위한 connection factory로서 사용됩니다.

JDBC connection는, 명령문을 만들고, 실행하는 것을 지원합니다. 명령문은 SQL의 CREATE, INSERT, UPDATE, DELETE와 같이 갱신을 위한 명령문일 수도 SELECT와 같이 검색을 위한 명령문일 수도 있습니다. 게다가, 저장 프로시저(stored procedure : 일련의 쿼리를 마치 하나의 함수처럼 실행하기 위한 쿼리의 집합)는 JDBC connection을 통해 호출될 수 있습니다. JDBC는 아래 나오는 클래스 중 하나를 사용하는 명령문들을 나타냅니다:

  • Statement – the statement is sent to the database server each and every time.
  • PreparedStatement – the statement is cached and then the execution path is pre determined on the database server allowing it to be executed multiple times in an efficient manner.
  • CallableStatement – used for executing stored procedures on the database.

INSERT, UPDATE와 DELETE와 같은 갱신을 위한 명령문은, 명령문에 의해 영향을 받은 데이터베이스 열의 개수를 반환합니다. 이러한 명령문은, 위의 정보 외에는 반환하지 않습니다.

검색을 위한 명령문은 Resultset을 반환합니다.

[편집]버전 역사

JDBC API 역사
JDBC version발표자바 플랫폼중요한 변화
JDBC 4.0 JavaEE 6 예정 JSR 221
JDBC 3.0 JavaEE 5 JSR 54
JDBC 2.0
JDBC 1.0 J2SE 1.1


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

ODBC(Open DataBase Connectivity)는 마이크로소프트가 만든, 데이터베이스에 접근하기 위한 소프트웨어의 표준 규격으로, 각 데이터베이스의 차이는 ODBC 드라이버에 흡수되기 때문에 사용자는 ODBC에 정해진 순서에 따라서 프로그램을 쓰면 접속처의 데이터베이스가 어떠한 데이터베이스 관리 시스템에 관리되고 있는지 의식할 필요 없이 접근할 수 있다. 



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




import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

class Java_Mysql
{
 public static void main(String[] args)
 {
  Connection con;

  try
  {
   Class.forName("com.mysql.jdbc.Driver");
  }
  catch (ClassNotFoundException e)
  {
   System.err.println("드라이버 연결 에러.");
  }

  try
  {
   String url = "jdbc:mysql://www.tomeii.com/mudchobo";
   con = DriverManager.getConnection(url,"ID", "PASSWORD");
   Statement stmt = con.createStatement();
   ResultSet rs = stmt.executeQuery("SELECT * FROM Member_List");

   while (rs.next())
   {
    System.out.print(rs.getString("ID") + " ");
    System.out.print(rs.getString("Password") + " ");
    System.out.print(rs.getString("Name") + " ");
    System.out.print(rs.getString("Age") + " ");
    System.out.print(rs.getString("Sex") + " ");
    System.out.print(rs.getString("Tel") + " ");
    System.out.println();
   }

   rs.close();
   stmt.close();
   con.close();
  }
  catch (SQLException e)
  {
   System.err.println("SQL에러.");
  }
 }
}
[/code]
우선 JAVA와 연동하기 위해서는 JDBC가 필요하다. MYSQL 홈페이지가면 받을 수 있다.
http://www.mysql.org/downloads/connector/j/

이 파일을 자바가 설치된 폴더에 JRE\LIB\EXT\ 폴더에 복사한다.


java.sql.sqlexception : before start of result set

 

DB에서 데이터를 가져오는 쿼리 결과로 ResultSet 객체를 리턴받는데...

 

그 객체를 통해서 데이터를 뽑아내기 위해서 next()라는 메소드를 호출해야 한다.

 

이를 하지 않았을 경우에 before start of result set 에러가 발행한다.

 

이때는....

 

에러가 난 부분에 next()함수를 추가해 주면 해결 할 수 있다...


출처 - http://blog.naver.com/PostView.nhn?blogId=iifing&logNo=10082861106&redirect=Dlog&widgetTypeCall=true


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


java.sql.SQLException: Operation not allowed after ResultSet closed 

이 오류는 여러 경우에 날 수도 있지만

다음의 경우를 조심하자

 

ResultSet rs1 ...

ResultSet rs2 ...

 

두개의 ResultSet을 생성해서 어떤 쿼리를 실행시

 

Statement stmt ...

 

의 하나의 Statement  객체를 실행해서

rs1 = stmt.executeQuery(query1);

rs2= stmt.executeQuery(query2);

 

이렇게 두개의

ResultSet  을 처리하려 할때 생긴다

 

따라서 해결 방법은 간단하다는 걸 알 수 있다...

Statement  객체 하나를 만들어 따로 따로 처리를 하면 된다.....


출처 - http://blog.naver.com/PostView.nhn?blogId=hjc426&logNo=130023407937&redirect=Dlog&widgetTypeCall=true



Posted by linuxism
,