자료출처 : http://pllab.kw.ac.kr/j2seAPIs/tooldocs/windows/java.html

java - Java 어플리케이션 기동 툴

형식

    java [ options ] class [ argument ... ]
java [ options ] -jar file.jar [ argument ... ]
javaw [ options ] class [ argument ... ]
javaw [ options ] -jar file.jar [ argument ... ]
options
커멘드행 옵션
class
불려 가는 클래스의 이름
file.jar
불려 가는 JAR 파일의 이름. 반드시 -jar 와 함께 사용한다
argument
main 함수에게 건네지는 인수

설명

java 툴은, Java 어플리케이션을 기동합니다. java 툴은, Java Runtime Environment 를 기동한 뒤, 지정된 클래스를 로드해, 그 클래스의 main 메소드를 호출하는 것으로, Java 어플리케이션을 기동합니다.

이 메소드는, public 및 static 로서 선언할 필요가 있습니다. 또, 값을 돌려주어 되지 않습니다. 게다가String 배열을 파라미터로서 지정할 수 없으면 안됩니다. 메소드의 선언은, 다음과 같이 되지 않으면 안됩니다.

    public static void main(String args[])
디폴트에서는, 커멘드행 옵션 이외의 최초의 인수가, 불려 가는 클래스의 이름이 됩니다. 이 이름에는, 완전 지정의 클래스명을 사용할 필요가 있습니다. -jar 옵션을 지정했을 경우, 커멘드행 옵션 이외의 최초의 인수가, 어플리케이션의 클래스 파일과 resource file를 포함한 JAR 어카이브(archive)의 이름이 됩니다. 이 경우, 마니페스트의 Main-Class 헤더로 지정된 클래스가 기동 클래스가 됩니다.

Java Runtime 는, bootstrap 클래스 패스, 인스톨형 확장 기능, 및 유저 클래스 패스의 3 개소로부터 기동 클래스와 다른 사용되고 있는 클래스를 검색합니다.

클래스명 또는 JAR 파일명의 후에 있는, 커멘드행 옵션 이외의 인수는,main 함수에게 건네집니다.

javaw 커멘드는, 콘솔 윈도우가 없는 이외는,java 커멘드와 같습니다. javaw 는, 커멘드 prompt 윈도우를 표시할 필요가 없을 때에 사용합니다. 다만,javaw 기동 툴에서는, 어떠한 이유로써 기동에 실패하면(자), 에러 정보를 나타내는 다이알로그 박스가 표시됩니다.

옵션

기동 툴에는, 현재의 실행 환경 및 장래의 릴리스로 서포트되는표준 옵션이 있습니다. 또, 디폴트의 Java HotSpot VM 에서는,비표준 옵션세트도 제공됩니다. 이것은, 장래의 릴리스로 변경될 가능성이 있습니다.

표준 옵션

-client
Java HotSpot Client VM 를 선택합니다.

상세한 것에 대하여는,「서버 - 클래스 머신의 검출」을 참조해 주세요.

-server
Java HotSpot Server VM 를 선택합니다.

상세한 것에 대하여는,「서버 - 클래스 머신의 검출」을 참조해 주세요.

-agentlib:libname[=options]
네이티브 에이전트 라이브러리 libname 를 로드합니다. 예를 들어 다음과 같이 지정합니다.

-agentlib:hprof

-agentlib:jdwp=help

-agentlib:hprof=help

상세한 것에 대하여는,「JVMTI 에이전트의 커멘드행 옵션」을 참조해 주세요.

-agentpath:pathname[=options]
풀 패스명을 사용해, 네이티브 에이전트 라이브러리를 로드합니다. 상세한 것에 대하여는,「JVMTI 에이전트의 커멘드행 옵션」을 참조해 주세요.

-classpath classpath
-cp classpath
클래스 파일을 검색하는 디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 리스트를 지정합니다. 클래스 패스의 각 엔트리는, 세미콜론 (;)으로 단락짓습니다. -classpath 또는 -cp 를 지정하면(자), 이 옵션의 값에 의해 CLASSPATH 환경 변수의 설정이 오버라이드(override) 됩니다.

-classpath-cp 도 사용되지 않고,CLASSPATH 도 설정되어 있지 않은 경우, 유저 클래스 패스는 현재의 디렉토리 (. )(이)가 됩니다.

클래스 패스의 자세한 것은,「클래스 패스의 설정」을 참조해 주세요.

-Dproperty=value
시스템 프로퍼티의 값을 설정합니다. value 가, 스페이스를 포함한 캐릭터 라인인 경우는, 캐릭터 라인을 다음과 같이 이중 인용부호로 둘러쌀 필요가 있습니다.
        java -Dfoo="some string" SomeClass
-enableassertions[:<package name>"..."| :<class name> ]
-ea[:<package name>"..."| :<class name> ]
assertion를 유효하게 합니다. assertion는, 디폴트에서는 무효가 되어 있습니다.

인수 없음의 enableassertions 또는 -ea 를 지정하면(자), assertion가 유효하게 됩니다. 「...」(으)로 끝나는 인수를 1 개 지정하면(자), 지정한 패키지와 그 서브 패키지내에서 assertion가 유효하게 됩니다. 인수로서 「...」만을 지정하면(자), 현재의 작업 디렉토리에 있는 이름이 없는 패키지내에서 assertion가 유효하게 됩니다. 「...」(으)로 끝나지 않는 인수를 1 개 지정하면(자), 지정한 클래스내에서 assertion가 유효하게 됩니다.

단일 커멘드행에 이러한 스윗치의 인스턴스를 복수 지정했을 경우는, 지정한 스윗치가 차례로 처리되고 나서 클래스가 로드 됩니다. 따라서, 예를 들어, 패키지 com.wombat.fruitbat (서브 패키지를 포함한다) 내에서만 assertion를 유효하게 해 프로그램을 실행하려면 , 다음과 같은 커멘드를 사용합니다.

java -ea:com.wombat.fruitbat...<Main Class>

-enableassertions-ea 스윗치는, 모든 클래스 로더 및 시스템 클래스에 적용됩니다. 시스템 클래스에는 클래스 로더는 없습니다. 다만, 이 규칙에는 예외가 1 개 있습니다. 그것은, 인수없이 이 스윗치를 지정하면(자), 그 지정은 시스템 클래스에는 적용되지 않는, 이라고 하는 것입니다. 이 예외를 이용하면, 시스템 클래스를 제외한 모든 클래스에서 assertion를 간단하게 유효하게 할 수가 있습니다. 모든 시스템 클래스에서 assertion를 유효하게 하기 위해서, 다른 스윗치가 준비되어 있습니다. 이후에의 -enablesystemassertions 를 참조해 주세요.

-disableassertions[:<package name>"..."| :<class ; ]
-da[:<package name>"..."| :<class name> ]
assertion를 무효로 합니다. 이것은 디폴트의 설정입니다.

인수 없음의 disableassertions 또는 -da 를 지정하면(자), assertion가 무효가 됩니다. 「...」(으)로 끝나는 인수를 1 개 지정하면(자), 지정한 패키지와 그 서브 패키지내에서 assertion가 무효가 됩니다. 인수로서 「...」만을 지정하면(자), 현재의 작업 디렉토리에 있는 이름이 없는 패키지내에서 assertion가 무효가 됩니다. 「...」(으)로 끝나지 않는 인수를 1 개 지정하면(자), 지정한 클래스내에서 assertion가 무효가 됩니다.

패키지 com.wombat.fruitbat 내에서는 assertion를 유효하게 해, 클래스 com.wombat.fruitbat.Brickbat 내에서는 assertion를 무효로 한 데다가, 프로그램을 실행하려면 , 다음과 같은 커멘드를 사용합니다.

java -ea:com.wombat.fruitbat...-da:com.wombat.fruitbat.Brickbat <Main Class>

-disableassertions-da 스윗치는, 모든 클래스 로더 및 시스템 클래스에 적용됩니다. 시스템 클래스에는 클래스 로더는 없습니다. 다만, 이 규칙에는 예외가 1 개 있습니다. 그것은, 인수없이 이 스윗치를 지정하면(자), 그 지정은 시스템 클래스에는 적용되지 않는, 이라고 하는 것입니다. 이 예외를 이용하면, 시스템 클래스를 제외한 모든 클래스에서 assertion를 간단하게 유효하게 할 수가 있습니다. 모든 시스템 클래스에서 assertion를 무효로 하기 위해서(때문에), 다른 스윗치가 준비되어 있습니다. 이후에의 -disablesystemassertions 를 참조해 주세요.

-enablesystemassertions
-esa
모든 시스템 클래스내에서 assertion를 유효하게 합니다. 즉, 시스템 클래스에 도착해 assertion의 디폴트 스테이터스를 true 로 설정합니다.

-disablesystemassertions
-dsa
모든 시스템 클래스내에서 assertion를 무효로 합니다.

-jar
JAR 파일에 캡슐화된 프로그램을 실행합니다. 최초의 인수는, 기동 클래스의 이름은 아니고, JAR 파일의 이름으로 합니다. 이 옵션이 기능하려면 , JAR 파일의 마니페스트에「Main-Class:classname라고 하는 형식의 행을 지정할 필요가 있습니다. 다만,classname 에는, 어플리케이션의 개시 위치로서 기능하는 public static void main(String[] args) 메소드를 포함한 클래스를 지정합니다. JAR 파일과 그 마니페스트에 대해서는,jar 툴의 레퍼런스 페이지Java 튜토리얼의 「Trail: Jar Files」를 참조해 주세요.

이 옵션을 사용하면(자), 지정한 JAR 파일이 모든 유저 클래스의 소스가 되어, 유저 클래스 패스외의 설정은 무시됩니다.

-javaagent:jarpath[=options]
Java 프로그램 언어 에이전트를 로드합니다. java.lang.instrument 를 참조해 주세요.

-verbose
-verbose:class
클래스가 로드 될 때마다 클래스에 관한 정보를 표시합니다.

-verbose:gc
가베지 콜렉션 이벤트가 발생할 때마다 보고합니다.

-verbose:jni
네이티브 메소드의 사용 및 그 외의 Java Native Interface (JNI) 액티버티에 관한 정보를 보고합니다.

-version
버젼 정보를 표시해 종료합니다.

-showversion
버젼 정보를 표시해 속행합니다.

-?
-help
사용법을 표시해 종료합니다.

-X
비표준 옵션에 관한 정보를 표시해 종료합니다.

비표준 옵션

-Xint
interpreter 전용 모드로 동작합니다. native code에의 컴파일은 무효가 되어, 모든 바이트 코드가 interpreter에 의해 실행됩니다. Java HotSpot Client VM 대응의 컴파일러가 제공하는 퍼포먼스상의 이점은, 이 모드에서는 실현되지 않습니다.

-Xbatch
백그라운드 컴파일을 무효로 합니다. 통상, VM 에서는, 백그라운드 컴파일이 종료할 때까지, 메소드를 백그라운드 태스크로서 컴파일 해, interpreter 모드로 메소드를 실행합니다. -Xbatch 플래그를 지정하면(자), 백그라운드 컴파일이 무효가 되어, 모든 메소드의 컴파일이 완료할 때까지 foreground 태스크로서 처리됩니다.

-Xdebug
JVMDI 의 서포트를 유효하게 해 개시합니다. JVMDI 는 추천 되고 있지 않습니다. 또, J2SE 5.0 에서의 디버그에는 사용되지 않습니다. 따라서, J2SE 5.0 에서의 디버그에는, 이 옵션은 필요 없습니다.
-Xbootclasspath:bootclasspath
부 트 클래스 파일을 검색하는 디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)를 세미콜론으로 단락지은 리스트로 지정합니다. 지정한 패스에 존재하는 부트 클래스 파일이, Java 2 SDK 에 포함되는 부트 클래스 파일 대신에 사용됩니다. 주: rt.jar 내의 클래스를 오버라이드(override) 하는 목적으로 이 옵션을 사용하는 어플리케이션은, 시스템에 배치하지 말아 주세요. Java 2 Runtime Environment 바이너리코드 라이센스 위반이 됩니다.
-Xbootclasspath/a:path
디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 패스를 세미콜론으로 단락지어 지정합니다. 패스는 디폴트의 bootstrap 클래스 패스의 뒤로 추가됩니다.
-Xbootclasspath/p:path
디렉토리, JAR 어카이브(archive), 및 ZIP 어카이브(archive)의 패스를 세미콜론으로 단락지어 지정합니다. 패스는 디폴트의 bootstrap 클래스 패스전에 추가됩니다. 주: rt.jar 내의 클래스를 오버라이드(override) 하는 목적으로 이 옵션을 사용하는 어플리케이션은, 시스템에 배치하지 말아 주세요. Java 2 Runtime Environment 바이너리코드 라이센스 위반이 됩니다.

-Xcheck:jni
Java Native Interface (JNI) 기능에 대해서 추가 체크를 실시합니다. 구체적으로는, Java 가상 머신은 JNI 요구를 처리하기 전에, JNI 함수에게 건네지는 파라미터와 실행 환경의 데이터를 검증합니다. 무효인 데이터가 발견되었을 경우는, native code에 문제가 있는 것을 나타내고 있기 (위해)때문에, Java 가상 머신은 치명적 에러를 발생해 종료합니다. 이 옵션을 사용하면(자), 퍼포먼스 저하가 예상됩니다.

-Xfuture
클래스와 파일의 형식을 엄밀하게 체크합니다. 하위 호환성을 유지하기 (위해)때문에, Java 2 SDK 의 가상 머신이 실행하는 디폴트의 형식 체크는, JDK 소프트웨어의 버젼 1.1.x 가 실행하는 체크와 동일한 정도의 엄밀함이 되어 있습니다. -Xfuture 플래그를 지정하면(자), 클래스 파일 형식의 사양에의 준거를 강화하기 위한보다 엄밀한 체크가 유효하게 됩니다. Java 어플리케이션 기동 툴의 장래의 릴리스에서는, 보다 엄밀한 체크가 디폴트가 되기 (위해)때문에, 새로운 코드를 개발할 경우에는 이 플래그를 사용하는 것을 추천합니다.

-Xnoclassgc
클래스의 가베지 콜렉션을 무효로 합니다.

-Xincgc
인크리멘타르가베이지코레크타를 유효하게 합니다. 인크리멘타르가베이지코레크타는, 디폴트에서는 무효가 되어 있습니다. 유효하게 하면(자), 프로그램의 실행중에 가베지 콜렉션에 의한 일시정지가 발생하지 않게 됩니다. 인크리멘타르가베이지코레크타는, 프로그램과 동시에 실행하는 일이 있어, 이 경우, 프로그램의 이용할 수 있는 프로세서 능력이 저하합니다.

-Xloggc:file
-verbose:gc 와 같게 가베지 콜렉션 이벤트가 발생할 때마다 보고합니다만, 그 데이터를 file 에 기록합니다. -verbose:gc 를 지정했을 때에 보고되는 정보 외에, 보고되는 각 이벤트의 선두에, 최초의 가베지 콜렉션 이벤트로부터의 경과시간 (초단위)을 덧붙일 수 있습니다.

네트워크의 응답 시간에 의해 JVM 의 실행 속도가 저하하는 것을 피하기 (위해)때문에, 이 파일의 포함처는, 항상 로컬 파일 시스템으로 해 주세요. 파일 시스템이 만배가 되면(자), 파일은 잘라 버릴 수 있어 그 파일에 데이터가 계속해 기록됩니다. 이 옵션과 -verbose:gc 의 양쪽 모두가 커멘드행으로 지정되고 있는 경우는, 이 옵션이 우선됩니다.

-Xmsn
메모리 할당 풀의 초기 사이즈를 바이트수로 지정합니다. 지정하는 값은, 1M 바이트보다 큰 1024 의 배수로 하지 않으면 안됩니다. 킬로바이트를 지정하려면 , 문자 k 또는 K 를 붙입니다. 메가바이트를 지정하려면 , 문자 m 또는 M 를 붙입니다. 기정치는 2M 바이트입니다. 다음에 예를 나타냅니다.
       -Xms6291456
-Xms6144k
-Xms6m

-Xmxn
메모리 할당 풀의 최대 사이즈를 바이트수로 지정합니다. 지정하는 값은, 2M 바이트보다 큰 1024 의 배수로 하지 않으면 안됩니다. 킬로바이트를 지정하려면 , 문자 k 또는 K 를 붙입니다. 메가바이트를 지정하려면 , 문자 m 또는 M 를 붙입니다. 기정치는 64M 바이트입니다. 다음에 예를 나타냅니다.
       -Xmx83886080
-Xmx81920k
-Xmx80m

-Xprof
실행중의 프로그램의 프로파일을 생성해, 프로 파일링 데이터를 표준 출력에 출력합니다. 이 옵션은, 프로그램 개발용의 유틸리티로서 제공되고 있습니다. 실전 가동 시스템에서의 사용을 목적으로 한 것이 아닙니다.

-Xrunhprof[:help][:<suboption>=<value>,...]
CPU, heap, 또는 모니터의 프로 파일링을 유효하게 합니다. 통상, 이 옵션의 후에는, 콤마로 단락지어진 「<suboption>=<value>」의 페어가 계속됩니다. 서브 옵션과 그 디폴트치의 리스트를 취득하려면 , 커멘드 java -Xrunhprof:help 를 실행합니다.

-Xrs
Java 가상 머신 (JVM)에 의한 operating system 시그널의 사용을 줄입니다. 이 옵션은, J2SE 1.3. 1 이후에 이용 가능하게 되었습니다.

J2SE 1.3. 0 에서는, Java 어플리케이션을 질서 올바르고 슛다운하기 위한 슛다운 훅 기능이 추가되었습니다. 이 기능에 의해, JVM 가 돌연 종료했을 경우에서도, 슛다운시에 유저 클린 업 코드 (데이타베이스 접속의 클로우즈등)를 실행할 수 있게 되었습니다.

JVM 는, 콘솔 제어 이벤트를 감시해 JVM 의 이상종료(ABEND)를 검지하는 것으로써, 슛다운의 훅을 실현합니다. 구체적으로는, JVM 는, 슛다운 훅 처리를 개시하는 콘솔 제어 핸들러를 등록해, CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 및 CTRL_SHUTDOWN_EVENT 에 대해서 TRUE 를 돌려줍니다.

JVM 는, 디버그의 목적으로 thread 스택을 덤프 한다고 하는, 1.2 보다 전부터 있는 기능을 실현하기 위해서(때문에)도, 같은 기구를 사용합니다. Sun 의 JVM 는, thread 덤프를 실행하기 위해서 CTRL_BREAK_EVENT 를 사용합니다.

JVM 가 서비스 (Web 서버용의 서브 렛 엔진등)로서 실행되고 있는 경우, JVM 는, CTRL_LOGOFF_EVENT 를 받아도 슛다운 처리를 개시해 되지 않습니다. 그 때, operating system는, 실제로는 프로세스를 종료시키지 않기 때문입니다. 이 예의 같은 장해의 가능성을 피하기 (위해)때문에, J2SE 1.3. 1 이후에서는 -Xrs 커멘드행 옵션이 추가되었습니다. Sun 의 JVM 로 -Xrs 옵션을 사용하면(자), JVM 는, 콘솔 제어 핸들러를 인스톨 하지 않습니다. 이 경우, JVM 는, CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 및 CTRL_SHUTDOWN_EVENT 의 감시와 처리를 실시하지 않습니다.

-Xrs 를 지정했을 경우, 다음의 2 개의 영향이 있습니다.

-Xssn
thread의 스택 사이즈를 설정합니다.

DTFE에서 5월 23일, JAVAFX 관련한 기술 관련 세미나가 있다.
'JAVAFX? 그게 뭐지? 처음 듣는데..?' 라는 생각에 한번 찾아봤다. ㅡㅅ-)>

Adobe에서 Flex( 관련 사이트 : http://www.adobe.com/kr/products/flex/ )를 발표한 뒤 얼마 있지 않아서 MS 측에서는 SilverLight( 관련사이트 : http://silverlight.net/ )를 발표했다. 여기에 호응하여 JAVA 측에서도 JAVAFX( 관련사이트 : http://javafx.com/)를 발표했다. 순서야 어찌되었든, 웹2.0(웹 2.0 - 위키백과) 에 들어서고 AJAX 기법이 도입되고 RIA를 요구하게 되면서 탄생을 한 웹 애플리케이션 개발툴 이라고 할 수 있겠다. ㅡㅅ-)> 이렇게 말하니까 내가 뭔가 아는 것 같잖아? 훗~ 난 아직 초보 개발자.

● Adobe Flex
● MicroSoft SiverLight
● JavaFX

ㅡㅅ-);; 실버라이트만 큰데...?? Adobe는 Flex를 간단히 Fx라고만 하고 있다. ㅡㅅ-)> 우훗~

세가지에 모두 관심을 기울일 수는 없는 노릇이고...
ㅡㅅ-)> 허니몬은 JAVAFX에 중점을 두겠습니다.

오늘은 넷빈(http://www.netbeans.org/)에 대한 간단한 정보를 얻기 위해 java.sun.com 에 방문했다가 아래 링크의 관련한 글이 눈에 띄어서 한번 링크를 클릭하고 들어가 보았습니다. ^^

http://java.sun.com/developer/technicalArticles/javafx/AppORama/
맛뵈기 JAVAFX 라고 할까요? 3개의 JAVAFX 애플리케이션이 있습니다. 오른쪽에 있는 Launch 에서 클릭하여 직접 실행하여 볼 수가 있습니다. ^^
아래의 것은 윈도우에서 실행되는 위젯과 관련된 widgetFX 입니다. ㅡㅅ-)
자바를 기반으로 하고 있기 때문에, jre가 설치된 컴퓨터 환경에서는 운영체제 상관없이 설치가 될 것입니다. 오른쪽 하단에 보시면 살짝 나와있는 부분(Get the WidgetFX SDK)보시면 아시겠지만, 표준개발도구도 있으니까 다운 받아서 한번 사용해보세요. ^^; ㅎㅎ. 정작 저는 이녀석을 만져보려면 시간이 좀 필요합니다. 후훗...

제 컴퓨터에 설치한 화면.

ㅡㅅ-)> Picasa에서는 widgetFX에서 실행된 내용을 스크린샷을 뜨지 못하는군요. 뭐~ 이렇습니다.

흥미를 끄는 녀석들이 많이 나타나고 있습니다. 항상 하는 말이지만!! 머리는 입력량의 한계가 있는데!!
배워야 할 것들은 많아져만 가고!!! 이것이 개발자가 되기 위해 짊어지어야 할 숙명인가!?

피할 수 없다면, 즐겨라!! 푸하하하하하... ㅡㅅ-);; 그렇다고 정신줄을 놓을 필요는 없겠죠?

'상속'은 클래스를 확장하기 위해 편리한 방법이지만 클래스간의 연결을 강하게 고정시킨다. 소스코드 상에서

  1. class SomethingGood extends Something {
       ...
    }

라고 쓰면 SomethingGood 클래스는 Something 클래스의 하위 클래스가 됩니다. 그리고 이 관계는 소스 코드를 고쳐 쓰지 않는 한 바꿀 수 없는 매우 견고한 연결이 된다. 프로그램의 필요에 따라서 클래스 간의 관계를 척척 바꾸고 싶을 때에 상속을 사용하는 것은 부적절하다. 교체할 때마다 소스 코드를 변경할 수 없기 때문이다. 이와 같은 경우에는 '상속'이 아니라 '위임'을 사용한다.

 

예제 프로그램 Display.java

  1. public class Display {
        private DisplayImpl impl;
        public Display(DisplayImpl impl) {
            this.impl = impl;
        }

        public void open() {
            impl.rawOpen();
        }

        public void print() {
            impl.rawPrint();
        }

        public void close() {
            impl.rawClose();
        }

        public final void display(){
            open();
            print();
            close();
        }

    }

예제 프로그램(추상 클래스) DisplayImpl.java

  1. public abstract class DisplayImpl {
        public abstract void rawOpen();
        public abstract void rawPrint();
        public abstract void rawClose();
    }

 

예제 프로그램에서는 Display 클래스 내에서 위임이 사용되고 있다. Display 클래스의 impl 필드에는 구현되는 인스턴스가 저정되어 있어서

... open을 실행할 때에는 impl.rawOpen()을 호출한다.

... print를 실행할 때에는 impl.rawPrint()을 호출한다.

... close를 실행할 때에는 impl.rawClose()를 호출한다.

 라는 식으로 '떠넘기기:위임'을 하고 있다. 이것이 위임이다. 상속은 견고한 연결이고 위임은 느슨한 연결이다. DIsplay 클래스의 인스턴스를 만드는 단계에서 인수로 전달되어온 것과 연결되기 때문이다. 상속과 위임의 관계에 대해서는 Template Method 패턴에서 등장하므로 참고하기 바란다.

이 글은 스프링노트에서 작성되었습니다.

Java에서는 다음과 같이 인스턴스(객체)를 만드는 방법이 있다.

 

   new
 


일반적으로 인스턴스는 Java의 예약어 new를 사용해서 만든다. 다음과 같이 하면 Something 클래스의 인스턴스를 만들고 변수 obj에 대입할 수 있다.

--> obj라는 이름을 가지는 Something 클래스 타입의 객체를 가진다 라고 말할 수 있겠다.

Something obj = new Something();

 이 경우 클래스 이름(여기에서는 Something)을 소스 안에 기술할 필요가 있다.

 

   clone()
 

Prototype 패턴에서 등장했던 clone 메소드를 사용하면 이미 존재하는 인스턴스를 기초로 새로운 인스턴스를 만들 수 있다. 다음과 같이 하면 자신(this)을 기초로 새로운 인스턴스(객체)를 만들 수 있다(단, 생성자는 호출되지 않는다).

java.lang
클래스 Class<T>

java.lang.Object 
java.lang.Class<T>

java.lang
클래스 Object

java.lang.Object

clone

protected Object  clone()


throws
CloneNotSupportedException

이 객체의 카피를 작성해, 돌려줍니다. 「카피」의 정확한 이유는, 객체의 클래스에 의해 다릅니다. 일반적으로는, 임의의 객체 x 에 대해, 다음의 식
 x.clone() ! = x
하지만 true 이며, 다음의 식
 x.clone(). getClass() == x.getClass()
도 true 인 것입니다만, 이것들도 절대적인 요건이 아닙니다. 또 다음의 식
 x.clone(). equals(x)
도 일반적으로 true 가 됩니다만, 이것도 절대적인 요건이 아닙니다.

일반적으로,super.clone 를 호출하는 것으로 반환되는 객체를 취득할 수 있습니다. 클래스 및 그 슈퍼 클래스 모든 것 (Object 를 제외한다)이 이 규칙에 따르는 경우,x.clone(). getClass() == x.getClass() 가 성립합니다.

일반적으로, 이 메소드에 의해 반환되는 객체는, 이 객체 (복제되고 있다)로부터 독립하고 있을 필요가 있습니다. 이 독립성을 달성하기 위해(때문에),super.clone 가 돌려주는 객체의 필드를 1 개 이상 (객체가 돌려주기 전에) 변경하는 것이 필요하게 되는 경우가 있습니다. 이것은, 일반적으로, 복제하는 객체의 내부 「심층 구조」를 구성하는 가변 객체의 카피, 및 이러한 객체에의 참조를 카피에의 참조에 옮겨놓는 것을 의미합니다. 클래스에 프리미티브(primitive) 필드 또는 불변 객체에의 참조만이 포함되는 경우, 일반적으로,super.clone 에 의해 반환되는 객체내의 필드를 변경할 필요는 없습니다.

Object 클래스의 clone 메소드는, 특정의 복제 처리를 실행합니다. 우선, 이 객체의 클래스가 Cloneable 인터페이스를 구현하고 있지 않는 경우는,CloneNotSupportedException 가 throw 됩니다. 배열은 모두, 인터페이스 Cloneable 를 구현하고 있는 것이라고 보여지는 것에 주의해 주세요. 구현하고 있지 않는 경우, 이 메소드는 이 객체의 클래스의 새로운 인스턴스를 생성해, 그 필드를 모두, 이 객체의 대응하는 각 필드의 내용으로 초기화합니다. 이것은 대입과 같아, 필드의 내용 자신이 복제되는 것은 아닙니다. 즉 이 메소드는, 객체의 「shallow 복사」를 생성합니다만, 「딥 카피」는 생성하지 않습니다.

Object 클래스 자체는,Cloneable 인터페이스를 구현하지 않기 때문에, 클래스가 Object 인 clone 메소드를 호출하면(자), 실행시에 예외가 throw 됩니다.

반환값:
이 인스턴스의 복제
예외:
CloneNotSupportedException - 객체의 클래스가 Cloneable 인터페이스를 지원하고 있지 않는 경우. clone 메소드를 오버라이드(override) 한 서브 클래스도, 인스턴스를 복제할 수 없는 것을 나타내기 위해서(때문에) 이 예외를 throw 하는 일이 있는
관련 항목:
Cloneable

JDK 1.6 API 상에 설명되는 clone() 메소드의 개요

 

  1. class Something {
        ...
        public Something createClone() {
            Something obj = null;
            try {
                obj = (Something)clone();
            } catch ( CloneNotSupportedException e ) {
                e.printStackTrace();
            }
            return obj;
        } 
    }

 

   newInstance()
 

java.lang.Class 클래스의 newInstance 메소드를 사용하면 Class의 인스턴스(객체)를 기초로 그 Class가 표시하고 있는 클래스의 인스턴스(객체)를 만들 수 있다(인수 없는 생성자가 호출된다).

newInstance

public T  newInstance()


throws
InstantiationException ,


IllegalAccessException
이 Class 객체가 나타내는 클래스의 새로운 인스턴스를 생성합니다. new 식에 빈 상태(empty)의 인수 리스트를 지정했을 경우와 같이, 클래스의 인스턴스가 생성됩니다. 클래스는, 초기화되어 있지 않으면 초기화됩니다.

이 메소드는 확인이 끝난 예외 등, 인수 없음의 생성자 에 의해 throw 된 예외를 보내는 것에 주의해 주세요. 이 메소드를 사용하는 것으로, 그 외의 경우에는 컴파일러에 의해 실행되는 컴파일시의 예외 확인을 효과적으로 우회도로 할 수 있습니다. Constructor.newInstance 메소드는, (확인 끝난) InvocationTargetException 의 생성자 에 의해 throw 된 예외를 랩 하는 것으로, 이 문제를 회피합니다.


반환값:
이 객체가 나타내는, 클래스의 새롭게 할당할 수 있었던 인스턴스
예외:
IllegalAccessException - 클래스 또는 그 인수 없음의 생성자 에 액세스 할 수 없는 경우
InstantiationException - 이 Class 가 abstract 클래스, 인터페이스, 배열 클래스, 원시형, 또는 void 를 나타내는 경우, 클래스가 인수 없음의 생성자 을 보관 유지하지 않는 경우, 혹은 인스턴스의 생성이 다른 이유로써 실패했을 경우
ExceptionInInitializerError - 이 메소드에 의한 초기화가 실패했을 경우
SecurityException - 시큐리티 매니저 s 가 존재해, 이하의 조건의 어떤 것인가가 채워지는 경우
  • s.checkMemberAccess(this, Member.PUBLIC) 의 호출이 이 클래스의 신규 인스턴스의 작성을 허가하지 않는다
  • 호출측의 클래스 로더가 같지 않은지, 현재의 클래스 로더의 상위 클래스 로더와 s.checkPackageAccess() 의 호출이 이 클래스의 패키지에의 액세스를 허가하지 않는다

다음은 newInstance의 예입니다. Something 클래스의 인스턴스 someobj가 있다면 다음 식에서 Something 클래스의 인스턴스를 새롭게 만들 수 있다.

  1. someobj.getClass().newInstance();

 

실제로 newInstance 메소드는 InstantiationException이나 IllegalAccessException을 예외로 제공하기 때문에 try{ } catch() {}로 묶든지 메소드에 throws을 선언해야 한다.

 

이 글은 스프링노트에서 작성되었습니다.

출처 :  http://www.okjsp.pe.kr/seq/307

끔찍한 java 에러입니다.
jdbc연결시 에러입니다.


classes12.zip 이 연결이 안된 경우입니다.

java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:297)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:286)
at java.lang.ClassLoader.loadClass(ClassLoader.java:253)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:313)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:120)
at getEmp.main(getEmp.java:18)

해결1: classes12.zip을 classes12.jar 로 이름을 바꾼 뒤에 <CATALINA_HOME>/common/lib 에 놓고 재시동


host 주소가 맞지 않은 경우입니다.
또는 listener가 떠있지 않은 상태입니다.

java.sql.SQLException: IO 예외 상황: The Network Adapter could not establish the connection
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:210)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)


db명이 틀릴경우입니다. 호스트스트링이라고도 합니다.
java.sql.SQLException:IO 예외 상황: Connectionrefused(DESCRIPTION=(TMP=)(VSNNUM=135290880)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:269)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:210)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)


아이디와 패스워드가 틀릴경우입니다.
java.sql.SQLException: 널 사용자나 암호가 THIN 드라이버에서 지원되지 않습니다
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:114)
at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:156)
at oracle.jdbc.dbaccess.DBError.check_error(DBError.java:803)
at oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:179)
at oracle.jdbc.driver.OracleConnection.(OracleConnection.java:198)
at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:251)
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:224)
at java.sql.DriverManager.getConnection(DriverManager.java:517)
at java.sql.DriverManager.getConnection(DriverManager.java:177)
at getEmp.main(getEmp.java:20)

+ Recent posts