SWT 애플리케이션의 개발 과정 중에서 특히, 기본적인 프로토타입을 완성한 이후에, 전개 시 발생될 수 있는 문제에 대하여 고려하여야 합니다. 전통적인 자바 애플리케이션과는 달리, SWT 애플리케이션은 애플리케이션이 작동하기 전에 OS 스팩의 라이브러리들이 로딩되어야 합니다. 이러한 라이브러리들을 지속적으로 전개 및 관리해야 한다는 것은 쉽지 않지만 Sun의 Java Web Start가 도움이 됩니다. SWT와 Java Web Start가 결합하면 클라이언트 측 자바 애플리케이션 구축하는 데에 훌륭한 툴이 됩니다.

SWT 개요

Standard Widget Toolkit (SWT)을 개발 커뮤니티로 도입하기가 여간 까다로운 것이 아니다. 그러한 근거로는 Sun은 Java Foundation Classes (JFC)로 클라이언트 측 애플리케이션 개발자들을 여러 해 동안 회유하고는 있지만, 많은 개발자들은 여러 가지 이유로 이 툴킷 사용을 피하고 있다. 많은 개발자와 아키텍트에게 있어서, 전통적인 데스크탑 애플리케이션처럼 작동하는 클라이언트 측 자바 애플리케이션을 개발하는 것은 아직도 꿈과 같은 일이다.

2001년 중반에, 이클립스 프로젝트가 갑자기 생겨나기 시작했다. 처음에, 이클립스 프로젝트는 자바용 유일한 오픈 소스 Integrated Development Environment (IDE)로 인식되었다. 하지만, 그의 프로젝트의 범위는 훨씬 더 광범위해 졌으며, SWT 툴킷을 탄생시켰다. JFC와 사촌격인 Abstract Window Toolkit (AWT)와 마찬가지로, SWT 툴킷은 개발자용 위젯을 제공한다. 하지만, SWT와 다른 툴킷들과의 주요한 차이점은 SWT가 OS GUI 위젯을 사용하는 방식이다. 이러한 방식은 자바 개발자들에게 크로스 플랫폼 API를 제공하여 원래의 데스크탑 애플리케이션인 것 같은 느낌을 주는 솔루션을 구현할 수 있도록 해준다.







Java Web Start 개요

어떤 언어든, 올바른 툴이 없다면 데스크탑 애플리케이션의 전개와 관리는 개발자들에게 가장 큰 고민거리가 될 것이다. 지원 부서들 조차 새로운 버전의 소프트웨어가 릴리스 될 때 모든 워크스테이션을 업데이트 해야 한다는 생각에 사로잡혀 있으며, 배포 및 관리 요구 사항들을 완화시키기 위해서, 몇년 전 Sun Microsystems는 Java Web Start를 도입했다. 이 기술은 엔드 유저의 워크스테이션에서 자바 애플리케이션의 전개, 관리, 업그레이드를 단순화 한다.

애플리케이션을 시작하는 초기 툴로서 웹 브라우저를 사용하는 Java Web Start는 Sun의 Java Runtime Environment에 포함된 로컬에서 설치된 헬퍼 애플리케이션이다. Java Network Launching Protocol (JNLP) 파일에 액세스 할 때마다, 애플리케이션은 사용자 워크스테이션으로 자동 다운로드 되어 실행을 시작한다. 전체 프로세스는 엔드 유저와의 인터랙션에 대한 필요성이 줄어들었고, 애플리케이션 분산 과정도 단순화 되었다. (참고자료)







파일 뷰어 애플리케이션

Java Web Start를 사용하여 SWT 애플리케이션을 전개하는 방법을 보기 전에, 우리가 전개할 애플리케이션에 대해 잠깐 보도록 하자. 이 글에 소개된 애플리케이션은 이클립스 프로젝트에서 제공하는 예제 애플리케이션이다. 그림 1에서 보듯, 이 애플리케이션은 크로스-플랫폼(cross platform) 파일 뷰어로서 사용자들이 하드 드라이브 상의 파일과 폴더를 볼 수 있도록 한다.


그림 1. Windows XP에서 실행되는 파일 뷰어 



SWT와 Java Web Start의 크로스 플랫폼 기능을 설명하기 위해, 이 글의 예제 애플리케이션은 Microsoft Windows와 Red Hat Linux에서 실행되도록 패키징 되어 있다.







환경 요구 사항

본 기사에서 기술한 코드는 하단부에 명기된 링크를 통하여 다운로드 할 수 있다. Java Web Start로 파일 뷰어 애플리케이션을 테스트 하려면, 다음과 같은 조건이 충족되어야 한다. (참고자료의 다운로드 링크 참조)

  • Microsoft Windows XP 또는 Red Hat Linux 8 OS
  • Java 2 SDK, Standard Edition 1.4 또는 이후 버전
  • Apache Ant 1.5.3 또는 이후 버전
  • Jakarta Tomcat 4.1.24 또는 이후 버전

Ant 빌드 스크립트를 크로스 플랫폼으로 만드는 것이 본 글의 목적이지만, 파일 뷰어 애플리케이션은 Microsoft Windows XP와 Red Hat Linux 8 OS에서만 테스트 및 확인되었다. 또한, Tomcat은 로컬 워크스테이션과 8080 포트에서 실행되는 것으로 간주한다. 예제 애플리케이션을 구현 및 설치, 실행해보자.






파일 뷰어 애플리케이션 설치하기

파일 뷰어 애플리케이션을 설치하려면 다음 단계를 따른다.

  1. 참고자료 섹션에서 제공하는 링크를 통해 소스 코드 패키지를 다운로드 한다.
  2. fileviewer.zip 파일을 임시 디렉토리에서 압축을 푼다.





보안과 코드 사인

AWT나 JFC와는 달리, SWT는 OS 본연의 윈도우 환경과 긴밀히 연관되어 있다. SWT는 시스템 라이브러리를 사용하여 플랫폼 독립 API와 기반 OS 간 통합을 관리한다. 기본적으로, Java Web Start에서 실행되는 애플리케이션은 제한된 샌드박스(sandbox)에서 실행된다. 이 환경은 워크스테이션의 파일 시스템, 시스템 라이브러리, 기타 리소스 같은 리소스로의 액세스를 제어한다. SWT는 시스템 라이브러리를 로딩하기 위해서 기본 샌드박스 밖에서 실행되어야 하므로, Java Web Start에 전개된 모든 JAR 파일들은 디지털 서명이 필요하다. 이 애플리케이션은 광범위한 사용자 베이스로 전개할 것은 아니므로 자체 서명 테스트 인증을 만들 것이다.

만일 여러분이 SWT 애플리케이션을 실행 환경에 설치하려면, Thawte 또는 VeriSign 같은 인증 기구에서 인증서를 받아두는 것이 좋다.







자체 서명 인증서 만들기

자체 서명 테스트 인증서를 만들려면 다음과 같이 한다.

  1. 소스 코드의 압축을 풀었던 디렉토리에서 다음 명령어를 실행한다: keytool -genkey -keystore keystore -alias myself.

    패스워드, 이름, 위치를 포함한 새로운 키에 대한 상세를 요청하는 프롬프트가 뜬다. Ant 빌드 프로세스를 사용하려면, 패스워드를 "password"로 설정한다. 패스워드를 "password"로 하지 않으려면, build.xml 파일 내에서 "sign-jars"를 편집한다. 각 JAR 파일을 서명하는 실제 프로세스는 Ant 구현 동안에 완료된다.

  2. 키스토어(Keystore)가 올바르게 생성되었는지를 확인하려면 소스 코드 압축을 풀었던 디렉토리에 다음 명령을 실행한다: keytool -list-keystore keystore

    결과는 다음과 같다:

    Keystore type: jks
    Keystore provider: SUN
           
    Your keystore contains 1 entry
           
    myself, Jun 3, 2003, keyEntry,
    Certificate fingerprint (MD5):B8:C4:48:ED:68:E8:FE:47:83:78:F5:14:4E:28:5C:80







파일 뷰어 애플리케이션 구현하기

파일 뷰어 애플리케이션을 구현하려면, 다음 단계를 따라간다.

  1. 환경을 삭제하려면, 소스 코드 압축을 풀었던 디렉토리에서 ant clean 명령을 실행한다.
  2. ant 명령을 실행하여 빌드 프로세스를 시작한다.

요구 사항에 부합하는 환경이 마련되고 올바르게 설정되었다면 다음과 같은 내용을 볼 수 있다.

Buildfile: build.xml

init:

compile-common:

compile-module:
     [echo] Compiling ...

package-common:

package-swtlib:

sign-jars:
     [echo] Signing JARS...
  [signjar] Signing Jar : D:\FileViewer\dist\swt-lib.jar
  [signjar] Signing Jar : D:\FileViewer\dist\fileviewer.jar
     [copy] Copying 1 file to D:\FileViewer\dist
  [signjar] Signing Jar : D:\FileViewer\dist\swt-win32.jar

package-web:
      [war] Building war: D:\FileViewer\dist\fileviewer.war

default:

BUILD SUCCESSFUL
Total time: 6 seconds






파일 뷰어 애플리케이션 실행하기

Java Web Start를 사용하여 파일 뷰어 애플리케이션을 전개하기 전에, 애플리케이션을 로컬에서 실행해 보자. 애플리케이션을 시작하려면 소스 코드의 압축을 풀었던 디렉토리에서 ant run을 실행한다.

Ant 스크립트를 실행하면 파일 뷰어 애플리케이션이 나타난다. 그림 2는 Red Hat Linux 8에서 실행되는 애플리케이션 모습이다.


그림 2. Red Hat Linux 8에서 실행되는 파일 뷰어 







파일 뷰어 애플리케이션 전개 및 테스트

애플리케이션을 Tomcat 4에 전개하려면 다음과 같이 한다.

  1. Tomcat 4에서 dist 디렉토리에서 webapps 디렉토리로 fileviewer.war 파일을 복사한다.
  2. 스크립트를 실행하여 Tomcat 4를 시작한다.
  3. 웹 브라우저에서 http://localhost:8080/fileviewer/index.html로 들어가서 "Launch Application" 링크를 클릭한다.

    링크를 클릭하고, 애플리케이션의 JAR 파일이 워크스테이션으로 다운로드 되는 동안 다음과 같은 이미지를 볼 수 있다.(그림 3)



    그림 3. 파일 뷰어 


  4. 애플리케이션이 처음 다운로드 되면, 다음과 같은 대화 창이 나타난다. (그림 4)

    그림 4. 보안 경고 


    "Start"를 클릭하여 파일 뷰어 애플리케이션을 시작한다.







JNLP 파일 구현하기

Sun의 Java Web Start를 사용하여 SWT 애플리케이션을 구현, 배포, 전개하는 방법을 알아보았다. 이제는 JNLP 파일을 구현하는 방법에 대해 알아보자. Java Network Launching Protocol 스팩은 Java Community Process (JCP)에서 관리된다. 이 글의 목적은 이 기술을 사용하여 SWT 애플리케이션을 전개하는 방법을 설명하는 것이기 때문에 그 외 배경 설명은 생략하도록 하겠다. Java Web Start에 대한 자세한 내용은 Steve Kim의 기술자료 "Java Web Start"를 참조하라. (참고자료)

Listing 1은 SWT 애플리케이션의 JNLP 파일에서 사용되는 다양한 태그들이다.


Listing 1. index.jnlp 파일
				
1  <?xmlversion="1.0" encoding="utf-8"?>
2     <jnlp spec="1.0+"codebase="http://localhost:8080/fileviewer"href="index.jnlp">
3         <information>
4                 <title>File Viewer</title>
5                 <vendor>IBM developerWorks</vendor>
6                 <homepage href="index.html"/>
7                 <description>File Viewer</description>
8                 <description kind="short">FileViewer</description>
9         </information>
10        <security>
11                 <all-permissions/>
12         </security>
13         <resources>
14                 <j2se version="1.4"/>
15                 <jar href="fileviewer.jar"/>
16                 <nativelib href="swt-lib.jar"/>
17         </resources>
18         <resources os="Windows"> 
19                 <jar href="swt-win32.jar"/>
20         </resources>
21         <resources os="Linux"> 
22                 <jar href="swt-linux.jar"/>
23         </resources>
24         <application-descmain-class="org.eclipse.swt.examples.fileviewer.FileViewer"/>
25 </jnlp>

이 XML 파일에서 중요한 부분을 살펴보도록 하자.

  1. SWT 애플리케이션은 실행하는 동안 시스템 라이브러리를 로딩해야 하므로, 사용자의 워크스테이션으로 완전히 액세스 해야 한다. 라인 10에서 12번은 애플리케이션이 클라이언트의 환경에 액세스를 요청하는 방법을 나타낸다. Java Web Start가 액세스 허용을 받으려면, 모든 애플리케이션의 JAR 파일들은 디지털 서명이 되어야 한다.
  2. 라인 16번에서 보듯, nativelib 태그를 선언하여 Java Web Start에게 이 JAR 파일에 원래의 라이브러리들이 포함되어 있음을 알려주어야 한다. 예제 파일 뷰어 애플리케이션에서, 이 JAR 파일에는 Windows DLL과 리눅스용 SO 파일 시리즈가 포함된다.
  3. 라인 23번은 각 OS에 대한 SWT JAR를 로딩하는 부분이다. "resources" 태그를 사용하여 특정 OS와 아키텍처에서만 사용될 리소스들을 보호할 수 있다. os 애트리뷰트는 리소스 엘리먼트가 관여할 OS를 지정하며, 해당 값은 엔드 유저의 os.name 자바 시스템 프로퍼티에 기반한다. 이 예제에서는 사용되지 않지만, 자바 라이브러리로 액세스를 제한할 때 arch 애트리뷰트를 사용할 수 있다. arch 애트리뷰트는 엔드 유저의 os.arch 자바 시스템 속성에 기반한다.

JNLP 파일의 다양한 엘리먼트와 포맷에 대한 정보는 참고자료 섹션을 참조하라.






요약

SWT 사용자 인터페이스 툴킷과 Java Web Start가 결합하면 상호 작용하는 클라이언트 측 자바 애플리케이션을 전개하는 훌륭한 툴이 된다. 예제 파일 뷰어 애플리케이션은 Java Web Start를 통해 분산될 독립형 SWT 애플리케이션을 구현하는데 사용할 수 있는 빌드 및 패키징 프레임웍을 제공한다.

기사의 원문보기








다운로드 하십시오

이름 크기 다운로드 방식
os-jws/fileviewer.zip  FTP
다운로드 방식에 대한 정보


참고자료

<출처: http://www.pmguda.com/447>
<원문:
http://www.ibm.com/developerworks/kr/library/os-jws/>


Posted by 티엘로


FTP? 자바?

FTP는 요즘 같은 인터넷 세상에서 빠지지 않는 프로토콜이다. FTP가 무엇인지 잘 모른다면 다음을 참고하자.
FTP (File Transfer Protocol) ; 파일 전송 프로토콜

FTP[에프 티 피]는 인터넷상의 컴퓨터들간에 파일을 교환하기 위한 표준 프로토콜로서 가장 간단한 방법이기도 하다. 화면에 표시할 수 있는 웹 페이지와 관련 파일들을 전송하는 HTTP (Hypertext Transfer Protocol), 전자우편을 전송하는 SMTP (Simple Mail Transfer Protocol)등과 같이, FTP도 역시 인터넷의 TCP/IP 응용 프로토콜 중의 하나이다. FTP는 웹 페이지 파일들을 인터넷상에서 모든 사람이 볼 수 있도록 하기 위해 저작자의 컴퓨터로부터 서버로 옮기는 과정에서 사용된다. 또한, 다른 서버들로부터 자신의 컴퓨터로 프로그램이나 파일들을 다운로드 하는 데에도 많이 사용된다.

사용자 입장에서는 간단한 명령어를 통하여 FTP를 쓰거나, 또는 그래픽 사용자 인터페이스를 제공하는 상용 프로그램을 쓸 수도 있다. 보통은 웹 브라우저도 웹 페이지로부터 선택한 프로그램을 다운로드 하는데 FTP를 사용한다. FTP를 사용하여 서버에 있는 파일을 지우거나 이름을 바꾸거나 옮기거나 복사하는 등 갱신작업을 할 수도 있다. FTP 서버에는 로그온을 해야 하지만, 익명의 FTP를 사용하여 모든 사람들에게 공개된 파일들을 쉽게 접근할 수 있도록 하고 있다.

FTP는 보통 TCP/IP에 함께 딸려오는 일련의 프로그램 속에 포함되어 있다.
간단히 말해서 FTP는 파일 전송 프로토콜이다. 우리는 FTP라는 프로토콜을 알게 모르게 많이 사용하고 있다. 회사 동료들 사이에 문서를 주고 받거나, 친구들과 음악 파일, 동영상 등을 주고 받는데 항상 사용하고 있는 것이다. 일반 컴퓨터 사용자들은 프로토콜이니 그런 것에는 관심 없을 것이다. 내가 원하는 파일을 주고 받기만 하면 될 뿐이니까… 그래도 FTP를 사용하기 위해서는 기본 명령을 알아야 한다. 하지만 이런 기본 명령 조차도 귀찮을 다름이다.

FTP 클라이언트 프로그램을 사용하면 FTP 명령을 알지 못하는 사람들도 GUI 환경에서 쉽게 FTP 서버에 접속해서 원하는 파일들을 주고 받을 수 있다. 일반적으로 많이 사용되는 FTP 클라이언트 프로그램으로는 WS_FTP, CuteFTP, 알FTP 등이 있다. 그렇다면 과연 누가 이런 FTP 클라이언트 프로그램을 만드는가? 당연히 개발자의 몫이다. 그럼 또한 자바로는 가능한가. 당연히 자바로도 가능하다. 원래 자바라는 언어 자체가 네트워크 분야에서 강력한 힘을 발휘한다고 하지 않는가? 이제부터 우리는 자바로 FTP 클라이언트 프로그램을 개발해 볼 것이다. 물론 다른 상용 프로그램처럼 훌륭한 GUI를 지원하는 프로그램은 아니다. 콘솔에서 작동하는 “Hello FTP”를 개발할 것이다. “에이, GUI가 없다면 썰렁할텐데…” 물론 이렇게 생각하는 분들도 있을 것이다. 하지만 모든 프로그램은 항상 “Hello”로부터 시작되므로 무시해서는 안될 것이다. 화려한 GUI 개발은 여러분들이 직접 해보시길 바란다. 아마 쉽지 않은 작업이 분명할 듯…

무엇이 필요한가?

당연히 자바로 개발하기 위해서는 JDK가 있어야 한다. JDK를 구하고 설치하는 것은 다른 자바 기초 서적을 참고하기 바란다.

자바만으로도 FTP 관련 프로그램을 만들 수 는 있다. sun.net.ftp 패키지에 보면 FTP 클라이언트 구현을 위한 클래스들이 있다. 하지만 필자가 프로젝트를 하면서 이 패키지를 사용해 보았는데, 몇몇 기능이 원하는 기능을 지원하지 않는 것을 알게 되었다. 그리고 썬사의 문서를 참고하면 sun으로 시작되는 패키지는 사용하지 말라고 권하고 있다.

아… 그렇다면 어찌해야 한단 말인가?
FTP 프로토콜을 지원하는 모든 기능을 다 구현해야 한다는 말인가? 충분한 시간과 실력이 된다면 그것도 좋은 방법이다. 일단 실력은 둘째 치고라도 우리에게는 충분한 시간이 없다. 이럴 때 도움을 받을 수 있는 수 많은 오픈 소스들과 공짜 패키지 들이 있지 않은가? 비겁하고 치사하다고 생각할 필요는 없다고 생각하자. 어차피 우리는 생활에 필요한 대부분의 것을 남이 만든 것을 사다 쓰고 있는 현실이니…

http://www.savarese.org/java/index.html에 가면 NetComponents에 대한 설명이 있다. 자세한 것은 읽어보면 알겠지만 소스 코드까지 무료로 사용할 수 있다. 우리는 이것을 사용할 것이다. http://www.savarese.org/downloads/NetComponents/에서 다운로드 받으면 된다. 필자는 NetComponents-1.3.8-bin.zip 파일을 다운로드 받아서 압축을 풀었다. 여러 폴더와 파일들이 있다. 필자는 윈도우를 사용하고 있다. 혹시 다른 운영체제를 사용한다면 문서들을 살펴보길 바란다.

NetComponents.jar 파일을 클래스패스에 추가하자. 클래스패스에 추가하는 방법을 모르는 분들은 다른 자바 기초 서적을 참고하시길… Doc 폴더에는 API 도움말이 있고 examples 폴더에는 여러 예제가 있다. 눈치 빠른 개발자들이라면 예제 파일을 본 후에 NetComponents가 아주 많은 프로토콜을 지원한다는 것을 쉽게 예상 할 수 있을 것이다. 공짜로 사용하는 것 치고는 아주 많은 기능을 제공한다. 여유가 되는 분들은 다른 기능도 사용해보고 이에 대한 기사 올려준다면 다른 개발자들에게 큰 힘이 될 것이 분명하다. 물론 예제에는 FTP도 포함되어 있으며(ftp.java) 본 기사에서도 이 예제를 참고할 것이다.

어떤 기능을 개발할 것인가?

프로그램을 개발하기 위해서는 어떤 것을 개발할 것인지, 어떤 기능을 수행해야 하는지를 명확히 알아야 한다. 이런 것들을 소프트웨어 공학에서는 “요구 사항” 이라고 한다. 요구 사항이 명확히 정의 되지 않으면 개발 도중에 많은 실수를 반복하고 기간이 늘어나기 쉽상이지만 우리가 개발할 프로그램의 요구 사항은 아래와 같이 간단하다.
  • FTP 서버에 접속한다.
  • 정해진 디렉토리로 이동한다.
  • 디렉토리 내의 사이즈가 0보다 큰 모든 로그 파일들을 가져온다.
혹시 다른 기능이 더 필요하다면 API 도움말을 참고하면 된다. 적절한 클래스와 메소드들을 사용해서 상용 FTP 클라이언트 프로그램들이 제공하는 기능은 대부부분 구현이 가능하다.

소스코드

코드 자체는 그리 어려운 부분이 없으므로 따로 설명이 필요할 것이 없다. 기능 자체가 워낙 간단해서인가? 여러분들은 그저 중간에 간단히 적힌 주석 부분만 참고하면 될 것이다. 컴파일을 하고 실행을 하면 화면에서는 나타나는 것이 없지만 실제로 파일이 전송된다. 여러분도 적절히 수정을 하여 원하는 파일들을 서버로부터 전송 받을 수 있을 것이다.
import java.io.*;

import com.oroinc.net.ftp.*;
import com.oroinc.net.*;

public class MyFtpClient {
    static String server = "xxxxx";
    static int port = 21;
    static String id = "xxxxx";
    static String password = "xxxxx";
    FTPClient ftpClient;

    public MyFtpClient(String server, int port, String id, String password) {
        this.server = server;
        this.port = port;
        ftpClient = new FTPClient();
    }

    public static void main(String args[]) {
        MyFtpClient ftp = new MyFtpClient(server, port, id, password);
        ftp.connect();
        ftp.login(ftp.id, ftp.password);
        // 로그파일이 있는 디렉토리로 이동한다
        ftp.cd("/home/ems/emsprj/project/wos/WosLog/log");
        FTPFile[] files = ftp.list();
        for (int i = 0; i < files.length ; i++) {
            String fileName = files[i].getName();
            // 파일 이름에서 확장자만 추출
            String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
            long size = files[i].getSize();
            // 파일 사이즈가 0보다 크고 로그 파일만 가져온다
            if ( (size > 0) && (extension.equalsIgnoreCase("log")) ) {
                File file = ftp.get(fileName, fileName);
            }
        }
        ftp.logout();
        ftp.disconnect();
        System.exit(1);
    }

    // 계정과 패스워드로 로그인
    public boolean login(String user, String password) {
        try {
            this.connect();
            return ftpClient.login(user, password);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로부터 로그아웃
    private boolean logout() {
        try {
            return ftpClient.logout();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return false;
    }

    // 서버로 연결
    public void connect() {
        try {
            ftpClient.connect(server, port);
            int reply;
            // 연결 시도후, 성공했는지 응답 코드 확인
            reply = ftpClient.getReplyCode();
            if(!FTPReply.isPositiveCompletion(reply)) {
                ftpClient.disconnect();
                System.err.println("서버로부터 연결을 거부당했습니다");
                System.exit(1);
            }
        }
        catch (IOException ioe) {
            if(ftpClient.isConnected()) {
                try {
                    ftpClient.disconnect();
                } catch(IOException f) {
                    //
                }
            }
            System.err.println("서버에 연결할 수 없습니다");
            System.exit(1);
        }
    }

    // FTP의 ls 명령, 모든 파일 리스트를 가져온다
    public FTPFile[] list() {
        FTPFile[] files = null;
        try {
            files = this.ftpClient.listFiles();
            return files;
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }

    // 파일을 전송 받는다
    public File get(String source, String target) {
        OutputStream output = null;
        try {
            File local = new File(source);
            output = new FileOutputStream(local);
        }
        catch (FileNotFoundException fnfe) {
            fnfe.printStackTrace();
        }
        File file = new File(source);
        try {
            if (ftpClient.retrieveFile(source, output)) {
                return file;
            }
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
        return null;
    }

    // 서버 디렉토리 이동
    public void cd(String path) {
        try {
            ftpClient.changeWorkingDirectory(path);
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

    // 서버로부터 연결을 닫는다
    private void disconnect() {
        try {
            ftpClient.disconnect();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

}
참고문헌

Posted by 티엘로

1.    오버라이딩 (overriding)

 

-          상속관계에 있는 클래스들간에 같은 이름의 메소드를 정의하는 행위로 처음 메소드의 기능을 덮어버리는 것

-          , 상위클래스의 있는 메소드의 내용을 하위클래스에서 바꿈

-          기존 클래스의 메소드 구현 부분만 약간 변화시켜 새로운 클래스를 생성할 수 있다.

-          Name, Return type, Argument list가 같아야 한다.

 

2.    오버라이딩 조건

 

-          final로 선언된 메소드는 오버라이딩(중복정의) 할 수 없다.

-          static 메소드는 반드시 static 메소드로 오버라이딩 해야 한다.

-          오버라이딩된 메소드의 접근변경자가 더 private하면 안 된다.

è     새로 오버라이딩 한 메소드는 아래의 접근변경자에서 우측 방향에 있는  또는 같은 종류의 접근변경자만 지정할 수 있다는 것이다.

è     private --> (friendly) --> protected --> public

class A { void m(int i, String s) {} // 메소드 정의 }

class B extends A { private void m(int i, String s) {} }

// friendly private로 중복정의 불가

-          오버라이딩된 메소드가 상위클래스의 메소드보다 더 넓은 범위의 확인 예외(checked exception)를 발생시키면 안 된다.

 

3.    오버라이딩 예제

 

public class Parent4{

   public void restDay(){

       System.out.println("잠을 잔다.");

   }

}

 

public class Child4 extends Parent4{

   public void restDay(){

       System.out.println("데이트를 한다.");

   }

}

 

public class Overriding_Test2{

 public static void main(String args[]){

  Parent4 p=new Parent4();

  Child4 c=new Child4();

  p.restDay();

  c.restDay();

 }

 }

 

실행결과

---------- java ----------

잠을 잔다.

데이트를 한다.

Normal Termination

출력 완료 (0초 경과).

Posted by 티엘로


java 이클립스 설치파일에 덮어씌우면 됩니다.
한글 버젼으로 에러를 잡을 수 있기때문에 디버깅이 편합니다.
초보자들에게는 어쩌면 독이 될수 있기 때문에
자바 공부는 게을리 하면 안되겠죠?

사용자 삽입 이미지

Posted by 티엘로