반응형

J2SE 5.0에는 새로운 언어 기능이 다수 도입되었는데, 여기에는 제네릭(Generics)과 향상된 루프문(Enhanced for Loop)이 포함된다. 제네릭(GENERIC)향상된 루프문에 대해서는 이미 이전 테크 팁에서 살펴본 바 있다. J2SE 5.0에 추가된 또 다른 중요한 기능으로 주석을 들 수 있으며, 본 팁에서는 J2SE 5.0에 내장된 주석을 살펴보기로 한다.

먼저, 주석이란 무엇인가? JSR 175: A Metadata Facility for the Java Programming Language의 일부로 정의된 주석은 메타데이터를 프로그램 엘리먼트(클래스, 인터페이스, 메소드 등)에 연결하는 방법을 제시해준다. 주석은 해당 엘리먼트에 대해 생성된 바이트코드를 변경하지 않는 추가 수식자(modifier)라고 할 수 있다.

메타데이터를 소스 코드에 도입한다는 개념은 J2SE 5.0에서 처음 등장한 것은 아니다. 사용자가 @deprecated 태그를 메소드의 javadoc 코멘트에 추가하면 컴파일러는 이를 메소드에 관한 메타데이터로 취급하는데, 이런 기능은 J2SE의 1.0 버전부터 포함되었다. 초기 버전의 플랫폼의 경우 이미 Systemgetenv() 메소드(1.1 addendum까지는 Java Language Specification에 포함되어 있지 않았음)와 더불어 구(deprecated) 메소드가 포함되어 있었지만, 현재로서는--적어도 구문의 @ 부분에 관한 한--개념은 거의 동일하다고 볼 수 있다. 단, 위치에는 변동 사항이 생겼다는 점을 알아두기 바란다--주석 태그가 코멘트가 아니라 소스에 포함된다. 여기서 주안점은 주석이 선언적 프로그래밍 모델을 체계적으로 지원하기 위한 방법이라는 사실이다.

이제 J2SE 5.0에 포함된 최초의 주석, @Deprecated부터 살펴보도록 하자. 우선 여기서는 대문자 D에 유의할 필요가 있다. 기능적으로 볼 때, 소스 내의 @Deprecated는 클래스 또는 메소드와 연결된 javadoc 내의 @deprecated와 동일하게 작동한다. 메소드에 @Deprecated 태그를 플래그하면 해당 메소드나 클래스 사용 시 사용자에게 경고 메시지를 보내도록 컴파일러를 환기시키는 효과가 있다.

아래의 Main 클래스는 @Deprecated 주석과 @deprecated 코멘트가 플래그된 deprecatedMethod()라는 이름의 메소드를 가진다.

  public class Main {

/**
* @deprecated Out of date. Use System.foobar() instead.
*/

@Deprecated
public static void deprecatedMethod() {
System.out.println("Don't call me");
}
}

주석이 붙은 클래스도 주석이 붙지 않은 경우와 동일한 방식으로 컴파일한다.

> javac Main.java

예상대로 Main.class가 생성된다.

deprecated 메소드를 사용하면 javadoc 내의 @deprecated 태그를 사용할 때와 마찬가지로 컴파일 시간 경고가 생성된다. 관련 예는 다음과 같다.

  public class User {
public static void main(String args[]) {
Main.deprecatedMethod();
}
}

아래의 클래스를 컴파일하면,

> javac User.java

deprecated 메소드를 사용하는 데 대한 경고 메시지가 다음과 같이 표시된다.

  Note: User.java uses or overrides a deprecated API.
Note: Recompile with -Xlint:deprecation for details.

컴파일 라인에 -Xlint를 추가하면 무엇이 잘못되었는지 구체적으로 표시할 수 있다.

> javac -Xlint:deprecation User.java

User.java:3: warning: [deprecation] deprecatedMethod() in
Main has been deprecated
Main.deprecatedMethod();
^

1 warning

@deprecated 코멘트에서 @Deprecated 주석으로 변경되더라도 시스템에는 아무런 변화가 생기지 않으며, 단지 작업 수행 방식에 약간의 변화가 발생하는 것 뿐이다. 하지만 J2SE 5.0 플랫폼에 새로 추가된 다른 두 개의 주석, @Override@SuppressWarnings의 경우에는 플랫폼에 새로운 기능을 부여할 수 있다.

@Override 주석은 메소드 선언과 함께 사용할 수 있는데, 이름에서 알 수 있듯이 @Override 주석을 사용하여 수퍼클래스의 메소드를 오버라이드하도록 되어 있는 메소드를 플래그한다. 이 주석은 왜 사용하는 것일까? 오류를 더 신속하게 잡아내기 위해서이다. 아마도 여러분은 메소드를 오버라이드하려다가 메소드 이름의 철자를 틀리거나, 잘못된 인자를 지정하거나, 다른 리턴 타입을 설정했던 적이 무수히 많았을 것이다. 즉, 원래의 의도는 기존의 메소드를 오버라이드하는 것이었는데 그만 새로운 메소드를 정의해 버리는 결과가 종종 발생하게 되는 것이다. @Override를 이용하면 그나마 클래스에서 문제점을 빨리 발견할 수가 있다.

  public class Overrode {
@Override
public int hashcode() {
return 0;
}

@Override
public boolean equals(Object o) {
return true;
}
}

여기서 문제는 메소드 이름이 hashcode가 아니라 hashCode여야 한다는 점이다. 메소드 선언이 훨씬 더 큰 클래스 정의를 위해 소스에 묻혀 버린다고 가정해보자. 최초의 @Override 주석이 없다면, hashCode() 메소드(모두 소문자가 아니라, 대문자로 시작되는 두개의 영단어를 붙여 써서)가 호출되는 대신 상위 Object 클래스의 기본값 동작을 얻고 있다는 사실을 알아차리는 데 얼마나 많은 시간이 걸리겠는가? 하지만 이제는 @Override 주석 덕분에, 클래스 컴파일 시 컴파일 시간 오류가 생성되어 문제점을 경고할 수 있다.

> javac Overrode.java

Overrode.java:2: method does not override a method from its
superclass
@Override
^
1 error

이런 특성의 오류를 좀더 빨리 발견할 수만 있다면 수정에 드는 수고와 비용을 획기적으로 절감할 수 있을 것이다. hashCode() 메소드의 경우 절대로 상수를 리턴해서는 안된다는 점에 유의할 것. hashCode()equals()의 올바른 사용법에 관한 자세한 설명을 보려면 Joshua Bloch가 저술한 Effective Java Programming Language Guide(영문)의 8항을 참조할 것.

J2SE 5.0에 새로 추가된 주석의 마지막 @SuppressWarnings는 그 중에서도 가장 흥미롭다고 할 수 있다. 이 주석은 일반적으로 경고하는 내용을 경고하지 말도록 컴파일러에게 지시하는데, 경고는 일종의 범주에 속하므로 주석에 대해 어떤 종류의 경고를 금지할 것인지 지시해야 한다. javac 컴파일러는 all, deprecation, unchecked, fallthrough, path, serial, finally 등 7개의 금지 옵션을 정의한다. (언어 스펙은 이 중에서 두 가지-- deprecation과 unchecked--만을 정의함.)

예시를 위해 fallthrough 옵션 금지사항에 대해 살펴보기로 한다. 먼저 아래의 클래스를 사용해보자. 클래스에는 switch 문의 각 케이스에 대한 break 문이 빠져 있다는 점에 유의할 것.

  public class Fall {
public static void main(String args[]) {
int i = args.length;
switch (i) {
case 0: System.out.println("0");
case 1: System.out.println("1");
case 2: System.out.println("2");
case 3: System.out.println("3");
default: System.out.println("Default");
}
}
}

javac으로 클래스를 컴파일하면 단순히 .class 파일만 생성되고 경고는 표시되지 않는다는 것을 알 수 있다.

javac Fall.java

컴파일러가 fall through하는(즉, 하나 이상의 break 문이 빠져 있는) switch 문에 관해 경고하기를 원할 경우에는 -Xlint:fallthrough 옵션으로 컴파일한다.

javac -Xlint:fallthrough Fall.java

그러면 아래의 경고문이 생성된다.

Fall.java:6: warning: [fallthrough] possible fall-through into case
case 1: System.out.println("1");
^
Fall.java:7: warning: [fallthrough] possible fall-through into case
case 2: System.out.println("2");
^
Fall.java:8: warning: [fallthrough] possible fall-through into case
case 3: System.out.println("3");
^
Fall.java:9: warning: [fallthrough] possible fall-through into case
default : System.out.println("Default");
^
4 warnings

그러나 switch 문에 각 케이스에 대한 break 문이 빠져 있다는 사실을 무시하고 싶은 경우에는 어떻게 해야 할까? 바로 이 때 @SuppressWarnings 주석이 필요하다. main() 메소드 선언 앞에 다음 행을 추가하면,

@SuppressWarnings("fallthrough")

-Xlint:fallthrough 옵션으로 클래스를 컴파일할 경우,

   javac -Xlint:fallthrough Fall.java

.class 파일만 생성되고 경고문은 표시되지 않는다.

@SuppressWarnings 주석은 또한 컬렉션 엘리먼트의 데이터 유형을 지정하지 않고 컬렉션을 사용할 경우에 표시되는 것과 같은 그 밖의 경고를 금지하는 데도 사용될 수 있다. 그러나 단순히 컴파일 시간 경고를 피하기 위해서 @SuppressWarnings 주석을 사용해서는 안 된다. 제네릭을 염두에 두지 않고 구축된 라이브러리를 사용할 때처럼, 금지되지 않은 경고가 불가피한 경우에 이 주석을 사용하도록 한다.

이것으로 내장 주석 기능에 관한 설명은 마무리하고, 마지막으로 (인자를 포함한) 주석은 통상적으로 하나의 행에서 독자적으로 지정된다는 점에 유의하기 바란다.

J2SE 5.0에 이미 정의되어 있는 주석을 사용하는 것 보다 사용자가 직접 주석을 정의하는 경우에는 더 많은 기능들을 활용할 수 있다. 주석 정의에 관한 자세한 내용은 Annotations(영문)를 참조하기 바란다.

<출처 - http://kr.sun.com/developers/techtips/2006/c0713.html >

반응형
J2SE 6.0 1.5(한) 1.5(영)
J2EE 5.0 1.4
SERVLET 2.5 2.4
JSP 2.0
WEB DTD 2.3 2.4
HTML 4.1
CSS2

출처 : http://www.jakartaproject.com
반응형
* 강좌를 시작하기전에.....

JDBC를 이용하여 DB를 엑세스해서 프로그래밍을 하는 방법의 기초에 대해서 강의합니다.
따라서 이번 강좌는 JDBC를 처음 사용하고 하는 분들에게 적합한 강좌입니다.


* JDBC 프로그래밍의 5 단계

  1. DriverManager에 해당 DBMS Driver를 등록
  2. 해당 Driver로 부터 Connection 객체 획득
  3. Connection 객체로부터 Statement 객체 획득
  4. Statement의 method를 이용하여 SQL실행
  5. ResultSet 으로 받아서 처리(executeUpdate 의 경우엔 제외)
  6. 객체 close() (ResultSet, Statement, Connection)
그럼 각 단계에 대해서 자세히 알아 보도록 하겠습니다.


* 1. DriverManager에 해당 DBMS Driver를 등록

Driver를 DriverManager에 등록하는 방법은 3가지가 있습니다.
Class.forName() 메소드를 이용하는 방법, Driver객체를 생성하는 방법, registerDriver() 메소드를 이용하는 방법 이렇게 3가지의 방법이 있지만 가장 일반적으로 사용하고 쉬운 방법인 Class.forName() 메소드를 이용하는 방법에 대해서만 설명하도록 하겠습니다.

해당 JDBC 드라이버를 등록하려면 당연히 JDBC 드라이버가 필요합니다. 해당 데이터베이스의 드라이버 파일을 먼저 클래스 패스에 잡으시기 바랍니다. 오라클의 경우는 www.oracle.com 에서 다운로드 받을수도 있고 오라클 설치시 같이 설치 되므로 오라클 디렉토리를 잘 살펴 보기 바랍니다.

다음으로 mySQL의 경우는 http://sourceforge.net/project/showfiles.php?group_id=15923으로 가셔서 다운받으시기 바랍니다.

이제 JDBC 드라이버를 DriverManager에 등록하는 방법에 대해서 알아 보겠습니다.

Class.forName("org.gjt.mm.mysql.Driver"); -> mySQL 의 경우
Class.forName("oracle.jdbc.driver.OracleDriver"); -> Oracle thin 드라이버의 경우

Class 는 java.lang 패키지에 있는 클래스 입니다. 자세한 내용이 궁금하신 분은 api문서를 참고 하시구요... forName 메소드에 parameter로 쓰인 String은 당연히 DBMS의 종류에 따라 틀려지겠지요? 어째든 위의 메소를 실행시키고나면 자동으로 드라이버 객체가 생성이되고, 자신을 DriverManager에 등록하는 처리가 이루어지게 됩니다.


* 2. 해당 Driver로 부터 Connection 객체 획득

Connection이라는 것은 DBMS에 연결된 session을 의미 합니다. Connection 객체를 획득하는 방법은 DriverManager의 getConnection() 메소드를 이용하면 되는데 그 형식은 다음과 같습니다.

Connection con=DriverManager.getConnection(String jdbcURL,String id,String password);
			
getConnection 메소드는 몇가지로 오버로딩되어 있으니 궁금하신분은 API문서를 참고 하십시요..

다음과 같은 형식으로 사용합니다.


String url="jdbc:mysql://localhost/dbname";  // dbname에는 사용하는 database 이름 

Connection con=DriverManager(url,"root","1234");  // root 계정, 패스워드는 1234 


* 3. Connection 객체로 부터 Statement 객체 획득

하나의 Connection으로 부터 여러개의 Statement의 생성이 가능합니다. 이후에 Statement로 부터 SQL을 실행하게 됩니다. 아래의 그림을 보시면 이해가 되리라 생각됩니다.



Connection con=DriverManager.getConnection("jdbc:mysql://localhost/dbname","root","password");
  
Statement st1=con.createStatement();

ResultSet rs1=st1.executeQuery("select * form names");

Statement st2=con.createStatement();

ResultSet rs2=st2.executeQuery("select * form users");

Statement st3=con.createStatement(); 

ResultSet rs3=st3.executeQuery("select * form emails");
따라서 위와 같이 사용이 가능하죠. Statement에는 3가지 종류가 있는데 그중 첫번째가 지금 사용한 Statement 입니다. 두번째로 PreparedStatement 가 있고 마지막으로 CallableStatement가 있다. 그중 CallableStatement는 저장 프로시져 (stored procedure)를 호출하는데 사용되는 것인데, 여기에서는 초급강좌인 만큼 다루지 않습니다.
PreparedStatement는 다음과 같이 사용합니다.

Connection con=DriverManager.getConnection("jdbc:mysql://localhost/dbname","root","password");
  
PreparedStatement ps=con.prepareStatement("update juso set si=? where zip=?); // 밑줄친 부분 주의

ps.setString(1,"Seoul");  // 첫번재 ? 이 1번이 됩니다.

ps.setString(2,request.getParameter("zip")); // 두번째 " ? "

// setString 말고도, setDate, setArray, setCharacterStream등 여러가지가 있습니다.

ps.executeUpdate();
위와같은 쿼리문(값이 변하는)을 Statement로 처리한다면 PreparedStatement 문에 비해서 String 객체를 더 많이 생성해야 해야 하고, PreparedStatement사용시에는 DB에서의 처리시에도(특히 오라클에서) 쿼리문이 캐싱되어 보다 높은 퍼포먼스를 제공하게 됩니다.


* 4. Statement의 메소드를 이용해서 SQL문의 실행

Statement 클래스에서는 쿼리문의 실행을 위해서 몇가지 메소드를 제공하는데, executeQuery()와 executeUpdate() 두개의 메소드만 알면 충분히 활용이 가능합니다.

ResultSet rs=stmt.executeQuery("select * from users");
			
위와 같은 방식으로 사용되며 executeQuery()는 "select"문을 사용할때에만 사용되는 것이죠. 실행 결과는 ResultSet에 저장되며 저장된 정보의 처리 방법은 아래 에서 다루도록 하겠습니다.
또다른 메소드인 executeUpdate()는 select 외에 update,delete,insert 등의 쿼리문을 사용할때 이용되어 집니다. 다음과 같이 사용하시면 됩니다.
stmt.executeUpdate("insert into users(id,password) values('ab','bc')");
			


* 5. ResultSet으로 받아 서 처리하기

위에서 설명했다 시피 executeQuery()를 실행하면 ResultSet 타입의 객체를 반환합니다. 이 객체는 실행된 쿼리문의 결과 같을 가지고 있는데 ResultSet의 몇가지 메소드를 이용하면 ResultSet에 저장된 정보를 사용할수 있습니다. select쿼리를 실행 했으므로 하나이상의 row를 지니고 있는데.. 현재 row에서 다음 row로 넘기려면 rs.next() 와 같이 사용하면 됩니다.(첫번째 row도 next()를 사용해야 합니다.)

각 row가 선택이 되었으면 각컬럼의 데이터를 불러 오면 되는데, 두가지의 방법이 있습니다.
첫번째방법은

String name=rs.getString(1); (name에 해당하는 항목의 첫번재 컬럼에 있을경우)

이와같이 데이터의 컬럼 위치로 검색합니다. getString의 String 에는 Int,Double, 등과 같은 자료형을 사용하면 해당 자료형에 맞는 데이터를 리턴하여 줍니다. (getString(), getInt(), getDouble() 등등....)
또다른 방법은 컬럼의 이름을 직접 서술하는 방법인데, 다음과 같이 사용됩니다.

String name=rs.getString("name");

이러게 하면 rs ResultSet에 저장되 었던 name컬럼의 데이터가 name에 저장됩니다.


* 6. 객체 close() 하기 (ResultSet, Statement, Connection)

Java는 메모리 관리를 따로 하지 않아도 자체적으로 garbage collection 기능이 있어 사용되지 않는 객체는 자동적으로 처리된다. 그러나, Sun은 JDBC 드라이버와 같이 외부 지원되는 드라이버에 대해서는 생성된 객체를 코드 내에서 소멸시키도록 권장하고 있다. JDBC API는 이를 위해 close() 메쏘드를 제공하는데, close() 메쏘드를 사용해야 할 클래스는 Connection, Statement, PreparedStatement, ResultSet 등이다. 따라서, 데이터베이스에 접속하여 SQL 구문을 모두 수행했다면 다음처럼 close() 메쏘드를 사용하여 객체를 모두 소멸시키도록 한다. - webdox

rs.close();
st.close();
con.close();

위와 같이 사용하며, con (Connection) 과 st (Statement or PreparedStatement)는 반드시 close 되어야 합니다. 위에서 설명한 바와 같이 Statement 와 ResultSet 은 1:1 대응 이기 때문에 ResultSet 은 Statement 가 소멸되면 자동으로 소멸됩니다. (아예 처리를 하지 말라는 얘기는 아닙니다. -안전을 위해서)


* 그리고....

대부분의 Servlet/JSP 웹 애플리케이션 에서는 Connection 을 Pool 로서 관리를 하는데, 이는 매 요청시 마다 데이터베이스에 접속하고 해제하는 일을 수행하는데 있어 발생하는 부하를 줄여 주고, 일정 갯수 이상의 커넥션수를 넘지 않도록 유지시켜 주기 위해서 입니다.
이러한 Connection Pool 은 몇가지 공개된것도 있고 직접 제작할수도 있으나, 여기 에서는 생략하도록 하겠습니다.

<출처- http://www.aboutjsp.com/lec/jdbc.jsp >

반응형
Easy Eclipse WebDav라는 플러그인이 있는데,
FTP에 자신의 프로젝트를 디플로이 할 수 있게끔 해주는 이클립스 플러그인이다.
http://www.easyeclipse.org/site/plugins/eclipse-webdav-ftp.html
여기 들어가면 간단한 소개글과 다운로드 링크를 볼 수 있다. 실제 다운로드는 여기에서.

플러그인을 다운로드 하고 설치 파일을 실행시켜 다음으로 넘어가면 EasyEclipse가 먼저 설치되어야 세이프하다는 경고가 나오는데, 일단 귀찮으니 무시하기로 하고.. 깔아본다. 폴더 설정은 이클립스가 설치되어 있는(eclipse.exe 파일이 위치하고 있는) 곳으로 지정한다.


EasyEclipse 설치하려면 다운 받아야 하는데, 최소한 170MB란 말야.. -_-;; 시간 없어!! ㅋㅋ; 암튼 일단 설치를 마무리하고 이클립스를 실행하고 Show Views 메뉴를 실행하면 아래와 같이 Webdav 뷰가 추가된 것을 볼 수 있다.


뷰를 띄우면 하단에 뷰가 나타나는데, 아무튼 그쪽에 가서 오른쪽 버튼을 누르면 아래 그림과 같이 대상 사이트를 추가할 수 있는 메뉴가 생긴다. 일단 누르고 보자.

그러면 대상 사이트를 지정하는게 나오는데, 나 같은 경우는 FTP에 디플로이 할 것이므로 FTP를 선택하고 아래 그림과 비슷하게 설정해 준다. 아이피 주소와 포트, 그리고 이미 FTP 계정이 있으므로 자신의 계정을 입력한다.

이제 아래와 같이 자신의 FTP 계정의 내용이 나타난다.

일단 이렇게 추가해 놓으면 이제 거의 끝.
프로젝트로 돌아가서 File -> Export 메뉴를 실행하면, 가장 하단 Other에 아래 그림과 같이 FTP가 추가된 것을 볼 수 있다.

그리고 나서 다음으로 넘어가면 어떤 프로젝트나 폴더를 Export 할지 선택하는 창이 나오고.. 원하는 내용을 선택하면 된다. Select Site 창에서는 아까 추가해 놓은 FTP 사이트를 이용할 수도 있고, 여기서 바로 사이트를 또 추가할 수도 있다. Select Remote Folder에서는 말 그대로 FTP 계정의 어느 폴더에 디플로이할지를 선택하는 창이다.
Select Resource 창에서는 어떤 파일들을 올릴 것인가를 선택하는 것인데, 그곳에서 바로 파일의 내용을 확인할 수도 있다. 아래 그림과 같이.

그 다음 Finish 버튼을 누르게 되면 FTP 서버의 자신의 계정으로 파일들의 디플로이가 진행된다.
마지막으로 Site Explorer를 보면 파일들이 디플로이 된 것을 확인할 수 있다.

Synchronize 기능도 이용할 수 있는데, 먼저 그 기능을 이용하려면 Synchronize 뷰를 연다. 아래 그림과 같이 Synchronize 뷰가 나타나면 그림과 같이 메뉴를 눌러 Synchronize 메뉴를 선택한다.

그러면 아래 그림과 같이 Synchronize 대상에 FTP가 새로이 추가된 것을 볼 수 있다.

다음을 눌러 아까 추가해 둔 FTP 계정을 선택하고 Finish를 하면 FTP 계정에 대한 Synchronize가 수행된다. 이렇게만 해놓으면 FTP 계정에 대한 디플로이와 Synchronize가 상당히 편해질 것이다... :)
반응형
유용한 즐겨찾기 모음 ======================================================================================= JDK 1.4 한글 도움말(javastudy) : http://www.javastudy.co.kr/api/api1.4/ JDK 1.4 한글 API(forcert) : http://www.forcert.com/programming/api/j2se/1.4.0k/index.html servlet api : http://jakarta.apache.org/tomcat/tomcat-4.1-doc/servletapi/index.html - 2.3 http://jakarta.apache.org/tomcat/tomcat-5.0-doc/servletapi/index.html - 2.4 jsp2.0 api : http://jakarta.apache.org/tomcat/tomcat-5.0-doc/jspapi/index.html - 2.0 J2EE 한글 도움말 : http://forcert.com/programming/api/j2ee/1.3.0k/ J2EE 1.4 튜토리얼 : http://java.sun.com/j2ee/1.4/docs/tutorial/doc/index.html JSTL 1.1 : http://java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/index.html Spring API : http://www.springframework.org/docs/api/index.html Hibernate API : http://www.hibernate.org/hib_docs/api/ 자바 패키지별 예제(영문) : http://sangchin.byus.net/FlashHelp/Almanac.htm ================================================================================== 자바 싸이트 ----------------------------------------------------------------------------------- 자바스터디 : http://www.javastudy.co.kr/ (강좌 정리) 자바누리 : http://www.javanuri.com/ 자바랜드 : http://www.javaland.co.kr/ 소설같은 자바 : http://www.jabook.org/ (책 한권) 자바서비스넷 : http://www.javaservice.net/ (중고급 정보) 김상욱의 개발자side : http://50001.com/ (소스 등) 종스클럽닷컴: http://www.jongsclub.com/ JLAB : http://www.jlab.net/ OKJSP : http://www.okjsp.pe.kr/ 제이스톰 : www.jstorm.pe.kr/ 자바 튜토리알(영어) : http://java.sun.com/docs/books/tutorial/index.html 스윙 컴포넌트 예제(영어) : http://java.sun.com/docs/books/tutorial/uiswing/components/components.html MS SQL2000 JDBC 드라이버 다운로드 : http://www.microsoft.com/korea/download/server.asp 자카르타 프로젝트 한글화 : http://jakarta.apache-korea.org/ 자바지기 : http://wiki.javajigi.net/ 자바지기 eclipse 강좌 : http://wiki.javajigi.net/display/IDE/Eclipse 자바지기 struts 강좌 : http://wiki.javajigi.net/display/FRAMEWORK/Home 이클립시안 : http://eclipsians.net/ 자바 카페 : http://www.javacafe.or.kr/ 자바 API 예제(영어) : http://javaalmanac.com/egs/ Sun Korea Developer Network : http://kr.sun.com/developers/ IBM Java 입문서 : http://www-128.ibm.com/developerworks/kr/java/newto/ ================================================================================== JSP 싸이트 ----------------------------------------------------------------------------------- JSP 스쿨 : http://www.jspschool.com/ (정리 잘됨, 자료실 Good) OKJSP : http://www.okjsp.pe.kr/ (종류별로 정리잘된 싸이트) JSP스터디 : http://www.jspstudy.co.kr/ (오른쪽 메뉴중 lecture list 강좌보면 좋다) AboutJSP : http://aboutjsp.com/ (강좌, 팁, QnA 등) 자북 (소설같은 JSP) : http://www.jabook.org/ (책 소설같은 JSP의 1부, 2부 있음) 까오기 : http://www.kkaok.pe.kr/ (여러 유영한 팁들) 더블 아이큐 : http://www.doubleiq.pe.kr/ (정리된 강좌와 QnA 등 ) 김호 JSP : http://www.kimho.pe.kr/jsp/index.html ================================================================================== J2EE 싸이트 ----------------------------------------------------------------------------------- J2EE 스터디 : http://www.j2eestudy.co.kr/ 웹로직 관련 문서 등 있는 싸이트 : http://www.itadvisor.co.kr/ ======================================================================================== 홈페이지 관련 싸이트 ----------------------------------------------------------------------------------- 태그매니아 : http://www.tagmania.net/ 야자바 HTML : http://www.yajava.com/shop/mart7/inc.php?inc=content_main/html HTML's Land : http://ilovehansem.com/~html/ ib96 동영상 무료 회원 HTML 강좌 : http://htm.ib96.com/ 태그조아 : http://www.tag.zoa.to/ 모노카페 : http://my.dreamwiz.com/monocafe/ 김덕현 : http://my.dreamwiz.com/kim0057/ 송파나루터 : http://www.studyho.com/ 트리오 : http://trio.co.kr/ 태그대학 : http://www.tag4u.wo.to/ 송현건 : http://home.introcom.net/~gosoo99/ 스타트 홈페이지 : http://www.starthomepage.com/index.jsp 태그야 놀자 : http://www.tagyanolja.com/ 컴으로 허자허자(다음카페) : http://cafe.daum.net/herjaherja 태그 연습장(컴으로 허자허자) : http://www.herjaherja.com/bonus/tag.htm 태그 연습장(샐리디카) : http://myhome.naver.com/sallynice/blog/sallyedit.htm ======================================================================================== 자바스크립트 관련 싸이트 ----------------------------------------------------------------------------------- 자바스크립트 정리 Good : http://koxo.com/lang/js/ 자바스크립트 인터넷 강의 : http://javascript.ubedu.com/ CGI & JavaScript : http://www.cginjs.com/ JS Guide : http://jsguide.net/ver2/ 이용석의 자바스크립트 : http://user.chollian.net/~spacekan/ 블루 비 : http://www.blueb.co.kr/ 자바방 : http://javabang.net/ 학꺼니 홈 : http://user.chollian.net/~chk012/frame.html 까오기(왼쪽 developer 메뉴의 javascript 클릭) : http://www.kkaok.pe.kr/ 해피스크립트 : http://www.happyscript.com/ 자스코 (유료싸이트) : http://www.jasko.co.kr/ 영문 싸이트 : http://www.devguru.com/Technologies/ecmascript/quickref/javascript_index.html 자바스크립트 정리(영어 사이트) : http://www.javascripttoolbox.com/bestpractices/ ======================================================================================== 개발자 참고 싸이트 ----------------------------------------------------------------------------------- 웹 개발자 가이드 : http://www.mozilla.or.kr/docs/web-developer/standard/ MSDN 링크 : http://msdn.microsoft.com/library/default.asp ======================================================================================= 온라인 해킹/바이러스 진단 및 치료 프로그램(국민은행 제공, 하우리 백신) : http://update.inca.co.kr/kookmin/livecall/kook_livecall.html ======================================================================================= ====================================================================================== 기타 관련 다운로드 싸이트(JDK, MySQL, 톰캣 등) ====================================================================================== JDK 1.4.x 자바 Development Kit http://java.sun.com 톰캣 : http://tomcat.apache.org/ --------------------------------------------------------------------------------------- MySQL MySQL 데이터베이스 http://mysql.com 한국 MySQL : http://mysqlkorea.co.kr/ MySQL Connector/J (JDBC Driver for MySQL) http://dev.mysql.com/downloads/connector/ MySQL-Front : http://www.mysqlfront.de/download.html SQLyog(MySQL툴) 다운 : http://www.webyog.com/sqlyog/thanks.php --------------------------------------------------------------------------------------- 오라클 9i 링크 : http://www.oracle.com/technology/software/products/oracle9i/index.html 오라클 다운 : http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.zip http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk2.zip http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk3.zip ================================================================================== All In One Eclipse 이클립스 다운로드 ---------------------------------------------------------------------------------- 일본어 : http://aioec.sourceforge.jp/cgi-bin/wiki.cgi 영어 : http://aioec.sourceforge.jp/cgi-bin/wiki.cgi?page=english%5Ftop ================================================================================== 이클립스 eclipse 3.1.1 다운로드 정리 WTP 다운 : http://www.eclipse.org/webtools/ 이클립스 플러그인 순위 : http://eclipse-plugins.info/eclipse/ratings_overview.jsp 한국의 미러 싸이트 : http://eclipse.areum.biz/downloads/ (톰캣 개발시 유용한 플러그인) 톰캣 플러그인 : http://www.sysdeo.com/sysdeo/eclipse/tomcatplugin 직접 다운 : http://www.sysdeo.com/sysdeo/content/download/393/4930/file/tomcatPluginV31.zip tomcatPluginV31.zip 다운 받아서 압축 해제해서 C:\eclipse\plugins 에 복사 ================================================================================== 자카르타 Ant 한글 싸이트 : http://ant.apache-korea.org/ 자카르타 Ant 다운로드 : http://ant.apache.org/bindownload.cgi 다운로드 리스트 : http://archive.apache.org/dist/ant/binaries/ ant 1.5.4 다운 로드 : http://archive.apache.org/dist/ant/binaries/apache-ant-1.5.4-bin.zip ant 1.6.5 다운 로드 : http://ftp.apache-kr.org/ant/binaries/apache-ant-1.6.5-bin.zip ---------------------------------------------------------------------------------------- 자바스크립트 에디터 : http://sourceforge.net/projects/jseditor http://heanet.dl.sourceforge.net/sourceforge/jseditor/net.sf.wdte.js_0.0.9b.zip CSS 에디터 : http://www.vasanthdharmaraj.com/Software.aspx?=csseditor JSEclipse : http://www.interaktonline.com/downloads/eclipse/100/JSEclipse_1.2.1.zip AnyEdit : http://andrei.gmxhome.de/anyedit/links.html --------------------------------------------------------------------------------------- (스트럿츠 개발시 유용한 플러그인) EasyStruts : eclipse 에서 스트럿츠 개발시 사용하는 플러그인. 1. 다운로드 : 주소 http://sourceforge.net/projects/easystruts 2. 직접 다운로드 http://prdownloads.sourceforge.net/easystruts/org.easystruts.eclipse_0.6.4.zip?download --------------------------------------------------------------------------------------- (스트럿츠) 1. 스트럿츠 다운 http://archive.apache.org/dist/struts/ 2. 스트럿츠 직접 다운로드 http://ftp.apache-kr.org/struts/binaries/struts-1.2.7.zip http://mirror.apache.or.kr/jakarta/struts/binaries/jakarta-struts-1.1.zip (ANT 다운 로드) http://www.apache.org/dist/ant/ --------------------------------------------------------------------------------------- (스트럿츠 참고 싸이트) 자바 프레임워크(네이버 스트럿츠 카페) : http://cafe.naver.com/deve.cafe ======================================================================================= MyClipse 동영상 자료 : http://www.myeclipseide.com/images/tutorials/webprojectdemo.htm ======================================================================================= 우키의 블로그 : http://www.jaewook.net/ 한글패치 : http://lang.playxp.com/ 웹마 : http://www.mdiwebma.com/ jwBrowser : http://samba.ssyy.net/ 구글 : http://www.google.co.kr 심파일 : http://simfile.chol.com/ 이클립스 : http://www.eclipse.org/ ie toy, ad-free : http://loser.miniwini.com/tt/ 자료 : http://baechul.com/cgi/technote/main.cgi?board=pds 브피피닷넷 : http://vbpp.net/ 자료 소스 : http://semtle.cuk.ac.kr/bbs/list.php?id=pds 웹빌드 : http://www.webbuild.co.kr 넷탑 : http://www.nettop.pe.kr 파워빌더 유저 가이드 : http://www.pbuser.com/main.html 미친감자 : http://mazinga.egloos.com/ EditPlus 자바 컴파일 설정 : http://www.javacafe.or.kr/lecture/cafeLecture/tool/EditPlusSetting/EditPlusSetting.htm 구글 툴바 : http://toolbar.google.com/T3/intl/ko/index_ie.php ================================================================================== PDA 싸이트 ----------------------------------------------------------------------------------- 투데이스피피시 : http://www.todaysppc.com PDA 프로그램 모음 싸이트 : http://www.fingertool.com/ 포인트피디에이 : http://www.pointpda.com 코리아닷컴 피디에이 : http://pda.korea.com/ 정리 잘된 싸이트 : http://www.114pda.com/ 무료 PDA 소프트웨어(영어) : http://www.freewareppc.com 클리앙 : http://www.clien.net/ PDA용 GPS : http://www.freenavi.co.kr/ PDA용 GPS : http://shop.free-gps.com/ RW6100 드라이버 다운로드 : http://h50177.www5.hp.com/support/FA294PA/drivers/os_2045.html RW6100 메뉴얼 : http://h50201.www5.hp.com/manual/index.asp MissPDA : http://www.misspda.com/ 아이핸디고(외국의 아방고와 비슷한 한국판 사이트) : http://www.ihandygo.com/ 마이폴더 PDA 자료실 : http://pda.myfolder.net/ PDA용 뉴스 싸이트 정리 : http://clip.bakion.com/ PPC용 프로그램 개발(영어) : http://www.codeppc.com/ ================================================================================== XML 싸이트 ----------------------------------------------------------------------------------- 안항준의 XML : http://my.netian.com/~aphise/ XML 스터디 : http://www.xmlstudy.co.kr/ 김종민의 XML : http://xml.80port.net/ 자바지기 : http://www.javajigi.net/ XML Developer Group : http://xml.geonji.co.kr/ Rapsodie's XML Resource : http://user.chollian.net/~rapsodie/main.html 용어사전과 XML : http://trio.co.kr/ HowXML : http://www.howxml.com/ 군산대학교 XML 연구실 : http://xmlab.kunsan.ac.kr/ XML 강좌 링크 : http://www.howon.ac.kr/~ktlim/lecture/xml/xml-index.htm 코리아 인터넷 XML 강좌 : http://korea.internet.com/channel/index.asp?cid=193 XML 홈페이지 만들기 강의 자료 : http://muse.inchon.ac.kr/jschae/internet_xml.html XML 강의 자료 : http://kuic.kyonggi.ac.kr/~ejlee/xml/#course-note XML 강의 : http://hyejeon.ac.kr/%7Ekrkuki/xmlq_1.html 자바지기 XML 강좌 : http://wiki.javajigi.net/display/XML/Home ================================================================================== 기타 싸이트 ----------------------------------------------------------------------------------- 소스들 : http://bluebild.byus.net/ 구글툴바 : http://toolbar.google.com/intl/ko/index_ie.php 개인 이글루 싸이트(프로그래밍) : http://kwon37xi.egloos.com/ 자카르타프로젝트(?) : http://www.jakartaproject.com/ TDD : http://wiki.tdd.or.kr/wiki.py CSS : http://ilmol.com/wp/css DB Desiner 4 : http://www.fabforce.net/ manwal 블로그 : http://blog.etnews.co.kr/html/blog_home.php?bid=manwal 데이타베이스 사랑 넷 : http://database.sarang.net/ Xrath 블로그 : http://xrath.com/blog/index.php?category=Development 루비 : http://forum.rubykr.org/ 루비 홈 : http://www.ruby-lang.org/en/ RDE : http://homepage2.nifty.com/sakazuki/rde_e.html MMF 플레이어 : http://www.playersparadise.net/download/ 누룽지 : http://www.nulunggi.pe.kr/ JavaRSS : http://javarss.pe.kr/ ======================================================================================== OKJSP 동영상 강좌 : http://www.okjsp.pe.kr/lecture/viewlet/ 이클립스 톰캣 디버그 : http://www.okjsp.pe.kr/lecture/viewlet/okjsp2005/10_lomboz_tomcat_debug.html Xper 위키 : http://xper.org/wiki/xp/ 자카르타 한글 번역 : http://jakarta.apache-korea.org/ 이클립시안 : http://eclipsians.net/ 국현님 싸이트 : http://goodhyun.com/ Jazz Virtual Machine : http://www.jazzvm.net/ 오라클자바 : http://www.oraclejava.co.kr/ JavaJiGi 강좌 1. Eclipse 강좌 2. Struts 강좌 3. XML 강좌 빌크 블루엣 인터내셔널에서 운영하는 작은 커뮤니티 : http://www.bilc.co.kr/ 구글 바로 가입하기 : http://www.bytetest.com/ larky : http://larky.biz/blog/ mabaji " http://tong.nate.com/mabaji J2EE Study : http://www.j2eestudy.co.kr 한국 JBoss 사용자 그룹 : http://www.krjbug.com/ 행복한고니 블로그 : http://mygony.com/tt/index.php 주홍넷 : http://www.joohong.net/ (게임기획) NT FAQ : http://www.ntfaq.co.kr/ 해킹 : http://www.ganseo.com/zboard/new_center.php ======================================================================================== 데이타베이스 관련 싸이트 ======================================================================================== 오라클 강좌 : http://oracleclub.com/ 오라클용 무료 DB 툴 (DBA Master 2000) : http://www.dbany.com/ 데이타베이스 정보 : http://www.databaser.net/ Korea Oracle Use Group : http://www.koug.net/ 데이터베이스 벤더간 함수, 문법 비교 : http://www.crossdb.com/dbknowledgebase/differencestable.html 데이타베이스 : http://home.ditco.com/~angel/Advanced/advanced.html 무료 오라클 툴(SmartSQL) : http://smartsql.hubweb.net/ ======================================================================================== 인터넷 서점 ======================================================================================== 도서가격 비교 (마이마진): http://book.mm.co.kr/ 강컴 : http://www.kangcom.com 네이버 책 : http://book.naver.com/ 리브로 : http://www.libro.co.kr/books/index.asp?mall_id=1 알라딘 : http://www.aladdin.co.kr/home/wbookmain.aspx 모닝365 : http://www.morning365.com/ 반디앤루니스 : http://www.bandibook.com/ yes24 : http://www.yes24.com 교보 : http://www.kyobobook.co.kr/ ======================================================================================== 파이썬 관련 싸이트 ======================================================================================== 파이썬 문서고 : http://home.paran.com/johnsonj/ Python : http://www.python.org/ 왕초보를 위한 파이썬 : http://turing.cafe24.com/ ======================================================================================== C 컴파일러 다운로드 ======================================================================================== C++ 다운로드 : http://turboc.borlandforum.com/impboard/attach/0000043200/tc++win31.zip MS Visual C++ Toolkit 2003 : http://msdn.microsoft.com/visualc/vctoolkit2003/ 볼랜드 BC++ 컴파일러 : http://www.borland.com/products/downloads/download_cbuilder.html 아래의 Compiler 라고 써있는 링크를 클릭하면 다운로드 받을 수 있음. Compiler Windows 5.5 08/24/2000 8.7 Mb 무료 C++ 컴파일러 DevC++ : http://turboc.borlandforum.com/impboard/attach/0000071056/devcpp4990setup.exe ======================================================================================== 프로그램 소스 모음 링크 ======================================================================================== 생각하며 배우는 C++ 소스 링크 : http://www.hanbitbook.co.kr/example/1277/ 알기쉽게 풀어쓴 웹로직과 EJB 소스 : http://www.hanbitbook.co.kr/exam/1278 자바5.0 프로그래밍 소스(한빛미디어) : http://hanbitbook.co.kr/example/1377/ 인포북 소스 : http://www.infopub.co.kr/info/pds/group_pds/bbs.asp 정보문화사 소스 : http://www.infopub.co.kr/jungbo/pds/group_pds/bbs.asp 영진 프로그래밍 소스 링크 : tp://board3.youngjin.com/bbs/List_new.asp?bbsidx=135 대림 자료실 : tp://www.drbook.co.kr/pds/?pds=1-1 한빛 자료실 : tp://www.hanbitbook.co.kr/old_board/arumari2.html?id=data&n=&s=&query=&t=&kind=&page=0 한빛 미디어 소스 : http://www.hanbitbook.co.kr/exam/ ======================================================================================== 크랙 링크 ======================================================================================== http://www.astalavista.box.sk/ http://www.crackdb.com/ ======================================================================================== 지도 링크 ======================================================================================== 네이버 지도 : http://local.naver.com/navermap_browser/?mode=1&init=1 엠파스 지도 : http://map.empas.com/ 지도 찾기 : http://www.speednavi.co.kr/searchmap/ 지하철 노선도 : http://www.smrt.co.kr/cyberstation/cyberstation.jsp?sv=1&skind=1&goline=undefined ======================================================================================== 포토샾 ======================================================================================== http://www.photoshopq.com/ ======================================================================================== 기타 ======================================================================================== 폭 맞춰 출력하기 : http://www.visiontech.ltd.uk/ (설명 : 인터넷 익스플로러에서 프린트할 때 내용이 폭에 안 맞아 짤릴때 사용하면 좋음) (방법 : 클릭해서 들어가서 콘트롤 설치한 후 상단 표준단추에 "빨간 W"로 프린트) 테이블은 이제 그만 쉬어야할 때 1 : http://ilmol.com/wp/2005/06/09/25/ 테이블은 이제 그만 쉬어야할 때 2 : http://ilmol.com/wp/2005/08/15/110/ 웹에서 테이블을 DIV로 변경 : http://www.qindex.info/Q_drctry/webtools/StylingTable.asp 레이아웃을 위해 테이블 사용이 잘못된 이유:문제의 원인, 해결방안 : http://softwant.com/standards/index.php ======================================================================================== 컴퓨터 싸게 사기 ======================================================================================== http://www.pops4u.co.kr/ http://www.assacom.com/ ======================================================================================== 컴퓨터 싸게 사기 ======================================================================================== 하드웨어 정보 보여주는 유틸 (everest ) 램 종류와 속도가 궁금해서 찾아봤음 : http://file.naver.com/cgi-bin/simSearchPds.cgi?start=&number=&cat=99&q=everest&w=t&opt=0&x=38&y=13 ======================================================================================== 기타 유용한 정보(?) 잡학지식 ======================================================================================== 휴면 계좌 통합 조회 : http://www.sleepmoney.or.kr/default_cust.jsp 중국사람이 만든 웹 OS ^^ : http://www.pc2n.com/staticos/index.html ======================================================================================== 블로그 ======================================================================================== 네이버 블로그 http://blog.naver.com/free7sh http://blog.naver.com/swinter8 http://blog.naver.com/drods http://blog.naver.com/mmfcom http://blog.naver.com/imcho57 http://blog.naver.com/khd7138 http://blog.naver.com/julymorning4 http://blog.naver.com/geerark 엠파스 블로그 http://blog.empas.com/ahnyounghoe/ 이글루스 블로그 http://kwon37xi.egloos.com/ ======================================================================================= Eclipse Article Eclipse 시작 Eclipse 시작하기 : JDK 설치에서부터 Eclipse 다운로드등 Eclipse를 처음 시작하는 개발자들이 알아야하는 내용에 대하여 다루고 있다. Eclipse에 새로운 플러그인 설치하기 : Eclipse에 새로운 플러그인을 추가하는 방법에 대하여 두가지로 나누어 살펴본다. 또한 새로운 플러그인을 찾을 수 있는 방법에 대해서도 다룬다. Eclipse 사용시 알아두면 좋은 유용한 단축키 모음 Eclipse 강좌 Eclipse 사용을 위한 동영상 강좌 : Eclipse 3.1이 배포되면서 좋은 동영상 강좌들이 많이 올라와 있다. Eclipse의 많은 기능들을 느끼고 사용해 볼 수 있다. Eclipse 에서 Middlegen 사용하기 : 프로잭트를 하다보면 Database의 변경이 있을 수 있다. 만일 이러한 상황에서 Hiberanate같은 framework를 사용할 시에 변경될 때마다 해당 xml mapping파일과 java dto 객체를 생성하는 일은 참으로 번거로운 일이 아닐 수 없으며 이러한 비용을 줄이기 위해 eclipse용 plugin으로 middlegen이 나왔습니다. Eclipse 사용시 유용한 팁 Eclipse 사용시 알아두면 유용한 팁 Eclipse 성능 높히기 Eclipse 기반하에서 Remote Debugging 설정 : Eclipse 기반하에서 Remote Debugging을 실행하는 방법에 대하여 다룬다. Eclipse With PlugIn Eclipse에 Web Tools Project 설치 및 사용방법 : 지금까지 Eclipse에서 불편하게 느꼈던 웹 개발의 편의성을 향상 시켜줄 막강한 플러그인에 관한 설치에서부터 다양한 툴들을 사용방법에 대하여 다룬다. Eclipse에 Tomcat Server플러그인 설치하기 Eclipse에 JRUN Server플러그인 설치하기 Eclipse에 JBoss Server플러그인 설치하기 Eclipse에 Lomboz플러그인 설치하기 1 Eclipse에 Lomboz플러그인 설치하기 2 Eclipse With 버전 관리 시스템 CVS 설치와 Eclipse와의 연동 Eclipse와 CVS과 연결하여 사용하기 [Eclipse와 CVS를 이용하여 팀 작업하기] Subversion 설치 및 Eclipse와의 연동 Visual Source Safe 설치와 Eclipse와의 연동 Children Hide Children | View in hierarchy Eclipse에 Web Tools Project 설치 및 사용방법 (통합 개발 환경) Eclipse 시작하기 (통합 개발 환경) Eclipse에 새로운 플러그인 설치하기 (통합 개발 환경) Eclipse 사용시 알아두면 좋은 유용한 단축키 모음 (통합 개발 환경) Eclipse 사용시 알아두면 유용한 팁 (통합 개발 환경) Eclipse 성능 높히기 (통합 개발 환경) Eclipse에 Tomcat Server플러그인 설치하기 (통합 개발 환경) Eclipse에 JRUN Server플러그인 설치하기 (통합 개발 환경) Eclipse에 JBoss Server플러그인 설치하기 (통합 개발 환경) Eclipse에 Lomboz플러그인 설치하기 1 (통합 개발 환경) Eclipse에 Lomboz플러그인 설치하기 2 (통합 개발 환경) CVS 설치와 Eclipse와의 연동 (통합 개발 환경) Eclipse와 CVS과 연결하여 사용하기 (통합 개발 환경) Subversion 설치 및 Eclipse와의 연동 (통합 개발 환경) Visual Source Safe 설치와 Eclipse와의 연동 (통합 개발 환경) Eclipse 에서 Middlegen 사용하기 (통합 개발 환경) Eclipse 기반하에서 Remote Debugging 설정 (통합 개발 환경) java.net과 이클립스를 이용한 오픈소스 자바 어플리케이션 개발 이 튜토리얼은 이클립스를 소개하고 이를 활용하여 java.net에 호스팅 된 자바 어플리케이션 개발에 대해 살펴봅니다. 1부. 이클립스에서 새로운 프로젝트 생성하기 2부. 이클립스와 CVS를 이용한 팀 개발 ======================================================================================= 자바를 닷넷으로 바꿔주는 프로젝트 (MS) : http://msdn.microsoft.com/vstudio/downloads/tools/jlca/default.aspx 닷넷을 자바로 바꿔주는 프로젝트(라이브러리, 넷빈즈 플러그인) : https://net2java.dev.java.net/ HTML, JavaScript, ASP 등 : http://www.dragoneye.co.kr/ 웹 기획 문서 링크 : http://www.ihelpers.co.kr/webdevdoc/index.php 기획 찜 : http://plan.jjim.com/ ======================================================================================= 사이버유 강의실 Ⅰ. 인터넷기초 & 홈페이지 인터넷과 전자상거래 홈페이지만들기(HTML) Ⅱ. 시스템&프로그램 설치 퍼스널 웹서버(PWS) 설치 액세스로 데이터베이스 만들기 MS-SQL 서버설치 및 운영 리눅스에서 MAP 설치 오디비씨(ODBC) 설정 Ⅲ. 자바(Java) 프로그래밍 자바 프로그래밍 자바이야기 [※ 음성강의] 자바 웹프로그래밍(JSP) [※ 음성강의] 웹 정보추출 에이전트 Ⅳ. 데이터베이스(DB) 구조적 질의어 (SQL) Oracle DBMS & SQL (Link) MySQL for Linux Ⅴ. C언어 프로그래밍 C 언어 프로그래밍 (권수태,황인수) Unix & C Language CGI 프로그램의 개념과 폼 태그 CGI 기초와 CGI 예제 Ⅵ. 액티브서버페이지(ASP) 프로그래밍 ASP(Active Server Pages) 기초 | ASP란? | ASP 문법 | ASP 객체 | 웹과 디비연동 프로그래밍 파일 업로드(Upload) (기초, 예제) ASP와 비주얼 베이직 함수 예제로 배우는 ASP 프로그래밍 | 사용자인증 | 방명록 | 게시판 | Ⅶ. 강의자료(PPT) 경영정보시스템 [ MIS의 이해 ] 의사결정지원시스템 시스템분석 및 설계 데이터베이스 자바 프로그래밍 컴퓨터기초및언어 emwac 설치 : http://empire.achor.net/v7/lesson/win2000/ Oracle Database 10g: The Top 20 Features for DBAs : http://www.oracle.com/technology/pub/articles/10gdba/week5_10gdba.html 손병목의 지식공유 : http://www.itmembers.net/ apmsetup (아파치 PHP MySQL 한방에 설치) : http://www.apmsetup.com/ ======================================================================================== 번역 ======================================================================================== 구글 번역 : http://www.google.co.kr/language_tools?hl=ko 알타비스타 번역 : http://babel.altavista.com/translate.dyn icanread 영어 번역 : http://www.icanread.co.kr/ektran/ektran.html 짧은 문장 번역 : http://standard.beta.amikai.com/amitext/indexUTF8.jsp 영어 문장 번역 : http://ns.cnenews.net/ek-web/cgi-bin/sentTrans-ek 영어/일본어 단문 번역 : http://gtlac.keric.or.kr/cm_menu/home/translate/english.jsp 한중일 번역 : http://www.infoseek.co.jp/Honyaku?pg=honyaku_top.html ======================================================================================== 유용한 링크 ======================================================================================== nullsoft 인스톨 프로그램(무료) : http://nsis.sourceforge.net/Main_Page JBoss IDE tutorial : http://docs.jboss.com/jbosside/tutorial/build/en/html/index.html 자바지기 위키 WIKI : http://wiki.javajigi.net/homepage.action =========================================================================== JBuilder 2005 Foundation - 완전무료 자바 개발툴 =========================================================================== 완전히 무료로 쓸 수 있는 자바 개발툴, JBuilder 2005 Foundation입니다. 심지어 등록조차 필요가 없습니다. J빌더의 가장 기본적인 기능만 있지만, 그래도 같은 무료 배포인 이클립스보다는 강력하다고 하네요. 윈도우용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_windows.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_windows.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_windows.zip 리눅스용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_linux.tar.gz http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_linux.tar.gz http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_linux.tar.gz 솔라리스용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_solaris.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_solaris.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_solaris.zip 맥용 설치프로그램/문서/예제 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_mac.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_docs_mac.zip http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_samples_mac.zip Extras - Ant 1.6.2 http://file.borlandforum.com/jbuilder/JBuilder2005Foundation/jb2005_fnd_extras.zip eclipse WTP J2EE Tutorials Building a CMP Based School Schedule Web Application This tutorial is similar to the Building a School Schedule Web Application except EJBs are used. This tutorial walks the user through developing a Container Managed Entity Bean (CMP) to store a simple schedule. A Session Bean is used to query the CMP. Finally, a Servlet and JSP are built to serve as the front end. Building and Running a Web Application This document is the first in a series of tutorials where we will demonstrate how you can use the rich set of tools and APIs that comes with the Web Tools Platform Project. This first tutorial will give you a step by step tour of using some the tools for web development. For this purpose we will build and run a J2EE web application using WTP tools and Apache Tomcat. Building a School Schedule Web Application In this tutorial you will create a school schedule Web application. This application will allow students to input their courses and create a schedule. This tutorial will introduce you to JSP's, servlets and the Web Tools Platform project's server tools. Building a Simple EJB Application In this tutorial you will create a simple EJB component and a client web application. This tutorial will introduce you to Session beans and the Web Tools Platform project's support for XDoclet and server tools. Cactus Integration in the Web Tools Project This article briefly explains Cactus, its common uses and advantages and then provides a step-by-step tutorial on how to use the Cactus integration provided by WTP. The article assumes that you are familiar with JUnit and the basics of using WTP to build, deploy and run web projects. Deploy Web Applications to the Oracle Application Server This tutorial will step you through the details of deploying a Web Application to the Oracle Application Server Containers for J2EE (OC4J). SDN JCreater Tutorial : http://developers.sun.com/prodtech/javatools/jscreator/learning/tutorials/index_ko.jsp
반응형

자바에서 각 이벤트는 하나의 이벤트 타입에 속하게 됩니다.

사용자가 JButton 컴포넌트를 클릭할 때 발생하는 actionPerformed 이벤트는 ActionEvent라고 하는 이벤트 타입에

속합니다. 여기에서 이벤트 타입은 EventObject 클래스에서 파생되는 클래스로 정의됩니다.

그리고 각 이벤트 타입에 속하는 모든 이벤트는 리스너 인터페이스의 멤버가 됩니다.

예를 들어 ActionEvent 이벤트 타입에 속하는 actionPerformed 이벤트는 ActionListener라고 하는 리스너

인터페이스의 멤버가 되는 것이지요.

 

결국 하나의 이벤트 타입에 대하여 하나의 리스터 인터페이스가 있는 셈입니다.

 

Interface

Class

ActionListener

ActionEvent

AdjustmentListener

AdjustmentEvent

AWTEventListener

AWTEvenetListenerProxy

ComponentListener

ComponentAdapter

ContainerListener

ComponentEvent

FocusListener

ContainerAdapter

HierachyBoundsListener

ContainerEvent

HierachyListener

FocusAdapter

InputMethodListener

FocusEvent

ItemListener

HierachyBoundsAdapter

KeyListener

HierachyEvent

MouseListener

InputEvent

MouseMotionListener

InputMethodEvent

MouseWheelListener

InvocationEvent

TextListener

ItemEvent

WindowFocusListener

KeyAdapter

WindowListener

KeyEvent

WindowStateListener

MouseAdapter

 

MouseEvent

 

MouseMotionAdapter

 

MouseWheelEvent

 

PaintEvent

 

TextEvent

 

WindowAdapter

 

WindowEvent

 

 

하나의 리스너 인터페이스에 여러 메소드 즉, 여러 이벤트가 포함될 수 있습니다.

예를 들어 창과 관련된 이벤트에서는 windowActivated, windowClosed, windowClosing, windowDeactivated,

windowDeiconified windowIconified, windowOpened 등이 있으며, 이들 이벤트는 모두 windowListener라고 하는

리스너 인터페이스의 멤버가 됩니다.

 

이러한 리스너 인터페이스를 구현하는 클래스를 어댑터(Adapter)라고 하며, 어댑터의 인스턴스를 리스너라고 합니다.

그리고 리스너 인터페이스를 구현하고 있는 리스너를 이벤트 소스에 등록시켜야 합니다.

이벤트 소스란 이벤트를 발생시키는 객체입니다.

public class MyPanel extends Jpanel implements ActionListener{

public void actionPerformed(ActionEvent e){

JoptionPane.showMessageDialog(

this,

getSource().ToString() + “ 를 클릭했습니다.”,

“actionPerformed 이벤트”,

JoptionPane.OK_OPTION);

}

public MyPanel(){

jButton = new Jbutton(“클릭하세요.”);

jButton.addActionListener(this);

}

}

 

public class MyPanel extends Panel{

ActionAdapter actionAdapter = new ActionAdapter();

public MyPanel(){

jButton = new Jbutton(“클릭하세요.”);

jButton.addActionListener(actionAdapter);

}

}

 

class WindowClosing extends WindowAdapter{

    public void windowClosing(WindowEvent e){

        System.exit(0);

    }

}

 

class MyFrame extends JFrame{

    public MyFrame(){

        WindowClosing listener = new WindowClosing();

        addWindowListener(listener);

    }

}

 

class MyFrame extends JFrame{

    public MyFrame(){

        addWindowListener(new WindowAdapter(){

            public void windowClosing(WindowEvent e){

                System.exit(0);

            }

        });

    }

}

 

* “예전에 누가 Adapter를 사용하면 리스너에 있는 method()를 모두 구현하지 않아도

되며 필요한 method()구현하면 된다고 했었는데, 사실은 Adapter 클래스를

상속받아서 새로운 리스너를 구현하는 것입니.”

반응형

Method Categories and Interface

 

Category

Interface Name

Methods

Action

ActionListener

actionPerformed(ActionEvent)

Item

ItemListener

itemStateChanged(ItemEvent)

Mouse

MouseListener

mousePressed(MouseEvent)

mouseReleased(MouseEvent)

mouseEnterd(MouseEvent)

mouseExited(MouseEvent)

mouseClicked(MouseEvent)

Mouse Motion

MouseMotionListener

mouseDragged(MouseEvent)

mouseMoved(MouseEvent)

Key

KeyListener

keyPressed(KeyEvent)

keyReleased(KeyEvent)

keyTyped(KeyEvent)

Focus

FocusListener

focusGained(FocusEvent)

focusLost(FocusEvent)

Adjustment

AdjustmentListener

adjustmentValueChanged(AdjusmentEvent)

Component

ComponenetListener

componentMoved(ComponentEvent)

componentHidden(ComponentEvent)

componentResized(ComponentEvent)

componentShown(ComponentEvent)

Window

WindowListener

windowClosing(WindowEvent)

windowOpened(WindowEvent)

windowIconified(WindowEvent)

windowDeiconified(WindowEvent)

windowClosed(WindowEvent)

windowActivated(WindowEvent)

windowDeactivated(WindowEvent)

Container

ContainerListener

componentAdded(ContainerEvent)

componentRemoved(ContainerEvent)

Text

TextListener

textValueChanged(TextEvent)

 

 

 

 

 

AWT Components

 

Component Type

Description

Button

A named rectangular box used for receiving mouse clicks

Canvas

A panel used for drawing

Checkbox

A component allowing the user to select an item

ChekboxMenuItem

A checkbox within a menu

Choice

A pull-down static list of items

Component

The parent of all AWT components, except menu components

Container

The parent of all AWT containers

Dialog

The base class of all modal dialog boxes

Frame

The base class of all GUI windows with window manager controls

Label

A text string component

List

A component that containers a dynamic set of items

Menu

An element under the menu bar, which containers a set of menu items

MenuItem

An item within a menu

Panel

A basic container class used most often to create complex layouts

Scrollbar

A component that allows a user to “select from a range of values”

ScrollPane

A container class that implements automatic horizontal and vertical

Scrolling for a single child component

TextArea

A component that allows the user to enter a block of text

TextField

A component that allows the user to enter a single line of text

Window

The base class of all GUI windows, without window manager controls

  

Component Events

 

Component Type

Act

Adj

Cmp

Cnt

Foc

Itm

Key

Mou

MM

Text

Win

Button

V

 

V

 

V

 

V

V

V

 

 

Canvas

 

 

V

 

V

 

V

V

V

 

 

Checkbox

 

 

V

 

V

V

V

V

V

 

 

CheckboxMenuItem

 

 

 

 

 

V

 

 

 

 

 

Choice

 

 

V

 

V

V

V

V

V

 

 

Component

 

 

V

 

V

 

V

V

V

 

 

Container

 

 

V

V

V

 

V

V

V

 

 

Dialog

 

 

V

V

V

 

V

V

V

 

V

Frame

 

 

V

V

V

 

V

V

V

 

V

Label

 

 

V

 

V

 

V

V

V

 

 

List

V

 

V

 

V

V

V

V

V

 

 

MenuItem

V

 

 

 

 

 

 

 

 

 

 

Panel

 

 

V

V

V

 

V

V

V

 

 

Scrollbar

 

V

V

 

V

 

V

V

V

 

 

ScrollPane

 

 

V

V

V

 

V

V

V

 

 

TextArea

 

 

V

 

V

 

V

V

V

V

 

TextField

V

 

V

 

V

 

V

V

V

V

 

Window

 

 

V

V

V

 

V

V

V

 

V

 

Act – ActionListener

Adj – AdjustmentListener

Cmp – ComponentListener

Cnt – ContainerListener

Foc – FocusListener

Itm – ItemListener

Key – KeyListener

Mou – MouseListener

MM – MouseMotionListener

Text – TextListener

Win – WindowListener

 

반응형
IBM 소프트웨어 엔지니어 (마음은 게이머)인 Scott Clee가 테트리스 게임 모델을 재사용 가능한 자바 빈 컴포넌트로 포장하는 간단한 방법을 소개한다. 일단 게임의 구성 요소들이 자바 객체들로 나누어지면 완전한 게임 모델 빈을 형성하도록 재조립될 수 있고, 실제로 어떤 테트리스 GUI에도 결합될 수 있다. forum에서 이 글에 대한 여러분의 생각을 저자와 다른 독자들과 공유하기 바란다.

-참조 : http://www.ibm.com/developerworks/kr/library/j-tetris/

테트리스 게임의 구성 요소들을 자바 객체로 나누어 재사용 가능한 자바 게임 컴포넌트로 만드는 방법

한 친구가 자신은 새로운 프로그래밍 언어를 배울 때마다 그 언어를 사용해 테트리스 게임을 작성하는데 도전한다고 말한 적이 있다. 이러한 전통하에, 내가 처음 자바 언어를 사용한 프로그래밍 법을 배웠을 때 나도 같은 시도를 해 보기로 했다. 나의 첫번째 시도는 하나의 완전한 게임이긴 했지만 매우 간단하고 흉한 것이었다. 시간이 가고 내가 자바 설계와 개발에 더 많은 경험을 얻음에 따라 나는 GUI에서 게임 모델을 분리시켜 (Swing 컴포넌트와 유사하게) 테트리스 빈을 만들 수 있다는 사실을 알았다. 그래서 나는 그것을 해 보기 시작했다.

이 글에서 나는 테트리스 빈을 구축하고 구현하는 방법을 안내하겠다.

테트리스는 자바 객체로 표현될 수 있는 몇 개의 구성 요소를 가지고 있다.:

  • The Tetris pieces 테트리스 조각
  • 조각을 가지고 있는 테트리스 판
  • 판 위의 조각 제어, 점수 관리 등을 하는 게임

이 요소들 각각을 좀 더 자세히 살펴보자.

  • 각 요소는 정확히 네 개의 블록으로 구성되어 있다.
  • 조각 내의 각 블럭은 테트리스 판 내에 (x.y) 좌표를 가지고 있다.
  • 각 조각은 0, 2, 4의 회전율을 가지고 있다.
  • 각 조각은 L, J, S, O, I, Z, 혹은 T 모양을 지닐 수 있다.


그림 1. 각 테트리스 조각에 네 요소가 필요함 : 블록, (x,y) 좌표, 회전율 및 모양
Four elements of each Tetris piece
테트리스 빈으로 무엇을 할 수 있을까?

다음은 테트리스 빈을 만든 후 내가 수행한 몇 가지 일들이다.
  • 빈의 두 인스턴스를 연결시켜 대결 게임을 만들다.
  • Netris라는 이름을 가진, 최초의 Psion Netpad용 테트리스 게임을 만들다
  • 빈을 애플릿에 통합시켜 브라우저와 호환되는 테트리스 게임을 만들다.

첫번째 두 아이템은 매우 간단한 시스템을 사용해 구현될 수 있다. 각 조각에 대해 중앙 블록을 선택하고 이 블록의 (x,y) 좌표를 저장하면, 조각 내의 나머지 블록들을 이 블록을 중심으로 한 상대 좌표로 저장할 수 있다. 이 방식은 중앙 조각에 대한 상대 블록으로 모양을 저장함으로써 조각의 어떤 형태도 기술할 수 있게 해준다. 중앙 지점은 java.awt.Point로 저장될 수 있고 상대 좌표는 java.awt.Point 배열에 저장될 수 있다. 좌표 계산을 쉽게 하기 위해, 중앙 조각을 (0,0) 상대 좌표를 가진 블록으로 저장할 수 있다.

이 시스템은 또한 조각의 회전을 계산할 때 더 쉽다. 간단한 행렬 조작을 사용하여 단순히 y좌표를 x 좌표로 바꾸고 x 좌표는 y 좌표의 마이너스 값으로 바꾸면 조각을 시계방향으로 90도 회전시킬 수 있다. 우리는 중앙 지점을 중심으로 상대 좌표를 사용하고 있기 때문에, 여기에서도 마찬가지로 할 수 있다:



temp = x;
x = -y;
y = temp;

여러분은 또한 시계방향 회전을 3번 적용하면 조각을 시계 반대 방향으로 90도 회전시킬 수 있다. (믿지 못하겠다면 한 번 해보기 바란다.)

마지막으로, 모든 조각이 동일한 회전율을 가지는 것은 아니므로, 이 문제를 보충하기 위해 회전 기법을 체크해 보아야 할 것이다.

우리는 모든 유형의 조각을 표시하는데 동일한 TetrisPiece 클래스를 사용하기 때문에 이들을 구분할 방법이 필요하다. 이를 위해 우리는 몇 개의 정적인 int 생성자를 사용하여 다른 유형들을 표시하고 지역 변수가 조각의 유형을 저장하도록 한다. 다음은 이 생성자들 중 하나의 예이다:



public static final int L_PIECE = 0;

조각을 테트리스 판 위에서 이동시킬 것이므로 이를 위한 이동 메소드를 제공해야 한다. 몇 가지 이동 (이미 가능한 한 제일 오른쪽 끝에 와 있는데 다시 오른쪽으로 가려는 시도)은 불법적일 수 있다. 따라서 우리는 모든 이동 요청을 확인할 필요가 있다. 우리는 참조를 저장할 테트리스 판에서 이것을 구현할 것이다. 따라서 우리 클래스의 생성자는 여기에서 두 가지 매개 변수를 가질 것이다: 첫번째는 만들어진 조각의 유형이고, 두번째는 테트리스판에 대한 참조이다. 생성자에서 우리는 initalizeBlocks()이라는 private 유틸리티 메소드를 호출할 것인데, 이 메소드는 조각의 상대 좌표값을 각각의 조각 유형에 설정할 것이다.

이동이 합법적인지를 체크하는 간단한 방법은 판에서 조각을 떼내어 원하는 방향으로 이동시킨 후 맞는지 보는 것이다. 맞으면 조각을 보드의 새 위치에 둔다. 그렇지 않으면 이동을 취소하고 원래 있던 자리에 다시 둔다. 반환되는 값은 그 결과에 따라 true (이동이 맞으면)나 false(이동이 맞지 않으면)가 될 것이다.

좀 더 주의를 기울여야 할 이동의 한 유형은 조각이 떨어지는 경우이다. 떨어진다는 것은 조각이 판의 제일 아래쪽으로 바로 내려간다는 의미이다. 이를 위해 우리는 더 이상 움직일 수 없을 때가지 조각을 아래로 계속 이동시키는 while 루프가 필요하다. 그러면 조각은 그 위치에 배치될 것이다.

조각에 적용될 수 있는 다양한 이동들을 구별하기 위해 우리는 다음 예제에 나타난 것과 같이 몇 가지 추가적인 static int 생성자를 사용할 것이다.:



public static final int LEFT = 10;

조각이 맞는지 보기 위해 나중에 willFit() 메소드가 TetrisBoard 클래스에서 구현된 것이다.

마지막으로 TetrisPiece 클래스를 포장하기 위해 우리는 중앙 지점과 상대 좌표와 같은 몇 가지 변수에 대한 getters와 setters, 그리고 무작위 유형의 TetrisPiece 인스턴스를 반환할 getRandomPiece()라는 정적인 메소드를 가진다.

TetrisPiece 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드받을 수 있다.

테트리스 판은 빈 블록과 색깔 있는 블록을 가지고 있는 2D 격자판으로 생각할 수 있다. 다양한 유형의 테트리스 조각들이 int 생성자에 의해 구별되기 때문에, 우리가 해야 할 일은 빈 블록의 값을 정의하는 것 뿐이고 우리는 판을 2D int 배열로 저장할 수 있다. 이 방식을 사용하면 판 내의 빈 블록은 다음에 의해 표시될 것이다.:



public static final int EMPTY_BLOCK = -1;

유연성을 유지하기 위해 판의 크기를 가변적으로 하겠지만 이것을 생성자 내에 정의할 것이다. 따라서 생성자는 열과 행의 수를 나타내는 두 ints를 받아들일 것이다. 그리고 나서 2D 배열 내의 모든 값을 기본적으로 빈 블록으로 만드는 resetBoard() 메소드를 호출할 것이다.

조각들이 판에 추가되고 제거되기 때문에 우리는 addPiece()removePiece()메소드를 제공한다. addPiece() 메소드는 TetrisPiece()를 취하고 판에서 이 메소드가 차지하는 모든 위치의 값을 자신의 유형으로 설정함으로써 작동한다. removePiece() 메소드는 판의 값이 빈 블록의 값으로 설정된다는 점을 제외하면 비슷하다.

판에 변화가 있을 때 사용자가 알 수 있도록 하기 위해, 조각이 추가되거나 이동되었을 때 BoardEvent가 구동될 것이다. 이 이벤트를 듣는 클래스들에 대해 우리는 BoardListener 인터페이스가 필요한데, 이벤트가 구동되었을 때 이 인터페이스의 boardChange()메소드가 호출된다. 이 이벤트들은 화면 수정이 필요할 때 통지되도록 테트리스 판 GUI에 의해 사용될 수 있다. listener를 저장하기 위해 우리는 java.util.Vector를 사용할 것이고, listener를 추가/삭제하고 이벤트를 구동시키기 위한 관련 메소드를 제공할 것이다.

때때로 여러분이 조각을 추가하고 삭제할 때 BoardEvents를 구동시키는 것이 부적절할 수 있다. 조각이 떨어져야 할 때 (이 이동은 조각을 떨어뜨리기 위해 while 루프를 사용한다는 것을 기억하라)를 예로 들 수 있다. 이 경우 조각이 바닥에 부딪쳤을 때만 이벤트가 필요하다. 이를 용이하게 하기 위해 우리는 boolean 매개변수를 취하도록 addPiece() 메소드를 만들어 값이 true일 경우에만 이벤트가 구동되도록 할 것이다.

테트리스 게임의 중요 요소 중 하나는 한 행이 완료되면 그 행은 사라지고 그 위의 모든 행들이 내려온다는 것이다. 이를 위해 우리는 삭제될 행의 지수를 매개변수로 취하는 removeRow() 메소드를 제공할 것이다. 행이 없어진 후에 BoardEvent가 구동될 것이다.

private 변수들에 접근하기 위해 필요한 getter와 setter들 외에도, 우리는 하나의 메소드가 더 필요하다. 앞에서 설명한 willFit()가 그것이다. 이 메소드는 TetrisPiece를 매개변수로 취해 그 조각이 판에 맞는지 결정하기 위한 boolean 값을 돌려준다. 맞는다는 것은 그 조각이 판의 경계 안에 있고 판에서 그 조각이 맞춰질 곳에 있는 블록의 값이 비어 있다고 설정되어 있음을 의미한다. 이런 경우 true 값이 반환된다.

이제 TetrisBoard 클래스가 완성되었다.이 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드받을 수 있다.

100 피트 벽을 가진 테트리스?

어느날 나는 이 빈을 타워 블록의 점등 시스템에 연결시키고 빌딩의 측면을 따라 내려가면서 테트리스 게임을 하고 싶어졌다. 나는 누군가가 이렇게 했다는 것을 신문에서 읽은 후 내내 이것을 하고 싶어해 왔다.

이제 테트리스 게임에서 사용되는 두 개의 주 컴포넌트를 만들었으므로, 이들을 모아 게임 로직을 만들면 된다.

게임의 흐름을 제어하기 위한 좋은 방법은 이것을 java.lang.Thread를 확장하는 내부 클래스에 내장시키는 것이다. 이 방식의 한 가지 장점은 게임 속도를 제어하기 위해 스레드 sleep 호출을 추가할 수 있다는 것이다. 또 다른 장점은 현재 주 애플리케이션 스레드가 자유롭기 때문에 하나의 GUI가 첨부될 때 색칠 문제가 없어진다는 것이다. 이 문제는 주 스레드가 계속 묶여 있어 색칠할 시간이 없을 때 때때로 발생할 수 있다.

스레드 내의 로직은 run() 메소드 내의 while 루프 속에 구현될 것이다. 루프는 계속해서 조각을 만들어 내고 조각을 더 이상 맞출 수 없을 때까지 이들을 게임판으로 떨어뜨릴 것이다. 이 때 fPlaying이라는 지역 boolean 변수가 false로 설정되어 루프를 끝내고 GameEvent를 구동시켜 게임이 종료되었음을 표시할 것이다.

while 루프 내에 fPaused의 boolean 값을 체크하는 if 절이 있다. 이 값이 true로 설정되었을 경우 루프는 계속 실행되겠지만 모든 게임 로직이 무시되어 종료되는 느낌을 줄 것이다. Boolean이 false로 다시 바뀌면 게임이 계속될 것이다.

우리는 한 번에 하나씩 떨어지는 조각에만 관심을 가지고 있으므로, 여기에 대한 참조를 저장할 fCurrPiece라는 변수를 만들 것이다. 이 변수가 null 값으로 설정되면 이전의 조각이 더 이상 아래로 내려갈 수 없으며 판의 최종 위치에 도착했음을 의미한다. 이 때 우리는 새 조각을 만들어 판의 맨 위 중앙에 둔다. fCurrPiece 변수가 null값이 아닌 모든 경우에 우리가 해야 할 일은 그 것을 한 위치로 떨어뜨리고 주어진 시간 동안 스레드를 휴면 상태로 만드는 것이다.

한 조각이 더 이상 움직일 수 없게 되었을 때 우리는 행이 완성되었는지 보아야 한다. 이를 위한 손쉬운 방법은 한 쌍의 중첩 for 루프를 사용하는 것이다. 이 for 루프의 바깥 쪽 루프는 행의 지수를 따라 작업하며, 안쪽의 루프는 지수 전체에 걸쳐 확인 작업을 수행한다. 만일 우리가 완성된 행을 발견하면, TetrisBoard 클래스에 구현된 removeRow() 메소드를 호출하며 완성된 행의 지수를 전달할 수 있다. 이제 제거된 행 위의 모든 행들이 하나씩 내려올 것이기 때문에 우리는 이들을 다시 체크해야 할 것이다. 여러 행을 한번에 완성하도록 장려하기 위해 우리는 완성된 행의 개수를 저장하고 각각 더 높은 점수를 줄 것이다.

테트리스 게임의 또 다른 주요 요소는 더 많은 행이 완성될수록 조각이 더 빨리 내려온다는 것이다. 이 기능은 지금까지 완성된 행의 개수를 체크하고 이에 따라 스레드의 휴면 주기를 점차 감소시켜가는 방식으로 구현될 수 있다.

GameThread 내부 클래스를 만들기 위해 필요한 것은 이것이 전부지만, 구현해야 할 또 다른 내부 클래스가 있다. 다수의 이벤트가 구동될 것이고 이들은 listerners가 저장되도록 요구할 것이므로, 이들을 모두 한 장소에 두는 것이 좋을 것이다. 우리는 EventHandler 내부 클래스를 사용하여 이를 수행할 것이다.

EnvetnHandler 내부 클래스
이 클래스는 우리가 구동하는 이벤트에 관심이 있는 listener들에 대한 참조를 저장할 것이다. listener들에 대한 addremove 메소드를 제공할 뿐 아니라 이벤트들을 구동하기 위한 유틸리티 메소드도 있을 것이다.

이 클래스는 다음 유형의 이벤트들을 다룬다. :

  • GameEvent : 게임이 시작되거나 멈출 때마다 구동된다. 게임 START 혹은 END를 표시하기 위한 값을 가지고 있다.

  • BoardEvent : 게임판에 변경 사항이 있을 때 구동된다. EventHandler 클래스에서 추가/삭제 listener 호출이 TetrisBoard 클래스로 전달된다.

  • ScoreEvent: 점수가 바뀔 때 구동된다.

구동될 수 있는 많은 다른 유형의 이벤트들이 있지만, 간편성을 위해 나는 위에서 설명한 이벤트들만 사용하였다. 우리가 구현할 수 있는 다른 이벤트에는 LineEvent가 있는데, 한 행, 혹은 여러 행이 완성되었을 때 구동되고 화면 애니메이션을 일으키는데 사용될 수 있다.

TetrisGame 마무리하기

이제 내부 클래스들을 완성하였으므로 TetrisGame 클래스의 나머지 부분을 설명해야 한다. 모든 자바 빈과 마찬가지로 우리는 매개 변수 없는 생성자가 필요하다. 이 생성자에서 우리는 EventHandler 클래스와 TetrisBoard 클래스의 인스턴스를 만들 것이다. TetrisBoard 클래스 10x20이라는 기본 사이즈를 가질 것이다.

게임 상태를 제어하기 위해 우리는 개시, 중지, 일시 중지 메소드를 사용할 것이다. startGame() 메소드는 모든 게임 변수를 리셋하고 ScoreEvent (이제 0으로 리셋됨)와 GameEvent (START라는 매개 변수 유형을 가짐)를 구동시킬 것이다. 또한 GameThread를 생성하여 개시할 것이다. stopGame() 메소드는 fPlaying 변수를 false로 바꾸어 GameThread가 끝나도록 하고 END라는 매개변수 유형으로 GameEvent를 구동시킨다. setPause() 메소드는 한 게임을 일시 중지시키는 역할만 한다.

필요한 모든 getters와 setters와 별도로, 구현할 메소드가 하나 더 있는데, move() 메소드가 그것이다. 이 메소드는 이동 방향을 매개변수로 취하는데, 이것은 TetrisPiece 클래스에서 나오는 생성자이다. move() 메소드는 게임이 진행중이며 일시 중지 상태가 아니라고 가정하고 이동하려고 시도한다. 그 이동이 아래로 떨어지는 요청인데 성공하지 못한다면 fCurrPiece가 null 값으로 설정되고 조각은 게임판 내의 현재 위치에 남아 있을 것이다. 그러면 GameThread는 새로운 조각을 생성한다.

TetrisGame에 대해서는 이게 전부이다. 이 클래스를 포함한 완성된 소스를 참고 자료에서 다운로드 받을 수 있다.

이제 완벽함을 위해 우리는 BeanInfo 클래스를 만들고 이 클래스들을 적절한 파일들로 채울 수 있지만, 여기에서는 그럴 필요가 없다. 우리가 필요한 것은 우리의 빈을 테스트할 간단한 GUI이고 참고 자료에 하나가 제공되고 있다. 이것은 테트리스 게임판을 그리기 위해 한 개의 내부 클래스를 사용하고 키 조작을 조정하기 위한 몇 가지 로직을 포함하고 있는 간단한 클래스이다. GUI는 javax.swing.JFrame에 표시되며, 선택적으로 java.applet.Applet이 될 수도 있다.

우리의 테트리스 빈을 테스트하기 위해 소스 파일을 푸는데, 디렉토리 구조를 그대로 두기 바란다. (왜냐하면 내가 빈 클래스들이 TetrisBean 디렉토리에 있도록 이들을 TetrisBean 패키지에 두었기 때문에 때문이다.) 여러분이 소스 파일을 푼 경로를 자바 클래스 경로에 추가하고 파일을 컴파일한다. 이제 여러분이 해야 할 일은 "java Scottris"를 실행시키는 것 뿐이다.

나는 이러한 테트리스 빈을 구현할 수 있는 많은 방법이 있다는 것을 알고 있다. 내가 이 글에서 소개한 것은 아주 간단한 방법이며, 이것이 여러분의 창조력에 불을 붙일 수 있기를 바란다. 나는 여러분이 이것을 자유롭게 개선시키기 바란다.




위로


참고자료




위로


필자소개

Photo of Scott Clee

Scott Clee는 현재 IBM의 CICS 제품에 대한 FV Tester로 일하고 있다. 4년간 자바 프로그래머로 일했으며 자바와 관련된 재미있는 프로젝트를 취미 삼아 수행하는 것을 즐긴다.





위로
반응형

저자 JZ Ventures사의 사장 겸 대표 컨설턴트인 John Zukowski

이 아티클의 영문 원본은
http://java.sun.com/mailers/techtips/corejava/2007/tt0907.html#2
에서 볼 수 있습니다.

이 팁은 Java SE 6을 사용하여 작성되었습니다. 이번 및 향후 테크팁을 사용하기 위해 Java Platform, Standard Edition 6 Development Kit(JDK 6)을 Java SE 다운로드 페이지에서 다운로드할 수 있습니다.

선호 설정(Preferences) API는 표준 플랫폼 1.4버전에 도입된 직후 2003년 7월 15일자 영문기사  선호 설정API에서 맨 처음 다뤄진 바 있다.

이 기사에서는 사용자별 선호 설정을 가져오고 설정하는 방법에 대해 설명했다. 선호 설정 API는 사용자별 설정을 가져오고 설정하는 것에 국한되지 않는다. 시스템 선호 설정, 선호 설정 가져오기 및 내보내기, 선호 설정과 연결된 이벤트 알림도 있다. 선호 설정을 저장하기 위한 사용자 정의 위치를 제공하는 방법도 있다. 언급한 처음 세 옵션에 대해 여기서 설명한다. 사용자 정의 기본 선호 팩토리 만들기는 이후의 팁에서 다루기로 한다.

시스템 선호 설정

선호 설정 API는 서로 다른 두 가지 선호 설정 집합을 제공한다. 첫 번째 집합은 개별 사용자용으로서, 동일한 시스템의 여러 사용자가 서로 다른 설정을 정의할 수 있게 한다. 이를 사용자 선호 설정이라고 한다. 동일한 시스템을 공유하는 각 사용자는 자신의 고유한 값 집합을 선호 설정의 그룹과 연결할 수 있다. 사용자 비밀번호, 시작 디렉토리 등이 그 예이다. 한 시스템의 모든 사용자가 동일한 비밀번호와 홈 디렉토리를 갖는 것은 바람직하지 않다. 독자들도 그렇게 생각하리라 기대한다.

또 다른 선호 설정 형태는 시스템 유형이다. 한 시스템의 모든 사용자가 동일한 시스템 선호 설정 집합을 공유한다. 예를 들어, 설치된 프린터의 위치는 일반적으로 시스템 선호 설정이다. 굳이 사용자별로 다른 프린터 집합을 설치할 필요는 없다. 동일한 시스템을 사용하는 사람이라면 그 시스템을 기준으로 구별되는 모든 프린터를 알고 있을 것이다.

시스템 선호 설정의 또 다른 예로 게임 고득점이 있다. 전체 고득점은 오로지 하나만 존재해야 한다. 여기서 시스템 선호 설정이 사용될 수 있다. 이전 팁에서 userNodeForPackge() 및 그에 이어 userRoot()가 사용자 기본 설정 노드를 가져오는 데 어떻게 사용되는지 확인했다면, 다음 예제에서는 systemNodeForPackage() 또는 루트용 systemRoot()를 사용하여 시스템 기본 선호 트리 중 알맞은 부분을 가져오는 방법을 보여 준다. 알맞은 기본 선호 노드를 가져오는 메소드 호출과 달리 API 사용법은 동일하다.

이번 예제는 간단한 게임이므로 여기서는 게임 용어를 엄격하지 않게 사용하기로 한다. 이 게임에서는 0 ~ 99 범위에서 임의의 수를 선택한다. 그 수가 이전에 저장된 값보다 높으면 "high score"를 업데이트한다. 또한 이 예제에서는 현재의 고득점을 보여 준다. 선호 설정 API 사용법은 간단한 편이다. 여기서는 getSavedHighScore()를 사용하여 저장된 값을 가져오고, 아직 저장된 고득점이 없으면 기본값인 -1을 제공하며, updateHighScore(int value)를 사용하여 새로운 고득점을 저장한다. HIGH_SCORE 키는 새로운 선호 설정 API 액세스에서 공유하는 상수이다.

private static int getSavedHighScore() {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.putInt(HIGH_SCORE, value);
 }



전체 프로그램은 다음과 같이 된다.

import java.util.*;
import java.util.prefs.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class High {
  static JLabel highScore = new JLabel();
  static JLabel score = new JLabel();
  static Random random = new Random(new Date().getTime());
  private static final String HIGH_SCORE = "High.highScore";

  public static void main (String args[]) {
    /* -- Uncomment these lines to clear saved score
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.remove(HIGH_SCORE);
    */

    EventQueue.invokeLater(
      new Runnable() {
        public void run() {
          JFrame frame = new JFrame("High Score");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          updateHighScoreLabel(getSavedHighScore());
          frame.add(highScore, BorderLayout.NORTH);
          frame.add(score, BorderLayout.CENTER);
          JButton button = new JButton("Play");
          ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              int next = random.nextInt(100);
              score.setText(Integer.toString(next));
              int old = getSavedHighScore();
              if (next > old) {
                Toolkit.getDefaultToolkit().beep();
                updateHighScore(next);
                updateHighScoreLabel(next);
              }
            }
          };
          button.addActionListener(listener);
          frame.add(button, BorderLayout.SOUTH);
          frame.setSize(200, 200);
          frame.setVisible(true);
        }
      }
    );
  }

  private static void updateHighScoreLabel(int value) {
    if (value == -1) {
      highScore.setText("");
    } else {
      highScore.setText(Integer.toString(value));
    }
  }

  private static int getSavedHighScore() {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    Preferences systemNode = Preferences.systemNodeForPackage(High.class);
    systemNode.putInt(HIGH_SCORE, value);
 }
}


그리고 몇 번의 실행 후 화면은 다음과 같이 된다. 61점이 그다지 높은 점수가 아니더라도 고득점이 될 가능성은 있다.

High Score 61













서로 다른 사용자로 애플리케이션을 실행해 보고 모두 동일한 고득점이 적용되는지 확인할 수 있다.
가져오기 및 내보내기

어떤 사용자나 시스템에서 다른 사용자 또는 다른 시스템으로 선호 설정을 전송하려는 경우, 해당 사용자/시스템에서 선호 설정을 내보낸 다음 다른 사용자/시스템으로 이를 가져올 수 있다. 선호 설정을 내보내기할 때 XML 형식의 문서로 내보내며, 독자들이 굳이 알 필요는 없지만 이 문서의 DTD는 http://java.sun.com/dtd/preferences.dtd에서 지정한다. exportSubtree() 메소드를 사용하여 하위 트리 전체를 내보내거나 exportNode() 메소드를 사용하여 단일 노드만 내보낼 수 있다. 두 메소드 모두 OutputStream 인수를 받아 저장 위치를 지정한다. XML 문서는 UTF-8 문자 인코딩 방식이다. 그런 다음 importPreferences() 메소드를 통해 데이터 가져오기가 이루어지는데, 이 메소드는 InputStream 인수를 받는다. API 측면에서 보면 시스템 노드/트리 가져오기와 사용자 노드 가져오기 사이에는 아무런 차이가 없다.

이전 예제에 몇 줄의 코드를 추가하면 새로 업데이트된 고득점을 high.xml 파일로 내보낸다. 추가된 코드 중에는 파일을 저장하고 예외를 처리하는 새로운 스레드를 시작하는 작업이 상당 부분을 차지한다. 단일 노드를 내보내는 부분은 단 세 줄이다.

    Thread runner = new Thread(new Runnable() {
      public void run() {
        try {
          FileOutputStream fis = new FileOutputStream("high.xml");
          systemNode.exportNode(fis);
          fis.close();
        } catch (Exception e) {
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
        }
      }
    });
    runner.start();


내보내기할 때 파일은 다음과 같이 된다.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE preferences SYSTEM "http://java.sun.com/dtd/preferences.dtd">
<preferences EXTERNAL_XML_VERSION="1.0">
  <root type="system">
    <map/>
    <node name="<unnamed>">
      <map>
        <entry key="High.highScore" value="95"/>
      </map>
    </node>
  </root>
</preferences>

루트 요소에 "system"이라고 말하는 유형 속성이 있다. 이는 그것이 노드의 유형임을 나타낸다. 또한 노드에는 "<unnamed>"라는 값의 이름 속성이 있다. High 클래스는 패키지에 포함되어 있지 않으므로 명명되지 않은 시스템 노드 영역에서 작업해야 한다. 이 항목 속성은 현재의 고득점 값(여기서는 95)을 제공하는데, 실제 값은 다를 수 있다.

이 예제에서는 import 코드를 포함시키지 않겠지만, 가져오기를 수행하려면 선호 설정에 대한 정적 메소드를 호출하고 알맞은 입력 스트림을 전달하면 된다.

FileInputStream fis = new FileInputStream("high.xml");
  Preferences.importPreferences(fis);
  fis.close();



XML 파일은 선호 설정이 시스템 또는 사용자 유형인지 여부에 대한 정보를 포함하므로 가져오기 호출에서 이 정보를 명시적으로 포함할 필요는 없다. 발생 가능한 일반적인 IOExceptions 외에도 가져오기 호출은 파일 형식이 잘못된 경우 InvalidPreferencesFormatException을 throw한다. 또한 내보낼 데이터를 백업 저장소로부터 올바르게 읽을 수 없다면 BackingStoreException을 throw하기도 한다.

이벤트 알림

원래 버전의 High 게임은 고득점 선호 설정을 업데이트한 다음 화면의 레이블을 업데이트하도록 명시적으로 호출한다. 이 작업을 수행하는 더 좋은 방법은 선호 설정 노드에 수신기를 추가하는 것인데, 그러면 값이 변경될 때 레이블의 값 업데이트가 자동으로 트리거될 수 있다. 따라서 고득점이 여러 위치로부터 업데이트되더라도 업데이트된 값을 저장한 다음 레이블을 업데이트하는 코드를 추가할 필요가 없다.

다음 두 줄은

 updateHighScore(next);
  updateHighScoreLabel(next);

알맞은 수신기를 추가하여 한 줄로 만들 수 있다.

updateHighScore(next);

그러한 작업에 꼭 알맞은 PreferenceChangeListener 및 그와 연결된 PreferenceChangeEvent가 있다. 수신기는 연결된 노드의 모든 변경 사항을 알게 되므로, 다음과 같이 어떤 키-값 쌍이 수정되었는지 확인해야 한다.

  PreferenceChangeListener changeListener =
        new PreferenceChangeListener() {

      public void preferenceChange(PreferenceChangeEvent e) {
        if (HIGH_SCORE.equals(e.getKey())) {
          String newValue = e.getNewValue();
          int value = Integer.valueOf(newValue);
          updateHighScoreLabel(value);
        }
      }
    };
    systemNode.addPreferenceChangeListener(changeListener);

PreferenceChangeEvent에는 세 가지 중요한 등록 정보가 있다. key, new value 그리고 node 자체이다. 그러나 new value가 선호 설정의 모든 편의 메소드를 포함하지는 않는다. 예를 들어, 값을 int로 검색할 수 없다. 그 대신 값을 수동으로 변환해야 한다. 수정된 High 클래스는 다음과 같이 된다.


import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;
import java.util.prefs.*;
import javax.swing.*;

public class High {
  static JLabel highScore = new JLabel();
  static JLabel score = new JLabel();
  static Random random = new Random(new Date().getTime());
  private static final String HIGH_SCORE = "High.highScore";
  static Preferences systemNode =
  Preferences.systemNodeForPackage(High.class);

  public static void main (String args[]) {
    /* -- Uncomment these lines to clear saved score
    systemNode.remove(HIGH_SCORE);
    */

    PreferenceChangeListener changeListener =
        new PreferenceChangeListener() {

      public void preferenceChange(PreferenceChangeEvent e) {
        if (HIGH_SCORE.equals(e.getKey())) {
          String newValue = e.getNewValue();
          int value = Integer.valueOf(newValue);
          updateHighScoreLabel(value);
        }
      }
    };
    systemNode.addPreferenceChangeListener(changeListener);

    EventQueue.invokeLater(
      new Runnable() {
        public void run() {
          JFrame frame = new JFrame("High Score");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          updateHighScoreLabel(getSavedHighScore());
          frame.add(highScore, BorderLayout.NORTH);
          frame.add(score, BorderLayout.CENTER);
          JButton button = new JButton("Play");
          ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
              int next = random.nextInt(100);
              score.setText(Integer.toString(next));
              int old = getSavedHighScore();
              if (next > old) {
                Toolkit.getDefaultToolkit().beep();
                updateHighScore(next);
              }
            }
          };
          button.addActionListener(listener);
          frame.add(button, BorderLayout.SOUTH);
          frame.setSize(200, 200);
          frame.setVisible(true);
        }
      }
    );
  }

  private static void updateHighScoreLabel(int value) {
    if (value == -1) {
      highScore.setText("");
    } else {
      highScore.setText(Integer.toString(value));
    }
  }

  private static int getSavedHighScore() {
    return systemNode.getInt(HIGH_SCORE, -1);
  }

  private static void updateHighScore(int value) {
    systemNode.putInt(HIGH_SCORE, value);
    // Save XML in separate thread
    Thread runner = new Thread(new Runnable() {
      public void run() {
        try {
          FileOutputStream fis = new FileOutputStream("high.xml");
          systemNode.exportNode(fis);
          fis.close();
        } catch (Exception e) {
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
          Toolkit.getDefaultToolkit().beep();
        }
      }
    });
    runner.start();
  }
}



PreferenceChangeListener/Event 클래스 쌍 외에도 선호 설정 변경을 알리기 위한 NodeChangeListenerNodeChangeEvent 콤보가 있다. 그러나 이는 특정 노드의 값을 변경하는 것이 아니라 알림 노드를 추가하고 제거하는 용도이다. 물론 선호 설정 뷰어와 같은 것을 작성하려면 노드가 나타나는지 여부 및 그 시점을 알 필요가 있으므로 이 클래스도 관심사가 될 수 있다.

전체 선호 설정 API는 애플리케이션의 수명이 끝나더라도 데이터베이스 시스템에 의존할 필요 없이 데이터를 저장하는 매우 편리한 방법이 될 수 있다. API에 대한 자세한 내용은 Sir, What is Your Preference? 영문기사를 참조한다.

반응형

JTabbedPane 컴포넌트는 특별한 Swing 컨테이너로, 컴포넌트를 각 탭에 대한 패널 내에 배치할 수 있도록 해줍니다. 탭의 컴포넌트를 보려면 해당 탭을 선택하십시오. 기술적으로 표현하자면, 하나의 컴포넌트는 각각의 탭과 연관됩니다. 그리고 그 컴포넌트는 다른 컴포넌트들을 포함하는 패널인 경우가 일반적입니다. 탭마다 설정할 수 있는 제목 글자와 아이콘으로 각각의 탭을 식별합니다. JTabbedPane 컴포넌트에 대한 첫 번째 Core Java Technologies Tech Tip은 2001년 7월에 간단한 소개 팁과 함께 발행되었습니다.

탭 위에 컴포넌트를 사용할 수 있도록 지원하는 JTabbedPane의 방법은 다음과 같습니다.

  • public void setTabComponentAt(int index, Component component)
  • public Component getTabComponentAt(int index)
  • public int indexOfTabComponent(Component tabComponent)

첫 번째 메소드는 컴포넌트를 탭과 연관시킵니다. 두 번째 메소드는 컴포넌트를 돌려주며 마지막 메소드는 컴포넌트와 연관되어 있는 탭이 있으면 그것을 알려줍니다. 대개 사용자들은 첫 번째 방법만 사용하지만 나머지 것들도 이용할 수 있습니다.

늘 사용할 수 있는 태스크로 시작해 봅시다. 아이콘을 구현해 보면 도움이 될 것입니다. 이것은 아이콘 위에 작은 x를 그리는 것입니다. 문자 x를 버튼 레이블로 사용할 수도 있겠지만 여기서는 그 방법을 사용하지 마십시오. 일반적으로 박스 안에 있는 x는 윈도우를 닫는 명령을 의미하므로 여기에서는 탭 닫기 기능에 대한 유용한 표지 역할을 하게 됩니다.

class CloseIcon implements Icon {
  public void paintIcon(Component c, Graphics g, int x, int y) {
    g.setColor(Color.RED);
    g.drawLine(6, 6, getIconWidth() - 7, getIconHeight() - 7);
    g.drawLine(getIconWidth() - 7, 6, 6, getIconHeight() - 7);
  }
  public int getIconWidth() {
    return 17;
  }
  public int getIconHeight() {
    return 17;
  }
}

탭 컴포넌트를 생성하기 전에 프로그램의 프레임워크부터 구성합시다. 이 프레임워크는 위에 JTabbedPane이 있는 프레임을 생성하고 여러 개의 탭을 추가합니다.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class CloseTabs {
  public static void main(String args[]) {
    Runnable runner = new Runnable() {
      public void run() {
        JFrame frame = new JFrame("JTabbedPane");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTabbedPane jtp = new JTabbedPane();
        frame.add(jtp, BorderLayout.CENTER);
        for (int i=0; i<5; i++) {
          JButton button = new JButton("Card " + i);
          jtp.add("Btn " + i, button);
          // new CloseTabButton(jtp, i);
        }
        frame.setSize(400, 200);
        frame.setVisible(true);
      }
    };
    EventQueue.invokeLater(runner);
  }
}

이 프로그램은 5개의 탭을 생성하며 각 탭에는 JButton이 하나씩 있습니다. 탭 타이틀은 "Btn"에 탭 위치를 이어 붙인 것입니다.

프로그램은 달리 무엇을 하지 않아도 잘 수행될 것입니다. 그러나 탭에 닫기 버튼이 없습니다. 탭에 닫기 버튼을 추가하려면 해당 탭의 제목 글자와 아이콘은 유지하면서 앞에서 본 CloseIcon을 버튼에 추가합니다. (예에서는 탭 아이콘을 사용하지 않았으나 클래스 정의에는 하나를 포함하여 이 예제 밖에서 재사용할 수 있도록 했습니다.) 정의의 마지막 파트로, 버튼을 눌렀을 때의 처리를 위해 버튼에 대한 ActionListener가 필요합니다. 사용자가 버튼을 누르면 탭이 pane에서 제거되도록 합니다.

class CloseTabButton extends JPanel implements ActionListener {
  private JTabbedPane pane;
  public CloseTabButton(JTabbedPane pane, int index) {
    this.pane = pane;
    setOpaque(false);
    add(new JLabel(
        pane.getTitleAt(index),
        pane.getIconAt(index),
        JLabel.LEFT));
    Icon closeIcon = new CloseIcon();
    JButton btClose = new JButton(closeIcon);
    btClose.setPreferredSize(new Dimension(
        closeIcon.getIconWidth(), closeIcon.getIconHeight()));
    add(btClose);
    btClose.addActionListener(this);
    pane.setTabComponentAt(index, this);
  }
  public void actionPerformed(ActionEvent e) {
    int i = pane.indexOfTabComponent(this);
    if (i != -1) {
      pane.remove(i);
    }
  }
}

이제 사용자가 직접 만든 tabbed pane에서 CloseTabButton을 재사용할 수 있습니다.

tabbed pane의 사용에 대한 자세한 정보는 자바 튜토리얼 How to Use Tabbed Panes를 참조하십시오.

저자 JZ Ventures사의 사장 겸 대표 컨설턴트인 John Zukowski

이 글의 영문 원본은
http://blogs.sun.com/CoreJavaTechTips/entry/placing_components_on_tabs2
에서 보실 수 있습니다.

+ Recent posts