반응형
Java 코딩 지침(2004/4/14)

심우곤(wgshim) 그린벨시스템즈 정보기술연구소

본 문서는 Geotechnical Software 에서 작성한 2004 년 1월 버전의 Geosoft 의 Java Programming Style Guidelines 문서를 근간으로 하여 Sun 의 코딩 표준 권고안 및 기타 표준안들을 참고하여 작성한 것입니다. 개선된 사항을 반영하기 위하여 예고없이 변경될 수 있으며 본 문건을 통해 발생한 문제에 대해 책임을 지지 않습니다.


목 차


1 들어가기

본 문서는 Java 개발자 커뮤니티 내에서 보편적인 Java 코딩 권고안들을 나열하고 있습니다. 이 권


고안들은 이미 널리 표준으로 받아들여지고 있는 몇몇 문건들(예를 들면, [1], [2], [3], [4], [5])에


기반을 두고 있으며, 전세계의 수 많은 소프트웨어 전문가들의 피드백을 받아들여 작성되었습니다.


기존 지침들이 갖는 주된 단점은, 지침들이 너무 일반적이다보니 보다 구체적이고 상세한 규칙들(예


를 들면, 명명 규칙:naming rule)이 확립되어야 할 필요가 있다는 것입니이다. 따라서, 본 지침은 여


타의 지침들에 비하여 프로젝트의 코드 검토 단계에 사용하기 용이하도록 각 항목마다 주석과 예제


를 두었습니다. 추가적으로, 일반적으로 프로그래밍 권고안들은 코딩 스타일 이슈와 언어 고유한 기


술적 이슈들을 혼합하여 기술함으로써 혼란을 초래하는 경향이 있기 때문에, 본 문서에서는 Java 언


어의 기술적인 권고안에 대해서 일절 언급하지 않고 오로지 프로그래밍 스타일에 대해서만 다루고


자 합니다. IDE 도구를 사용하는 개발 환경에서는 접근제한자, 키워드/문법 하일라이팅, 자동 포맷


팅 등을 제공하여 가독성을 향상시킬 수 있을 것입니다. 하지만 프로그래머라면 절대로 그러한 기능


종속되어서는 안됩니다. 소스 코드를 단순히 IDE 도구 내에서 개발되는 코드뿐 아니라 더 큰/다


양한 범위로 확대하여야 하며, 어떠한 IDE 도구를 사용하는지와 상관없이 가독성을 극대화할 수 있


도록 소스 코드를 작성하여야만 합니다.

1.1 권고안 레이아웃

권고안들은 주제별로 그룹지어져 있으며, 각각의 권고안들은 코드 검토 시 손쉽게 참조할 수 있도록

숫자를 부여하였습니다. 본 문서에서 사용할 권고안 레이아웃은 다음과 같습니다:


지침에 대한 간략한 설명
적용이 가능한 경우, 적용사례
동기(motivation), 배경 및 추가적인 정보


동기 섹션은 중요합니다. 코딩 표준과 지침들은 일종의 "성전(聖戰)" 과 같은 성격을 띄기 마련입니


다. 따라서 각 권고안의 배경을 언급하는 것은 중요합니다.

1.2 권고안의 중요도

지침 섹션에서 사용되는 반드시 한다(must), 한다(should), 할 수 있다(can) 와 같은 용어들은 특별

한 의미를 가집니다. 반드시 한다는 필히 준수해야 한다는 것을, 한다는 강한 권고를, 할 수 있다는

일반적인 지침을 의미합니다.

2 일반적인 지침들

1. 가독성을 증진시킬 수 있는 타당한 이유가 있다면 본 지침을 어길 수도 있다.
 
본 지침의 궁극적인 목표는 가독성을 향상시키는 것입니다. 가독성이 향상되면 이해가 용이해지고 유지보수가 수월해지며 일반적으로 코드의 품질도 좋아집니다. 일반적인 지침을 거론하는 본 지침서에서 모든 상황들을 감안한 지침을 제공해 드릴 수 없기 때문에, 프로그래머의 판단에 의하여 가변적으로 활용하실 수 있습니다.

3 명명 관례(Naming Conventions)

3.1 일반적인 명명 관례

2. 패키지를 표현하는 이름은 모두 소문자를 사용한다.
mypackage, com.company.application.ui
이 패키지 명명 관례는 Java 핵심 패키지들의 명명에 Sun 社 가 사용하고 있는 것입니다. 패키지 이름의 시작부는 반드시 도메인 이름으로 소문자를 사용해야만 합니다.

3. 타입을 표현하는 이름은 대소문자를 혼용할 수 있지만, 반드시 명사를 사용하고 시작 글자를 대문자로 지정한다.
Account, EventHandler
Java 개발자 커뮤니티에서 사용하는 일반적인 관습이며, Sun 社 가 Java 핵심 패키지들의 타입 명명에 사용하고 있는 것입니다.

4. 변수의 이름은 대소문자를 혼용할 수 있지만 반드시 소문자로 시작한다.
account, eventHandler
Java 개발자 커뮤니티에서 사용하는 일반적인 관습이며, Sun 社 가 Java 핵심 패키지들의 변수이름 명명에 사용하고 있는 것입니다. 변수와 타입을 손쉽게 구별할 수 있도록 하면, 이름의 충돌이 발생하는 것을 효과적으로 해결할 수 있게 됩니다. 예) Account account; // 선언문

5. 상수(final 변수)를 표현하는 이름은 반드시 모두 대문자로 지정하되 '_' 를 사용하여 단어들을 구분한다.
MAX_ITERATIONS, COLOR_RED
Java 개발자 커뮤니티에서 사용하는 일반적인 관습이며, Sun 社 가 Java 핵심 패키지에 사용하고 있는 것입니다. 일반적으로, 이러한 상수의 사용은 최소화해야만 합니다. 대다수의 경우 상수 변수를 메소드로 구현하는 것이 더 낫습니다:
int getMaxIterations()     // NOT: MAX_ITERATIONS = 25
{
  return 25;
}

이러한 양식이 보다 읽기에 편하며, 클래스의 값을 참조하는 일관된 인터페이스를 제공할 수 있다는 장점을 가집니다.
 

6. 메소드의 이름은 대소문자를 혼용할 수 있지만 반드시 동사를 사용하며 소문자로 시작한다.
getName(), computeTotalWidth()
Java 개발자 커뮤니티에서 사용하는 일반적인 관습이며, Sun 社 가 Java 핵심 패키지에 사용하고 있는 것입니다. 이 방식은 변수의 이름을 지을 때 사용하는 관례와 동일합니다. 하지만, Java 에서는 이미 특별한 양식(getter/setter, 동사로 시작하는 이름, JVM Spec, 등)에 의거하여 메소드는 변수를 구분합니다.

7. 축약형(Abbreviation) 과 두문자어형(頭文字語: Acronym) 을 이름에 사용할 경우에는 전부 대문자로 지정하지 않는다.
exportHtmlSource();    // exportHTMLSource(); 가 아님
openDvdPlayer();       // openDVDPlayer(); 가 아님
축약형 혹은 두문자어형 이름을 모두 대문자로 지정하게 되면 앞서 기술한 명명 지침들과 충돌이 발생하게 됩니다 (대표적으로 상수에 대한 명명 지침과 혼동될 수 있습니다). 그렇다고 이 유형의 이름을 dVD, hTML 등 과 같이 다양한 형태로 지정할 경우에는 가독성이 떨어집니다. 또 다른 문제점으로는 위의 예제에서 살펴볼 수 있는 바와 같이, 이 유형의 이름이 다른 이름과 결합되는 경우 가독성이 극도로 나빠진다는 것입니다. 후속하는 단어가 있을 경우는 더욱 각별히 주의해야 합니다.

8. private 접근 제한자를 갖는 클래스 변수에 '_' 접미사를 사용한다.
class Well
{
  private int  depth_;
  ...
}
변수의 이름이나 타입과는 별개로, 변수의 범위(scope)는 매우 중요한 특성입니다. 접미사 '_' 를 사용함으로써 클래스 범위의 변수(로컬 변수가 아닌)임을 쉽게 구별할 수 있게 됩니다. 클래스 변수는 메소드 내에서 선언되는 로컬 변수에 비해 중요도가 높기 때문에 프로그래머가 각별히 주의해야 합니다. '_' 를 사용하는 명명 규칙은 부가적으로 setter 메소드에서의 이름 충돌문제를 깔끔하게 해결해 줍니다: void setDepth (int depth)
{
  depth_ = depth;
}
제기될 수 있는 이슈거리는 '_' 를 변수의 접두사로 쓸 것인가 접미사로 쓸 것인가에 대한 것입니다. 두 가지 모두 일반적으로 널리 사용되는 방법이기는 합니다만, 이름을 읽기 편하다는 측면에서 후자의 것을 권고합니다. 변수의 이름에 볌위를 식별할 수 있도록 하자는 제안은 한 동안 많은 논쟁을 불러일으켰습니다. 그런데 현재에는 이러한 방법이 수용되어 전문 개발자 커뮤니티에서도 일반적인 관례로 점차 정착이 되고 있는 것 같습니다.
 

9. 일반적인 변수의 이름은 타입의 이름과 동일하게 지정한다.
void setTopic (Topic topic)      // void setTopic (Topic value) 이 아님
                                 // void setTopic (Topic aTopic) 이 아님
                                 // void setTopic (Topic x) 이 아님

void connect (Database database) // void connect (Database db) 가 아님
                                 // void connect (Database oracleDB) 가 아님
용어나 이름의 수를 줄이는 것이 코드의 복잡도를 줄여줍니다. 또한 변수의 이름만으로도 그 타입을 손쉽게 유추할 수 있게 해준다는 장점도 있습니다. 만약 어떠한 이유에선가 이러한 관례가 맞지 않는 것처럼 느끼신다면, 이는 분명 타입이름 자체를 잘못 지정한 것입니다. 일반적이지 않은 변수들은 각기 나름의 역할(role)을 가지고 있습니다. 이러한 변수들은 역할과 변수의 타입을 결함하여 이름을 짓곤 합니다. Point startingPoint, centerPoint;
Name  loginName;

 

10. 모든 이름은 영어로 작성한다.
fileName;    // filNavn 나 파일이름 이 아님
국제적인 개발에 있어서 영어가 선호되기 때문입니다.

11. 넓은 범위에 영향을 미치는 변수는 긴 이름을 부여하고, 좁은 범위의 변수는 짧은 이름을 부여한다 [1].
 
임시 저장공간이나 인덱스로 사용되는 Scratch variable (주: 의미있는 값을 갖지 않고 그때그때 상황에 따라 값들을 잠시 보관해 두기 위한 변수로, 대개 보유한 값이 얼마 후에 의미가 없어지거나 삭제됨)들은 매우 짧은 이름을 부여하십시요. 프로그래머가 그러한 변수들을 읽음과 동시에, 이 변수는 몇 라인 뒤에 그 값이 유효하지 않을 것임을 짐장할 수 있게 해야 합니다. 보편적인 scratch variable 로는 정수를 저장하는 i, j, k, m, n 가 있고 문자를 저장하는 c, d 가 있습니다.

12. 호출하려는 객체의 이름을 통해 의미를 짐작할 수 있다면, 메소드의 이름을 간략화할 수 있다.
line.getLength();    // line.getLineLength(); 가 아님
클래스 선언 시에는 후자의 것이 자연스럽지만, 사용할 때에는 위 예에서 볼 수 있듯이 중언부언하는 느낌을 줄 수 있습니다.


3.2 특수한 명명 관례

13. get/set 이라는 용어는 반드시 애트리뷰트에 직접 접근하는 메소드에 사용한다.
employee.getName();
matrix.getElement (2, 4);
employee.setName (name);
matrix.setElement (2, 4, value);
이 접근 메소드 명명 관례는 Java 핵심 패키지들의 명명에 Sun 社 가 사용하고 있는 것입니다. 실제 자바빈즈를 작성할 때에는 이 명명규칙을 준수해야 합니다.

14. is 접두사를 불리언 변수와 메소드에 사용한다.
isSet, isVisible, isFinished, isFound, isOpen
이 불리언 메소드와 변수에 대한 명명 관례는 Java 핵심 패키지들의 명명에 Sun 社 가 사용하고 있는 것입니다. 실제 자바빈즈를 작성할 때에는 이 명명규칙을 준수해야 합니다. is 접두사를 사용함으로써 일반적으로 statusflag 와 같은 좋지 않은 불리언 이름을 선택하는 문제를 해결할 수 있습니다. isStatusisFlag 는 간결하지만 프로그래머에게 의미를 풍부하게 전달할 수 없다는 점에서 바람직하지 못합니다. 일부 상황에서는 is 접두사가 아닌 보다 더 적합한 접두사를 사용할 수도 있습니다. has, can, should 접두사들을 그런 대안으로 활용하실 수 있을 것입니다: boolean hasLicense();
boolean canEvaluate();
boolean shouldAbort = false;

 

15. compute 라는 용어는 무엇인가를 계산(시간이 소요되는)하는 메소드에 사용할 수 있다.
valueSet.computeAverage();  matrix.computeInverse()
프로그래머로 하여금 보는 즉시 이 메소드는 잠재적으로 시간이 소요되는 작업을 수행하고 있다는 것을 주지심으로써, 이 메소드의 결과를 반복해서 사용하고자 할 경우에 프로그래머는 계산된 값을 캐시해 둘 것을 고려하게 만들 수 있습니다. 용어를 일관성있게 사용하는 것은 가독성을 높이는 지름길입니다.

16. find 라는 용어는 무엇인가를 찾는 메소드에 사용할 수 있다.
vertex.findNearestVertex();   matrix.findMinElement(); 
프로그래머로 하여금 보는 즉시 이 메소드는 최소한의 계산을 통해 요청하는 결과를 찾을 수 있는 메소드라는 것을 알려주십시오. 용어를 일관성있게 사용하는 것은 가독성을 높이는 지름길입니다.

17. initialize 라는 용어는 객체나 개념이 확립되어지는 곳에 사용할 수 있다.
printer.initializeFontSet();
미국식 initialize 가 영국식 initialise 보다 바람직합니다. init 라는 축약형 이름은 절대로 사용하지 마십시오.

18. JFC (Java Swing) 변수들은 각 컴포넌트의 타입을 접두사로 사용한다.
widthScale, nameTextField, leftScrollbar, mainPanel, fileToggle, minLabel, printerDialog
변수의 이름 자체가 자신이 어떤 타입의 변수인지 알려주기 때문에 객체가 어떤 자원인지 쉽게 알 수 있습니다.

19. 컬렉션의 이름은 반드시 복수형으로 사용한다.
vertex (one vertex),   vertices(a collection of vertices)
account (one account),    accounts(a collection of accounts)
 
여기서의 컬렉션은 java.util.Collection 변수와 단순 배열과 같은 Collection 의 자손들을 의미합니다.

20. n 접두사는 객체의 개수를 나타내는 변수에 사용한다.
nPoints, nLines
이 표기법은 개체의 개수를 나타내는 수식의 표기법에서 차용한 것입니다. Sun 社 는 Java 핵심 패키지에서 이런 용도로 num 접두사를 사용한다는 것에 주목해 보겠습니다. 이는 필경 number of 에 대한 축약어를 의미할 것입니다만, 그 보다는 number 를 연상시킴으로써 변수 이름을 이상하게 만들거나 혼동을 불러일으킬 수 있습니다. 만약 "number of" 를 더 선호하신다면, n 대신에 numberOf 접두사를 사용하실 수도 있을겁니다. num 접두사는 사용하시지 않기를 강력하게 권합니다.
 

21. No 접미사는 엔터티 번호를 나타내는 변수에 사용한다.
tableNo, employeeNo
이 표기법은 엔터티의 번호를 나타내는 수식의 표기법에서 차용한 것입니다. 또 다른 우아한 표기 방법으로는 i 을 접두사로 사용하는 것입니다: iTable, iEmployee. 이 방법은 효과적으로 변수에 iterator 로의 역할을 부여하게 됩니다.
 

22. Iterator 변수들은 i, j, k 등 과 같은 이름을 사용한다.
while (Iterator i = pointList.iterator(); i.hasNext(); ) {
  :
}

for (int i = 0; i < nTables; i++) {
  :
}
 
이 표기법은 iterator 를 나타내는 수식의 표기법에서 차용한 것입니다. j, k 등과 같은 이름의 변수들은 중첩된 반복문 내에서만 사용합니다.
 

23. 대응하는 단어가 있는 이름은 반드시 함께 사용한다 [1].
get/set, add/remove, create/destroy, start/stop, insert/delete, increment/decrement, old/new, begin/end, first/last, up/down, min/max, next/previous, old/new, open/close, show/hide
대칭을 이루도록 함으로써 복잡도를 줄일 수 있습니다.

24. 축약형 이름의 사용은 피한다.
computeAverage();     // compAvg(); 가 아님
고려해 볼 두 종류의 단어들이 있습니다. 먼저 프로그래밍 언어를 구사하는 데에 있어 빈번하게 사용되는 일반적인 단어들이 있습니다. 이들 단어는 절대로 축약형을 사용하지 말아야 합니다: command   대신 cmd
copy      
대신 cp
point    
대신 pt
compute  
대신 comp
initialize
대신 init
등등.
그 다음, 도메인에서 사용하는 특수한 두문자어나 축약어들은 축약형을 그대로 사용합니다. 이들 구문은 굳이 풀어 나열하지 않고 축약형을 사용하십시오. 다음과 같이 사용하시면 안됩니다: html 대신 HypertextMarkupLanguage
cpu
대신 CentralProcessingUnit
pe  
대신 PriceEarningRatio
등등.
 

25. 불리언 변수 이름은 절대로 부정적인(거짓인) 이름을 사용하지 않는다.
boolean isError;    // isNotError 가 아님
boolean isFound;    // isNotFound 가 아님
문제는 불리언 변수에 부정적인 이름을 사용할 경우, not 연산자를 사용할 경우 부정의 부정을 계산해야 하는 혼동을 초래한다는 것입니다. 예를 들어, !isNotError 에서 처럼, 신속하게 이것이 무엇을 의미하는지 인지할 수 없게 됩니다.

26. 관련있는 상수(final 변수)들은 공통 타입의 이름을 접두사로 사용하여 그룹핑한다.
final int COLOR_RED   = 1;
final int COLOR_GREEN = 2;
final int COLOR_BLUE  = 3;

final int MOOD_HAPPY  = 1;
final int MOOD_BLUE   = 2;
 
이 표기방법은 상수들이 어디에 속해있는지 상수가 무엇을 나타내고 있는지 식별하는데 도움이 됩니다.

27. 예외(Exception) 클래스들은 Exception 이라는 접미사를 사용한다.
class AccessException
{
  :
}
 
사실 예외 클래스들은 프로그램의 핵심 디자인에 해당되지 않기 때문에, 이와 같은 방식으로 이름을 지정함으로써 상대적으로 클래스들 중에서 눈에 띄게(구분을 용이하게) 해두는 것이 좋습니다. 이 명명 관례는 Java 기본 라이브러리들에 Sun 社 가 사용하고 있는 표준입니다.

28. 디폴트 인터페이스 구현은 Default 라는 접두사를 사용할 수 있다.
class DefaultTableCellRenderer
implements TableCellRenderer
{
  :
}
 
이 방법은 인터페이스 메소드들에 대한 디폴트 처리작업을 제공하는 구현물에, 간단하게 이름을 부여하는 방법으로 널리 사용되고 있는 방법입니다. Default 접두사를 클래스의 이름에 부여하는 이 명명 관례는, Java 기본 라이브러리들에 Sun 社 가 채택한 방식입니다.

29. 함수(객체/결과를 리턴하는 메소드)의 이름은 '처리 후 무엇을 리턴하는지'를 의미하고, 프로시저(void 메소드)의 이름은 '무엇을 처리하는지'를 의미한다.
 
메소드가 무엇을 하는지. 의도하지 않는 것들이 무엇인지를 명확하게 해주기 때문에, 가독성을 높여줍니다. 또한 이 방법은 예기치 못한 부작용(side effect)들로부터 코드를 명쾌하게 유지시켜 줄 수 있습니다.


4 파일

30. Java 소스 파일의 확장자는 .java 이다.
Point.java
Java 개발툴에 의해 강제적으로 준수해야 하는 규칙입니다.

31. 클래스는 각각의 파일에 선언하며, 클래스의 이름과 파일의 이름이 동일해야 한다. 이너(inner) 클래스나 private 으로 선언된 secondary 클래스들은 굳이 별도의 파일로 구분하지 않고도 primary 클래스와 같은 파일 내에서 선언할 수 있다.
 
Java 개발툴에 의해 강제적으로 준수해야 하는 규칙입니다.

32. 파일의 내용물은 반드시 80 컬럼을 벗어나지 않는다.
 
80 컬럼은 다양한 편집기, 프린터, 터미널 에뮬레이터, 디버거에서도 일반적인 길이로, 각 라인이 80 컬럼을 넘지 않도록 소스코드를 작성한다면 다양한 환경의 여러 개발자들과 파일을 공유해서 사용할 수 있습니다. 이는 프로그래머들 간에 파일을 전달하였을 때 의도하지 않은 들여쓰기나 개행문자가 포함되어 가독성이 떨어지는 것을 예방합니다.

33. 탭(TAB) 문자나 페이지 구분(page break) 문자와 같은 특수한 문자들은 절대로 사용하지 않는다.
 
이러한 문자들은 프로그래머가 여럿이거나 다수의 플랫폼에서 개발하는 환경에서, 편집기 별, 프린터 별, 터미널 에뮬레이터 별, 디버거 별로 지정된 설정에 따라 소스코드를 들쭉날쭉하게 만들어 가독성을 떨어뜨리게 됩니다.

34. 여러 라인으로 분리한 문장들은 반드시 명확하게 만든다 [1].
totalSum = a + b + c +
           d + e);
function (param1, param2,
          param3);
setText ("Long line split" +
         "into two parts.");
for (tableNo = 0; tableNo < nTables;  
     tableNo += tableStep)
한 문장이 80 컬럼을 벗어날 때 라인을 분리해서 작성하게 됩니다. 어떻게 라인을 분리해야 하는지에 대한 엄격한 규칙을 제시하기는 어렵습니다만, 위 예제들은 일반적인 힌트를 제공해줄 것입니다: 일반적으로:
  • 콤마(,) 뒤에서 분리한다.
  • 연산자 뒤에서 분리한다.
  • 이전 라인에서의 표현식 시작 부분에 맞추어 정렬한다.


5 문장

5.1 package 와 import

35. package 문은 반드시 파일의 첫번째 라인에 나타나야 하며, 모든 파일은 특정 패키지에 소속된다.
 
package 문의 위치는 Java 언어 코딩 표준에서 권고하고 있는 것입니다. 모든 파일들을 실제 패키지(디폴트 패키지보다는 이름이 있는 패키지)에 두는 것은 Java 객체 지향 프로그래밍 기법에 도움을 줍니다.

36. import 문은 반드시 package 문 뒤에 나와야 한다. import 문은 가장 기본이 되는 패키지들 부터 순차적으로 정렬하며, 관련있는 패키지들은 함께 묶어 두고 빈 라인을 삽입하여 일목요연하게 정리한다.
import java.io.*;
import java.net.*;

import java.rmi.*
import java.rmi.server.*;

import javax.swing.*;
import javax.swing.event.*;

import org.linux.apache.server.*;
 
import 문의 위치는 Java 언어 코딩 표준에서 권고하고 있는 것입니다. 많은 import 문들을 정렬해두면 편리하게 import 문들을 검토할 수 있고, 이를 통하여 현재 이 패키지가 어떤 용도로 설계되었는지를 쉽게 파악할 수 있습니다. 또한 import 문을 그룹핑하면 관련된 정보들을 공통의 유닛으로 관리할 수 있기 때문에 복잡도를 줄일 수 있습니다.

37. import 문을 사용할 때에는 와일드 카드 문자(*)를 사용하지 않는다.
import java.io.*;

대신:

import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.PrintWriter;
import java.io.FileNotFoundException;
 
사실 #36 의 예제와 같이 import 문에 와일드 카드 문자인 * 를 사용하는 것은, 프로그래머에게는 편리할지 모르지만 성능에 얼마간 영향을 미치게 됩니다. 더구나 import 문만 보고도 정확하게 현재 클래스/인터페이스가 어떤 작업을 할 것인지 예측할 수 있도록 하려면, 명시적으로 사용하는 클래스와 인터페이스들에 대해서만 import 하시는 것이 필요합니다.


5.2 클래스와 인터페이스

38. Class 와 Interface 의 선언은 다음과 같은 방식으로 조직화하여 사용한다:
  1. Class/Interface 문서(javadoc 주석)
  2. classinterface 선언문
  3. 클래스 변수(static으로 선언된) 들을 public, protected, package (접근제한자가 없는), private 순서대로 나열한다.
  4. 인스턴스 변수들을 public, protected, package (접근제한자가 없는), private 순서대로 나열한다.
  5. 생성자.
  6. 메소드 (메소드에는 특별한 순서가 없음).
 
각각의 클래스/인터페이스 구성요소들의 등장 위치를 지키게되면, 현재 코드 상에 어떤 요소들이 다음에 등장할 것인지 예측할 수 있게되어 복잡도를 낮추게 됩니다.


5.3 메소드

39. 메소드 지시자는 다음의 순서대로 사용한다:
<access> static abstract synchronized <unusual> final native
만약 <access> 지시자가 존재한다면 반드시 맨 처음에 나타나야 한다.
 
<access> 지시자는 public, protected, private 중 하나이고, <unusual> 부분은 volatiletransient 중 하나가 지정됩니다. 여기서 가장 중요한 점은 접근(access) 지시자가 맨 처음에 나타나야 한다는 것입니다. 사용할 수 있는 다양한 지시자들이 있겠지만, 이는 매우 중요한 사항이기 때문에 반드시 메소드 선언문에 반영되어야 합니다. 기타 지시자들의 순서는 덜 중요하지만 일관된 관례를 따르는 것이 바람직합니다. 여기서 제안한 지시자 나열 순서는 Teach Yourself Java in 21 Days 의 저자인 Charles L. Perkins 씨가 자신의 책에서 제시한 방식을 차용한 것입니다.


5.4 타입

40. 타입 컨버전(변환)은 반드시 명시적으로 한다. 묵시적인 타입 컨버전(변환)은 절대로 사용하지 않는다.
floatValue = (float) intValue;     // floatValue = intValue; 가 아님
위 예제의 경우, 프로그래머가 서로 다른 두 타입을 사용하였으며 그가 의도적으로 두 타입을 혼합해서 사용하고 있음을 알려줍니다. 만약 묵시적으로 floatValue = intValue 라고 하였다면 의도적으로 그러한 것인지, 타입 컨버전을 깜빡 한 것인지 혼동할 수 있습니다.

41. 배열 지시자([])는 변수의 이름 뒤가 아니라 타입의 이름 뒤에 나온다.
int[] daysOfMonth;      // int daysOfMonth[]; 가 아님
배열은 타입의 한 속성이지 변수의 속성이 아니기 때문입니다. 어떤 이유에서인지 Java 에서는 두 가지 모두 문법적으로 허용하고 있습니다만, 하나로 통일하는 것이 좋겠습니다.


5.5 변수

42. 변수는 선언된 지점에서 초기화하며, 가능한 사용범위를 최소화하여 선언한다.
 
이 규칙은 어느 시점에서든 변수가 유효한 값을 가진다는 것을 보장해줍니다. 종종 선언하는 시점에 변수에 유효한 값을 초기화하는 것이 불가능한 경우가 있습니다만, 그러한 경우에도 초기화하지 않은 상태로 내버려두는 것보다는 임의의 값이라도 사용하여 초기화 해두는 것이 좋습니다.

43. 변수는 절대로 하나 이상의 의미를 가져서는 안된다.
 
무의미한 이름을 부여한 변수(scratch 변수)를 가지고 이값 저값을 할당하여 사용하게 되면, 어느 순간 이 변수가 현재 어떤 의미의 값을 가지고 있는지 모호해지는 경우가 발생합니다. 일관되고 유일한 의미를 부여함으로써 가독성을 향상시키고 더불어 부작용까지 예방할 수 있습니다.

44. static 으로 선언된 클래스 변수들은 절대로 public 으로 선언하지 않는다.
 
public 변수들은 Java 의 정보은닉과 캡슐화 컨셉에 위배됩니다. 대신 변수를 private 으로 선언하시고 이 변수를 접근할 수 있는 메소드를 사용하게 하십시오. 한 가지 예외적인 상황은 클래스가 데이터 구조로만 사용될 때입니다. 이 경우 클래스는 어떠한 행위(메소드)도 갖지 않고 오로지 데이터를 보관하는, 즉 C++ 에서의 struct 와 동일한 형태로 사용됩니다. 이 경우에는 클래스의 인스턴스 변수들을 public 으로 선언할 수도 있습니다 [2].

45. 동일한 타입의 변수 중 관련있는 변수들은 하나의 구문에서 선언할 수 있다.
즉, 관련이 없는 변수들을 같은 라인에서 선언하지 않는다.
float  x, y, z;
float  revenueJanuary, revenueFebrury, revenueMarch;
위의 예제를 여러 라인에 나누어 선언하는 것은 바람직하지 않습니다. 변수들을 그룹핑함으로써 가독성을 높일 수 있기 때문입니다. 그러나 여기서 주의할 점은, 대다수의 경우에서는 이 규칙보다 각각의 변수는 선언 시 초기화 한다는 규칙이 우선적으로 적용되어야 한다는 것입니다.

46. 변수의 생존기간을 가능한 짧게 유지한다.
 
변수에 대한 조작을 작은 범위 내에 국한시킴으로써, 영향과 부작용을 통제하는 것이 용이해집니다.


5.6 반복문

47. 반드시 반복을 제어하는데 사용되는 문장들만 for() 구문 내에 포함시킨다.
sum = 0;                   // NOT:     for (i=0, sum=0; i<100; i++)
for (i=0; i<100; i++)      //            sum += value[i];
  sum += value[i];
관리의 용이성과 가독성을 향상시킬 수 있습니다. 무엇이 반복문을 제어하고 무엇이 반복문 내에서 사용되는지 명쾌하게 하십시오.

48. 반복문에 사용하는 변수는 반복문 직전에 초기화한다.
boolean isDone = false;  // NOT:   boolean  isDone = false;
while (!isDone) {        //         :
  :                      //        while (!isDone) {
}                        //          :
                                   }
 

49. do .... while 문의 사용을 피한다.
 
여기에는 두 가지 이유가 있습니다. 첫번째, 제어문에 사용되는 구문 요소(키워드)들이 분산되어 있어 난잡합니다. do .... while 문을 사용한 모든 문장은 while 문이나 for 문을 사용하여 동일하게 바꾸어 작성할 수 있습니다. 사용되는 구문 요소들을 최소화함으로써 복잡도를 줄일 수 있습니다. 두번째 이유는 가독성과 관련되어 있습니다. 반복의 조건을 체크하는 부분이 하단에 위치하는 것은, 상단에서 조건을 체크하는 반복문보다 읽기가 더욱 어렵습니다.
 

40. 반복문 내에서 breakcontinue 의 사용을 자제한다.
 
이 두 문장은 구조화된 반복문보다 훨씬 가독성이 높을 때에만 사용하십시오. 일반적으로 break 문은 case 문 내에서만 사용하시고, continue 문은 반복문이든 case 문이든 어떤 경우라도 사용을 피해주시기 바랍니다.
 


5.7 조건문

51. 복잡한 조건식은 반드시 피한다. 그 대신 임시 불리언 변수를 활용하라 [1].
if ((elementNo < 0) || (elementNo > maxElement)||
    elementNo == lastElement) {
  :
}
다음과 같이 변경한다: boolean isFinished      = (elementNo < 0) || (elementNo > maxElement);
boolean isRepeatedEntry = elementNo == lastElement;
if (isFinished || isRepeatedEntry) {
  :
}

 
조건식을 불리언 변수에 할당함으로써, 프로그램 그 자체로 의미를 명확하게 전달하고 있습니다. 조건문을 평가하는 구문은 보다 쉽게 해석할 수 있으며, 더불어 디버깅할 때에도 편리해집니다.

52. if 문에서, 일반적인 상황은 if 블록에 위치시키고 예외 상황은 else 블록에 위치시킨다 [1].
boolean isError = readFile (fileName);
if (!isError) {
  :
}
else {
  :
}
일반적인 처리 흐름과 예외상황 처리 흐름을 불명확하지 않게 하십시오. 이 지침은 가독성과 성능 모두에 영향을 미치는 중요한 사항입니다.

53. 조건을 평가하는 문장은 별도의 라인으로 분리한다.
if (isDone)              // NOT:  if (isDone) doCleanup();
  doCleanup();
이는 디버깅을 위한 목적으로 한 것입니다. 한 라인에 이것저것 기술하게 되면, 조건식 테스트가 참인지 거짓인지를 확인하기가 어려워집니다.

54. 절대로 조건식에 실행문을 사용하지 않는다.
file = openFile (fileName, "w");  // NOT:   if ((file = openFile (fileName, "w")) != null) {
if (file != null) {               //         :
  :                               //        }
}
조건식에 실행문을 사용하는 것은 간편하지만 읽기가 매우 어려워집니다. 이 지침은 Java 에 발을 처음으로 들여놓는 개발자들에게 특히 강조하고 싶은 지침입니다.


5.8 기타

55. 코드 상에서 매직 넘버(magic number: constants, array size, character positions, conversion factors와 같이 프로그램내에 등장하는 숫자/문자값)의 사용을 자제한다. 01 이외의 숫자는 차라리 상수로 정의하여 사용하도록 한다.
 
명확한 의미를 갖지 않는 숫자를 사용할 경우, 가독성 향상을 위하여 상수로 정의하여 사용하도록 합니다.

56. 실수값 상수는 항상 소수점과 최소한 소숫점 이하 한 자리 숫자를 사용하여 지정한다.
double total = 0.0;   // double total = 0; 가 아님
double speed = 3.0e8; // double speed = 3e8; 가 아님

double sum;
:
sum = (a + b) * 10.0;
특별한 경우에 정수와 실수가 동일한 값을 갖는다 하더라도 기본적으로 특성이 다르기 때문에 구별하는 것이 좋습니다. 또한 위 마지막 라인의 예제에서 살펴볼 수 있듯이, 값을 할당받은 변수(sum)는 다른 변수의 타입을 알 수 없다고 하더라도 명백하게 실수값을 계산해 낸다는 것을 보장할 수 있습니다 (* 10.0 을 통해서)
 

57. 실수값 상수는 항상 정수부에 숫자를 사용하여 지정한다.
double total = 0.5;   // double total = .5; 가 아님
Java 에서 사용하는 숫자와 표현식은 수학식 표기법에서 차용하였으므로, 프로그래머는 가능한 수학적 표기법을 준수하는 것이 바람직합니다. 실제로 .5 (간편한 표기) 보다 0.5 (수학적 표기) 가 더 읽기에 쉽습니다. 이 수식에서 정수 5 가 함께 사용되는 경우에는, .5 와 정수 5 를 혼동하여 잘못된 연산을 초래할 가능성이 높아지게 됩니다.


6 레이아웃과 주석

6.1 레이아웃

58. 기본 들여쓰기(indentation)는 4 자로 한다.
for (i = 0; i < nElements; i++)
  a[i] = 0;
1 자짜리 들여쓰기는 너무 작아서 논리적인 코드의 레이아웃에 사용합니다. 한편 4 자 이상 들여쓰기를 할 경우 중첩 들여쓰기한 코드를 읽기가 어려워지며, 한 문장을 여러 라인으로 쪼개야하는 상황이 자주 발생하게 됩니다. 2, 3, 4 글자 중에서 선택하시는 것이 바람직합니다만, 2 자와 4자가 가장 보편적입니다. 2 자로 하였을 경우에는 한 문장을 여러 라인으로 쪼개야할 상황을 최소화할 수 있습니다. Sun 社 에서는 4 자 들여쓰기를 권고하고 있습니다. 이 지침은 본래 2 자였던 것을 Sun 표준인 4 자로 변경한 것입니다.


59. 블록 레이아웃은 아래 예제 1 (권고안) 나 예제 2 를 따르되, 예제 3 의 형태는 결코 취해서는 안된다. 클래스, 인터페이스, 메소드 블록은 예제 2 레이아웃을 따른다.
while (!isDone) {
  doSomething();
  isDone = moreToDo();
}
 
while (!isDone)
{
  doSomething();
  isDone = moreToDo();
}
 
while (!isDone)
  {
    doSomething();
    isDone = moreToDo();
  }
 
예제 3은 추가적인 들여쓰기를 사용하고 있으나 예제 1 와 예제 2 를 사용한 것보다 나을 것이 없습니다.

60. classinterface 선언문은 다음과 같은 형태를 따른다:
class SomeClass extends AnotherClass
  implements SomeInterface, AnotherInterface
{
  ...
}
 
이 지침은 위에서 언급한 #59 의 일반적인 블록 규칙에 의거한 것입니다. Java 개발자 커뮤니티에서는 클래스를 선언하는 문장의 끝에서 중괄호를 여는 것이 일반적입니다. 실제로 이 괄호 스타일은 모든 종류의 블록에 대하여 사용할 수 있는 방식입니다. 개인적인 선호의 차이가 있겠지만, 이 방식은 C/C++ 에서 클래스와 메소드 블록은 다른 블록들과 구분할 수 있도록 하는 것을 차용한 것입니다.

61. 메소드 선언문은 다음과 같은 형태를 따른다:
public void someMethod()
  throws SomeException
{
  ...
}
 
class 문장에 대한 설명을 참고하십시오 (#59).

62. if-else 문장은 다음과 같은 형태를 따른다:
if (condition) {
  statements;
}

if (condition) {
  statements;
}
else {
  statements;
}

if (condition) {
  statements;
}
else if (condition) {
  statements;
}
else {
  statements;
}
 
이 지침은 위에서 언급한 #59 일반적인 블록 규칙에 의거한 것입니다. 하지만, else 절이 직전의 ifelse 절의 닫히는 중괄호와 동일한 라인에 있어야 한다고 한다면 논의를 해 볼 수도 있을 것입니다:

if (condition) {
  statements;
} else {
  statements;
}

이 방식은 Sun 社의 코딩 표준 권고안에서 제시한 것과 동일한 것입니다. 여기서 제시한 방법은 if-else 문장을 별도의 행에 분리되어 있기 때문에, else 절을 쉽게 식별할 수 있고 (직전 ifelse 절의 닫히는 중괄호 때문에 else 절이 잘 드러나지 않는 경우도 있습니다) 심지어 else 절을 이동한다거나 하는 경우에 손쉽게 if-else 문장을 조작할 수 있다는 점에서 조금 더 낫다고 할 수 있겠습니다.

63. A for 문장은 다음과 같은 형태를 따른다:
for (initialization; condition; update) {
  statements;
}
 
이 지침은 위에서 언급한 #59 일반적인 블록 규칙에 의거한 것입니다.

64. 비어있는 for 문장은 다음과 같은 형태를 따른다:
for (initialization; condition; update)
  ;
이 방식은 프로그래머가 의도적으로 for 문장을 비워두었음을 분명히할 수 있습니다.

65. while 문장은 다음과 같은 형태를 따른다:
while (condition) {
  statements;
}
 
이 지침은 위에서 언급한 #59 일반적인 블록 규칙에 의거한 것입니다.

66. do-while 문장은 다음과 같은 형태를 따른다:
do {
  statements;
} while (condition);
 
이 지침은 위에서 언급한 #59 일반적인 블록 규칙에 의거한 것입니다.

67. switch 문장은 다음과 같은 형태를 따른다:
switch (condition) {
  case ABC :
    statements;
    // Fallthrough 혹은 '계속'
  case DEF :
    statements;
    break;
  case XYZ :
    statements;
    break;
  default :
    statements;
    break;
}
 
이 방식은 Sun 社의 코딩 표준 권고안과는 들여쓰기와 공백문자 처리에 있어서 약간 다릅니다. 특히, 각각의 case 키워드들은 모두 switch 문에 소속되어 있음을 부각시키기 위하여 switch 키워드를 기점으로 들여쓰기를 수행하였습니다. 이로써 switch 문이 강조되었습니다. 한 가지 더 주목해서 보셔야 할 것은 casedefault 키워드들과 : 문자 사이에 추가 공백이 들어있다는 점입니다. break 문을 사용하지 않는 case 문에는 반드시 명시적으로 Fallthrough계속 이라는 주석을 달아주십시오. break 문을 빠뜨리는 것은 일반적인 실수이기 때문에, 이와 같은 주석을 명시함으로써 실수가 아니라 의도적으로 break 문을 생략했다는 것을 분명히 할 수 있습니다.

2004-04-14 08:43:56.0 (wgshim 222.108.45.193) D
68. try-catch 문장은 다음과 같은 형태를 따른다:
try {
  statements;
}
catch (Exception exception) {
  statements;
}

try {
  statements;
}
catch (Exception exception) {
  statements;
}
finally {
  statements;
}
 
이 지침은 위에서 언급한 #59 일반적인 블록 규칙에 의거한 것입니다. 이 형태 역시 #61 의 if-else 문이 그랬던 것처럼, Sun 社의 코딩 표준 권고안에서 제시한 것과는 다릅니다. #61 을 참고하시기 바랍니다.

69. 단일 문장의 if-else, for, while 문은 중괄호 없이 작성할 수도 있다.
if (condition)
  statement;

while (condition)
  statement;

for (initialization; condition; update)
  statement;

 
일반적인 코딩 권고안은 Sun 社의 Java 코딩 표준 권고안에도 포함되어 있는 것과 같이, 모든 경우에 항상 중괄호를 사용하여 블록화 하라는 것입니다. 하지만 블록은 여러 문장을 그룹핑하기 위한 용도로 사용되기 때문에, 단일 문장을 묶는 것은 오히려 번거로울 수 있습니다. #52 와 같이 조건을 평가하는 부분과 실행문을 분리해서 기록하며 들여쓰기를 제대로 한다면 크게 문제되지는 않습니다.


6.2 공백문자

70.
- . 를 제외한 모든 binary 연산자(conventional operator)는 피연산

     자들 사이에 스페이스로 분리한다.
     예외적으로 Unary operator(++, --) 와 피연산자 사이에는 공백

     을 두지 않는다.


- Java 예약어/키워드 뒤에 공백문자 하나를 추가한다.


- 콤마(,) 뒤에 공백문자 하나를 추가한다.


- 콜론(:) 의 앞뒤에는 공백문자를 추가한다.


- for 문 내의 세미콜론(;) 문자 뒤에 공백문자 하나를 추가한다.

a = (b + c) * d;            // NOT:   a=(b+c)*d
while (true) {              // NOT:   while(true) ...
doSomething (a, b, c, d);   // NOT:   doSomething (a,b,c,d);
case 100 :                  // NOT:   case 100:
for (i = 0; i < 10; i++) {  // NOT:   for (i=0;i<10;i++){
이 방법은 문장의 각 구성요소들을 부각시켜 가독성을 높여줍니다. 여기서 제안하는 Java 코드 상에서의 공백문자 사용에 관한 모든 예제를 다 나열하기는 어렵겠습니다만, 위에 제시한 예제로도 충분히 그 의도를 제시해주고 있습니다.

71. 메소드의 이름과 메소드의 여는 괄호 사이에 공백문자를 사용하지 않는다.
(참고: 본래 이 문서의 원본에는 Sun 社의 권고안과는 달리 '메소드의 이름과 여는 괄호 사이에도 공백문자를 넣어 모든 이름을 부각시키자' 라고 언급하고 있었으나 변경함)
doSomething(currentFile);    // doSomething (currentFile); 가 아님
#69 지침에 의해 Java 의 예약어/키워드 뒤에 공백문자를 추가하기 때문에, 메소드의 이름과 여는 괄호 사이에 공백을 없앰으로써 메소드 호출과 키워드를 구별하는데 도움을 줍니다.

72. 블록 내의 논리적인 유닛들은 빈 라인을 하나 삽입하여 구분한다.
 
블록 내 논리적 유닛들 사이에 공백을 삽입함으로써 가독성을 향상시키게 됩니다.

73. 메소드 선언들 간에는 3-5 개의 빈 라인을 삽입하여 구분한다.
 
메소드 내에서 사용하는 빈 라인보다 많은 라인을 삽입함으로써 클래스 내 각각의 메소드들을 부각시키게 됩니다.

74. 선언문에서의 변수는 타입과 구분하여 변수끼리 좌측정렬 한다.
AsciiFile  file;
int        nPoints;
float      x, y;
타입과 변수를 구분하여 정렬함으로써 변수를 부각시켜 가독성을 높이게 됩니다.

75. 문장은 가독성을 높이기 위하여 정렬한다
if      (a == lowValue)    compueSomething();
else if (a == mediumValue) computeSomethingElse();
else if (a == highValue)   computeSomethingElseYet();


value = (potential        * oilDensity)   / constant1 +
        (depth            * waterDensity) / constant2 +
        (zCoordinateValue * gasDensity)   / constant3;


minPosition     = computeDistance (min,     x, y, z);
averagePosition = computeDistance (average, x, y, z);


switch (value) {
  case PHASE_OIL   : phaseString = "Oil";   break;
  case PHASE_WATER : phaseString = "Water"; break;
  case PHASE_GAS   : phaseString = "Gas";   break;
}
일반적인 지침에 위배될 수도 있겠지만 위 예제에서는 가독성을 높이기 위하여 코드 사이에 공백문자를 넣었습니다. 공백문자를 넣을 때에는 코드의 정렬방식을 준수합니다. 번거로울 수 있겠지만 코드를 정렬함으로써 코드를 한 눈에 들어오게 만들 수 있습니다. 이렇게 공백문자를 넣어 정렬하는 코드정렬에 대해 일반적인 지침을 제시하기는 어렵겠습니다만, 위에 제시한 예제로도 충분히 그 의도를 제시해주고 있습니다.


6.3 주석

76. 난잡한 코드에는 주석을 다는 것보다는, 코드를 구조화하여 재작성하고 명료한 코드에 주석을 다는 것이 낫다 [1] .
 
일반적으로 적절한 이름 선정과 명쾌한 논리 구조를 바탕으로, 코드 자체만으로도 충분히 이해가 되도록 작성하는 것이 우선이고 그 후 주석을 다는 것이 바람직합니다. 주석을 달지 않는 프로그래머를 나쁜 습관을 가졌다고 하지만, 역설적으로 코딩을 정말 잘하는 프로그래머는 주석을 많이 달 필요가 없는 것입니다.

77. 모든 주석은 영어로 작성한다.
 
국제적인 제품을 개발하고자 할 때에는, 주석도 자국어를 사용하는 것 보다는 영어를 사용하는 것이 바람직합니다.

78. JavaDoc 주석이 아닌 모든 주석과 여러 줄을 사용하는 주석에 // 를 사용한다.
// 한 줄 이상의
// 주석이랍니다

// /*
   여러 라인의 주석을 해제합니다.
// */
Java 에서 멀티 레벨 주석을 지원하지 않기 때문에, 디버깅이나 기타 목적으로 사용한 /* */ 블럭의 주석을 해제하는데 // 를 사용하기도 합니다.

79. 주석은 설명하려는 코드와 같은 위치에서 들여쓰기하여 작성한다 [1].
while (true) {          // NOT:    while (true) {
  // Do something       //         // Do something
  something();          //             something();
}                       //         }
이 방법은 주석이 프로그램의 논리적인 구조를 깨뜨리지 않게 해줍니다.

80. collection 변수를 선언할 때에는, 컬렉션에 담겨질 요소들의 공통 타입에 대한 주석을 작성한다.
private Vector  pointList_;  // Point 객체에 대한 Vector
private Set     shapeSet_;   // Shape 객체에 대한 Set
 
이러한 추가적인 주석이 없다면 컬렉션이 어떤 요소들로 구성되어 있는지 파악하기가 어려워지기 때문에, 컬렉션의 요소들을 어떻게 다뤄야 하는지 혼동이 되는 경우가 발생합니다. 컬렉션 변수를 입력 인자로 받아들이는 메소드에서는, JavaDoc 주석을 사용하여 컬렉션 입력 인자의 요소들의 공통 타입을 기술하십시요.

81. 모든 public 클래스와 public 클래스의 public, protected 로 선언된 메소드들에 JavaDoc 방식의 주석을 작성한다.
 
이 방식은 간편하게 온라인 코드 API 문서를 항상 최신내용으로 유지시킬 수 있도록 합니다.


82. 각 파일에는 package 선언문 상단에 다음과 같은 헤더를 삽입한다:
/*
 * (@)# <<파일의 이름>>.java
 *
 * $Header$
 * $Revision$
 * $Date$
 *
 * ====================================================================
 *
 * <<회사 이름>>., Software License, Version 1.0
 *
 * Copyright (c) 2002-2004 <<회사 이름>>.,
 * <<회사 주소>>  * All rights reserved.
 *
 * DON'T COPY OR REDISTRIBUTE THIS SOURCE CODE WITHOUT PERMISSION.
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <<회사 이름>> OR ITS
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * For more information on this product, please see
 * <<회사 웹 사이트 URL 주소>>
 *
 */
각 파일의 상단에 코드의 소유자(혹은 조직)와 라이센스 및 책임의 한계에 대한 정보를 기술합니다.


83. class, interface 및 메소드 선언문 위에는 다음과 같은 JavaDoc 주석을 삽입한다:
/**
 * 클래스, 인터페이스 메소드에 대한 설명을 기술합니다.
 *
 *   메소드의 경우는 다음 항목들을 기록하십시오:
 *      - 메소드의 작성의도
 *      - 메소드를 사용하기 위한 사전조건(pre condition) 과 사후조건(post condition)
 *      - 부작용
 *      - 종속성 (종속되는 라이브러리, 클래스, 메소드 등)
 *      - 사용시 주의해야 할 점
 *      - 누가 이 메소드를 호출하는가
 *      - 언제 이 메소드를 재정의해야 하는가
 *      - 메소드 재정의 시 어디서 부모 메소드를 호출해야 하는가(super 키워드를 사용하여)
 *      - 제어 흐름 및 상태 전이에 관련된 내용들
 *
 * @author (클래스와 인터페이스에서만 사용합니다)
 * @version (클래스와 인터페이스에서만 사용합니다)
 *
 * @param (메소드와 생성자에서만 사용합니다)
 * @return (메소드에서만 사용합니다)
 * @exception (Javadoc 1.2 의 @throws 와 같은 표현입니다)
 * @see
 * @since
 * @serial (또는 @serialField 나 @serialData)
 * @deprecated (deprecated 된 클래스, 인터페이스, 메소드에 대해 어떻게 대응해야 하는지 기록합니다)
 */

public class Example { ...
 
JavaDoc에 대한 자세한 최신 정보는 이곳을 참고하시기 바랍니다.

7 참고문헌

[1] Steve McConnel, "Code Complete," Microsoft Press. [2] Sun, "Java Code Conventions," http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html [3] Netscape, "Software Coding Standards for Java," http://developer.netscape.com/docs/technote/java/codestyle.html [4] NASA, "C / C++ / Java Coding Standards," http://v2ma09.gsfc.nasa.gov/coding_standards.html [5] AmbySoft, "Coding Standards for Java," http://www.ambysoft.com/javaCodingStandards.html

 


www.jlab.net
 

이 컨텐츠는 JPL에 의해서 보호 받습니다. 오탈 자나 건의는 이곳에 해주십시오
이 컨텐츠는 © 2004 Geotechnical Software Services. 에서 제공하는 Geosoft 의 Java Programming Style Guidelines 문서를 번역 및 수정한 것임을 밝힙니다.

반응형
가. 프로세스 생성 및 종료

일반적으로 프로그램을 실행시키면, 하나의 프로세스로서 동작하게 됩니다. 다시 말해서, 우리가 실행시키는 하나의 프로그램은 하나의 프로세스로서 나타나게 됩니다. 자바에서의 프로세스는 자바 런타임 환경과 밀접한 관계를 갖고 있습니다. 왜냐하면, 자바 런타임 환경은 프로세스가 실행될 수 있는 기반 환경을 제공해 주기 때문입니다. 프로세스는 다른 프로세스를 생성할 수 있는데, 이 때 생성된 프로세스를 자식 프로세스라하고 기존에 있던 프로세스를 부모 프로세스라 합니다. 이러한 부모/자식 프로세스 개념은 하나의 자바 프로그램에서 다른 프로그램을 실행시키고자 할 때, 주로 사용됩니다. 다시 말해서, 플랫폼 독립적인 자바 프로그램이 플랫폼과 밀접한 관련이 있는 작업을 해야 할 경우, 해당 작업을 수행할 프로그램을 다른 언어로 해당 플랫폼에 맞도록 작성하고, 이 프로그램을 자바 프로그램에서 실행시켜 주는 것입니다.

이를 위해, 플랫폼 종속적인 시스템 함수들을 호출할 수 있도록 해 주는 Runtime 클래스와 실행하고자 하는 응용프로그램을 위한 프로세스를 관리할 수 있도록 해 주는 Process 클래스를 사용할 수 있습니다. 자바에서 프로세스를 생성하기 위하여 다음과 같이 해 줍니다.

            - “Runtime runtime = Runtime.getRuntime();”: 런타임 객체를 생성합니다.

            - “Process p = runtime.exec(“프로그램경로명”);”: exec 메소드를 이용하여 프로세스를 생성합니다.

위와 같이 프로세스를 생성할 수 있고, 프로세스의 작업을 마치거나 또는 프로세스를 강제고 종료하기 위해서는 다음 중 한 가지 방법으로 할 수 있습니다.

            - “p.waitFor();”: 자식 프로세스가 종료될 때까지 기다립니다.

            - “p.destroy();”: 부모 프로세스에서 자식 프로세스를 강제로 종료시킵니다.

            - “System.exit(0);”: 부모 프로세스만 종료되고 자식 프로세스는 계속 실행됩니다.

Runtime 클래스가 제공해 주는 주요 메소드를 살펴보면 다음과 같습니다.

            - public static Runtime getRuntime(): 현재 실행되고 있는 자바 애플리케이션과 관련된 런타임 객체를 리턴해 줍니다.

            - public void exit(int status): 현재 자바 가상머신을 종료합니다. status 매개변수는 종료시의 상태값을 나타내며, 일반적으로 0 이외의 값은 비정상적으로 종료되었음을 의미합니다.

            - public Process exec(String command) throws IOException: 주어진 명령어를 독립된 프로세스로 실행시켜 줍니다. exec(command, null)와 같이 실행시킨 것과 같습니다.

            - public Process exec(String command, String envp[]) throws IOException: 주어진 명령어를 주어진 환경을 갖는 독립된 프로세스로 실행시켜 줍니다. 이 메소드는 명령어 문자열을 토큰으로 나누어 이 토큰들을 포함하고 있는 cmdarray라는 새로운 배열을 생성합니다. 그리고 나서 exec(cmdarray, envp)을 호출합니다.

            - public Process exec(String cmdarray[]) throws IOException: 주어진 문자열 배열에 있는 명령어와 매개변수를 이용하여 독립된 프로세스로 실행시켜 줍니다. exec(cmdarray, null)을 호출합니다.

            - public Process exec(String cmdarray[], String envp[]) throws IOException: 주어진 문자열 배열에 있는 명령어와 매개변수를 이용하여 주어진 환경을 갖는 독립된 프로세스로 실행시켜 줍니다. 문자열 배열 cmdarray에는 명령어와 명령행 인자들을 나타내고 있습니다.

            - public native long freeMemory(): 시스템에 남아있는 메모리의 양을 얻습니다. 이 값은 항상 totalMemory() 메소드에 의해 얻어지는 값보다 작습니다.

            - public native long totalMemory(): 자바 가상머신의 최대 메모리 크기를 얻습니다.

Process 클래스가 제공해 주는 주요 메소드를 살펴보면 다음과 같습니다.

            - public abstract OutputStream getOutputStream(): 자식 프로세스의 출력 스트림을 얻습니다.

            - public abstract InputStream getInputStream(): 자식 프로세스의 입력 스트림을 얻습니다.

            - public abstract InputStream getErrorStream(): 자식 프로세스의 에러 스트림을 얻습니다.

            - public abstract int waitFor() throws InterruptedException: 자식 프로세스가 종료될 때까지 기다립니다.

            - public abstract int exitValue(): 자식 프로세스가 종료할 때의 상태값을 얻습니다.

            - public abstract void destroy(): 자식 프로세스를 강제로 종료시킵니다.

다음에 나오는 자바 프로그램은 위의 Runtime 클래스 및 Process 클래스를 이용하여 새로운 프로세스를 생성하고 종료하는 과정을 보여주기 위해 윈도우의 계산기를 실행시키는 간단한 예제입니다.

import java.io.*;

public class ProcessTest {

   static public void main(String args[]) {

      try {

         Process p1 = Runtime.getRuntime().exec("calc.exe");

         Process p2 = Runtime.getRuntime().exec("freecell.exe");

         Process p3 = Runtime.getRuntime().exec("Notepad.exe");

         p1.waitFor();

         p2.destroy();

         System.out.println("Exit value of p1: "+p1.exitValue());

         System.out.println("Exit value of p2: "+p2.exitValue());

      } catch(IOException e) {

         System.out.println(e.getMessage());

      } catch(InterruptedException e) {

         System.out.println(e.getMessage());

      }

      System.exit(0);

   }

}

/*

 * Results:

 D:\AIIT\JAVA\06>java ProcessTest

 Exit value of p1: 0

 Exit value of p2: 1

 D:\AIIT\JAVA\06>

 */

<프로그램 1. ProcessTest.java>

나. 상호작용 명령어의 실행

그런데, 위와 같이 프로세스를 이용하여 방식으로 명령어를 실행하다 보면, 명령어에 따라 사용자에게 메시지를 출력하고 이에 대한 적절한 답을 사용자로부터 입력 받기를 원하는 명령어가 있습니다. 이러한 명령어를 상호작용(interactive) 명령어라고 합니다.

D:\AIIT\JAVA\06>ping 203.252.134.126

Pinging 203.252.134.126 with 32 bytes of data:

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

D:\AIIT\JAVA\06>

<그림 1. 상호작용 명령어의 실행>

그림에서와 같이 ping 명령어를 실행시키게 되면, ping 명령어는 그 실행 결과를 표준 출력을 이용하여 화면상에 출력해 줍니다. 이렇게 자바에서 실행시킨 프로세스가 출력하는 결과를 자바 프로그램은 알아야 하고, 또한 프로세스가 자바 프로그램으로부터 어떤 대답을 원할 경우가 있는데 이 때 사용자는 이에 대해 적절하게 답을 해 주어야 합니다. 이 때, ping 명령어는 메시지를 자신의 표준 출력에 장치에 출력하게 되는데, 이렇게 프로세스의 표준 출력을 자바 프로그램에서는 p.getInputStream 메소드를 이용하여 얻고, p.getOutputStream 메소드를 이용하여 프로세스의 표준 입력 장치에 쓰게 됩니다. 이 때, 한 가지 주의할 사항은 표준 출력 스트림에 대답을 쓴(write) 후, 꼭 flush 또는 close 메소드를 이용하여 표준 출력 스트림을 비워(flush) 주어야 합니다.

<그림 2. 자바 프로그램과 프로세스 간의 데이터의 전달>

다음에 나오는 자바 프로그램은 도스 상에서 상호작용 명령어를 사용하는 간단한 예제를 보여줍니다.

import java.io.*;

import java.lang.*;

public class InteractiveProcessTest {

   public static void main(String[] args) {

      try {

         Process p = Runtime.getRuntime().exec("ping 203.252.134.126");

         byte[] msg = new byte[128];

         int len;

         while((len=p.getInputStream().read(msg)) > 0) {

            System.out.print(new String(msg, 0, len));

         }

         String rs = "\n";

         byte[] rb  = new byte[] { (byte)'\n' } ; //rs.getBytes();

         OutputStream os = p.getOutputStream();

         os.write(rb);

         os.close();

      } catch (Exception e) {

         e.printStackTrace();

      }

   }

}

/*

 * Results:

 D:\AIIT\JAVA\06>java InteractiveProcessTest

 Pinging 203.252.134.126 with 32 bytes of data:

 Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

 Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

 Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

 Reply from 203.252.134.126: bytes=32 time<10ms TTL=128

 D:\AIIT\JAVA\06>

*/

<프로그램 2. InteractiveProcessTest.java>

반응형
이곳은 50001.COM 주인장의 강좌와 주옥같은 JAVA고수님들의 강좌를 모아 놓은 곳입니다.
질문은 Q&A 게시판에 주세요.

들어가는 글 :: "시작하는 JAVA프로그래머를 위해" (특히 비 전공자분들께)
 
 
김상욱의 awt 멀티채팅강좌 ::
방개설, 귓말/쪽지, 방장기능, 캐릭터 및 글자색 기능, 이미지넣기, 관리자모드, 그림 및 음악 보내기 등 기술분석적 강의 (진행중)
김상욱의 db 이용한 awt 그래프 출력강좌 ::
db와 socket을 이용 3-Tier, 스크롤가능 그래프출력 강좌 (1차완료)
김상욱의 LIVECONNECTION :: 애플릿과 자바스크립트와의 통신강좌 (완료)
김상욱의 자바툴 강좌 :: Editplus, UltraEditor, Kawa, JCreator 등의 다운로드와 설정 (완료)
김상욱의 웹스타트(webstart) 강좌 (기본 완료, 응용 진행중)
김상욱의 Vector, Hashtable 클래스 성능 실험 외 (완료)
진은영 (50001.com javaside 시삽) 강사님의 자바 기초강좌 (진행중)
자바Side(50001.com) 온라인 자바 스터디 1기 채팅 소스 분석 스터디 정리(완료)
Java Basic처음 입문하신 분들은 이리로
J2SE(Core/Desktop)Java2 Standard Edition.
애플릿/애플리케이션 등 일반적인 자바
프로그램을 만들 수 있는 기본 패키지
J2EE(Enterprise/Server)Java2 Enterprise Edition
엔터프라이즈급 프로그램을 만들 때
사용하는 패키지.
웹프로그래밍 JSP :: servlet :: taglibrary/customtag
웹서비스
웹서비스
JAXP/JAXR/JAX-RPC

SOAP
Component
Enterprise JavaBeans(EJB)
Java Message Service(JMS)
기타

application server
Java Data Objects(JDO)
JavaMail
Transaction(JTA/JTS)
J2EE 기타

J2ME(Mobile/Wireless)Java2 Micro Edition.
휴대폰 등에 들어있는 소형 시스템에서
사용할 프로그램을 만들 수 있는 패키지.

모바일(J2ME)

(강사님별 / 기기별 강좌)

XML XML
IDE IDE
Other Java Technologies 준비중...
ETC 매뉴얼 :: 디자인패턴 :: 객체지향 UML ::
자바스크립트 :: XP(Extreame Programming) :: 기타

자바기본 (영문튜토리얼)

 
박용우님의 자바강좌 :: 자바 전반에 대한 문법 및 도움말 (강추!)
윤경구의 자바튜토리얼 :: '지나'시리즈로 유명한 저자의 기초~고급
최종명의 몽땅강좌 :: 기초부터 고수까지
최희창님의 자바클래스 소개
Java 전문 용어 이해하기 :: Sun사 문서 (오광신 님 번역)
원돈희님의 SCJP에 맞춘 자바강좌 :: 시험 유형에 맞춰 헷갈리기 쉬운 부분을 알기쉽게 강의
Sun의 자바기초강좌 SL275(한글문서) :: 김동학님 제공
자바 초보자를 위한 강좌 :: javanuri
corejava [1권] [2권] :: 번역판
Think In Java 2nd Ed (MS WORD버전)
자바기초에서 애플릿(바둑,채팅)까지 :: JSTORM
자바기초(당연히 알아야함에도 불구하고 그냥 지나치기 쉬운) :: JSTORM
JVM의기본 원리 및 클래스로더의 기초 :: JSTORM
제네럴 프로그래밍 애플릿에서 웹 서비스까지 [첨부파일] :: 박용우
GarbageCollection :: 오광신
JVM의 가비지 컬렉션 (영문) :: IBM
가비지 컬렉션과 퍼포먼스 (영문) :: IBM
이것은 무엇의 객체인가 (영문) :: IBM
추상클래스 :: 자바스터디
정적 유형 (Static type) (영문) :: IBM
final 사용 가이드라인 (영문) :: IBM
자바 속성 [1] [2] [3] [4] :: IBM
클래스와 클래스 로딩 (영문) :: IBM
Java Web Start 1.0 개발자 가이드 (번역) :: JSTORM
자바 네트워크 구동 프로토콜(JNLP)과 참조 구현, 자바 웹 스타트 :: 자바스터디
JAVA WEBSTART문서 [소스] :: 오광신
EMPOWER YOUR APPLICATIONS WITH JAVA™ WEB START - Sun사 문서 (오광신 님 번역)
자바프린팅모델 [1] [2] :: JSTORM
JDK 1_4의 프린팅 (printing), Part 1_새로운 Java Print Service API :: IBM
JDK 1_4의 프린팅 (printing), Part 2_프린트 관련 이벤트를 듣고 그래픽을 직접 프린트 :: IBM
표명(assertion) 기능 이용하기 :: IBM
J2SE 1_5_Tiger의 미래와 언어 차원의 변화 :: IBM
숫자와 currency 포맷 (영문) :: IBM
자바 어플리케이션에서 환경에 접근하기 :: 자바스터디
쓰레드 풀과 작업 큐(queue) (영문) :: IBM
쓰레드 보안 (영문) :: IBM
김세곤님의 클래스패스와 환경 변수, 그것이 알고 싶다. :: 패키지 및 클래스패스설정 총정리
classpath에 등록안된 클래스의 dynamic reload :: javapattern.info
Multiprocess JVM Implemetation_1 :: javapattern.info
Multiprocess JVM Implemetation_2 :: javapattern.info
native method 정의 및 구현 :: javapattern.info
StringBuffer class Optimization :: javapattern.info
Using java debugger :: javapattern.info
Java 2 레퍼런스 클래스 사용 가이드라인 (영문) :: IBM

애플릿 (영문튜토리얼)

 
Dubuilder로 Signed Applet 만들기 [소스] / [MakeRayCab.bat ] :: 오광신
Explore에서 Signed Applet만들기 :: 오광신
넷스케이프 브라우저에서의 사인 애플릿 작성 :: 핸디소프트 윤동빈
네트워크 가위바위보게임(+채팅) [소스] :: 박용우

그래픽(awt,JFC/swing,SWT) (영문튜토리얼)

 
AWT와 스윙 [1] [2] :: JSTROM
스윙(SWING)의 안쪽 탐험 :: JSTORM
Swinging audio_사용자 인터페이스 향상을 위한 소리 신호 구현하기 :: IBM
지능형 데이터로 Swing을 간단히!_(iData 기법) :: IBM
SWT: native 크로스플랫폼 GUI 애플리케이션 만들기 (영문) :: IBM
Create native, cross-platform GUI applications(GCJ, 리눅스, SWT) :: IBM
Equipping SWT 애플리케이션에 content assistants 추가하기 (영문) :: IBM
Fullscreen Exclusive Mode 와 draw directly to video RAM(영문) :: IBM
Java Web Start로 SWT 애플리케이션 전개하기 (영문) :: IBM
GUI의 접근성 높이기 (영문) :: IBM

자료구조(Collection) (영문튜토리얼)

 
콜렉션 개요와 Collection 클래스, MAP, Iterator, Comparator, 콜렉션 알고리즘:: 자바스터디

국제화(한글화) (영문튜토리얼)

 

네트웍(IO/NET)
 
파일과 네트웍 [01] [02] :: JSTORM
자바 I/O 성능 향상기법 :: JSTORM
네트웍 코드를 쉽게 테스트 하자 [소스] :: JSTORM
비 블록 소켓으로 가는 길 (영문) :: IBM
Merlin으로 자바 플랫폼에 nonblocking 입출력 가능_새롭게 추가된 기능들 :: IBM
JDK1.4의 New I/O에 대하여 [1] [2] :: 한빛미디어
스트림 완전히 바꾸기, Part 1 (영문) :: IBM
스트림 완전히 바꾸기, Part 2 내부 Java IO 최적화 (영문) :: IBM
자바 네트워킹 강화 (영문) :: IBM
Java NIO (Ron Hitchens 지음) (영문) :: IBM
Merlin의 new IO 버퍼의 모든 것 (영문) :: IBM
NIO Channel :: javapattern.info
NIO Reactor Pattern의 사용 :: javapattern.info
PushbackReader의 사용방법과 예제 :: javapattern.info
Multicast IP address를 이용한 채팅 :: javapattern.info
Extracting zip or jar file :: javapattern.info
Servlet과 Applet간의 HTTP 통신_1 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_2 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_3 :: javapattern.info
Servlet과 Applet간의 HTTP 통신_4 :: javapattern.info
SocketPool Implementation Source code Example_1 :: javapattern.info
SocketPool Implementation Source code Example_2 :: javapattern.info
DatagramSocket의 정의 및 샘플 :: javapattern.info
HttpURLConnection 사용예와 개념 :: javapattern.info
jNetServer Socket Framework :: javapattern.info
Lightweight Web Server Implementation :: javapattern.info

분산객체(RMI) (영문튜토리얼)

 
Java Distributed Computing Technology :: 자바스터디
자바 RMI 사용하기
차승욱님의 RMI강좌 :: 자바스터디
문영진님의 RMI강좌 :: 자바스터디
자바에서의 원격객체통신(RMI와 CORBA) :: 윤경구
RMI의 기초 :: JSTORM 박준용님
기업에서의 RMI-IIOP_IIOP상에 RMI 실행시키기 :: IBM

IDL(CORBA) (영문튜토리얼)

 
JBuilder를 이용한 코바(Corba)프로그래밍 :: Javastudy
코바와 자바 연동 (PDF) :: Javastudy
JAVA와 CORBA연동 (PDF) :: Javastudy
JBuilder에서 코바 프로그래밍 (MS_WORD) :: Javastudy
코바 이것만을 알고 개발하자!!(PDF) :: Javastudy
VisiBroker 설치 방법 (코바사랑) :: Javastudy
비지브로커의 이모저모.. (PDF) :: Javastudy
IDL에 대해서.. (PDF) 코바사랑 제공 :: Javastudy
JAVA에서 IDL 매핑 (PDF) 코바사랑 제공:: Javastudy
콜백 서비스에 대해.. (MS-WORD) 코바사랑 제공 :: Javastudy
CORBA & Next Generation :: Javastudy

보안(Security) (Security in 1.2 영문튜토리얼)

 
Globus Grid Security Infrastructure와 자바 (영문) :: IBM
JAAS와 JSSE를 이용한 자바 보안 (영문) :: IBM
대칭암호화알고리즘 소개 및 DES, Blowfish샘플코드 :: javapattern.info
Java Security Model Evaluation :: javapattern.info
MD5를 이용한 스트링 변환 :: javapattern.info

JDBC(데이터베이스)
 
데이타베이스와 자바(JDBC소개) :: 자바스터디
JDBC 팁 (영문) :: IBM
JDBC 쿼리 로깅을 쉽게_고급 PreparedStatement를 사용하여 JCBC 코드에 로깅 추가 :: IBM
JDBC와 ORACLE :: 자바스터디
JDBC와 MSQL :: 자바스터디
Database접속 Pool관리 :: 자바스터디
JDBC API를 이용한 프로그래밍 강좌 :: http://www.aboutjsp.com/
JDBC 기초 강좌 :: http://cs.sookmyung.ac.kr/
JDBC 다국어 처리법 :: http://www.ejavaschool.com.ne.kr/
JDBC 설정 :: 자바스터디
PostgreSQL JDBC 활용 :: http://www.junghyun.pe.kr/
자바 초보자를 위한 DB강좌 :: javanuri
SQL2000 강의자료 :: 김하나님 자료
Object Pool 패턴을 이용 구현한 JDBC Connection Pool :: JSTORM
oracle8i JDBC(Oracle 8i 와 Java) :: Javastudy
Informix 데이터베이스연결 :: javapattern.info
MySQL JDBC Connection_1 :: javapattern.info
MySQL JDBC Connection_2 :: javapattern.info
MySQL JDBC Connection_3 :: javapattern.info
Java JDBC Performance Tip(1)-Select Speed up! :: javapattern.info
Java JDBC Performance Tip(2)-Insert, Delete Speed up!.htm :: javapattern.info
JDBC DataConversion(Using Metadata) :: javapattern.info

JAR (영문튜토리얼)

 
JAR 파일 (영문) :: IBM

Extention Mechanism (영문튜토리얼)

 

2D Graphics (영문튜토리얼)

 
2D 애니메이션과 이미지 기반 경로 (영문) - IBM
롤오버(rollover) 효과를 위한 Java2D 합성 (영문) - IBM

Sound (영문튜토리얼)

 

JavaBeans (영문튜토리얼)

 
자바 빈으로 테트리스 게임의 구성 요소들을 재사용 가능한 컴포넌트로 :: IBM
JavaBeans 컴포넌트와 JSP 기술의 결합 (영문) :: IBM

JNI (영문튜토리얼)

 
자바와 C/C++ 연동하기 :: 마이크로소프트웨어
Java Native Interface(JNI) :: 윤경구
자바 네이티브 인터페이스로 피어 클래스 사용하기 :: 자바스터디

Reflection (영문튜토리얼)

 
reflection (영문) :: IBM
리플렉션(reflection) 적용하기 (영문) :: IBM

Optional Packages(JMF/JMX/commAPI/3D/JAI/SpeechAPI/Help System etc)

 
자바멀티미디어 JMF [01] [02] [03] :: JSTORM
JavaHelp 소프트웨어로 헬프셋 만들기 :: 자바스터디
JAVAHELP로 애플리케이션에 도움말 추가하기 :: 자바스터디
블랙박스에서 엔터프라이즈 까지, JMX 1.1 style (영문) :: IBM
블랙 박스에서 엔터프라이즈 까지, JMX 1.1 스타일 (영문):: IBM
블랙박스에서 엔터프라이즈 까지, JMX 통합_JMX Agent를 네트워크 관리 시스템에 연결:: IBM
자바 애플리케이션에서 USB 장치에 접근하기 (영문) :: IBM

J2SE 기타

 
클래스 변형하기 (영문) :: IBM
보다 나은 HashMap 구현하기 (영문) :: IBM
변이(mutate)할 것인가 말것인가 (영문) :: IBM
무한정 progress bars (영문) :: IBM
다중 스레드 애플리케이션 프로그래밍을 쉽게 구현. Consumer 클래스 :: IBM
안전한 구조 기술 (영문) :: IBM
자바 애플리케이션에서의 회귀 태스크 스케줄링 (영문) :: IBM
자바 최적화 기술_자바 애플리케이션의 퍼포먼스 향상을 위한 실질 가이드 :: IBM
패턴 매칭 :: 자바스터디
정규식을 위한 추상 자바 API 구현하기_Perl5 regexp 라이브러리를 사용 :: IBM
새로운 regex 라이브러리를 이용한 문자 시퀀스 파싱하기 (영문) :: IBM
패키지 의존성 줄이기 (영문) :: IBM
해시(hash) 해부 (영문) :: IBM
캐릭터 세트(Character set) (영문) :: IBM
내 쓰레드는 어디에_서버 애플리케이션에서 쓰레드 유출 피하기 :: IBM
Preferences API를 사용하여 객체 저장하기 (영문) :: IBM
SpringLayout 매니저 (gridbagLayout으로 부족할 때)(영문) :: IBM
String 클래스의 오타(mistyping) 방지하기 (영문) :: IBM
Shutdown hook클래스 작성방법 및 샘플 :: javapattern.info
Comparator클래스의 객체비교를 통한 sorting :: javapattern.info
Deep Copy, Shallow Copy에 관한 Perfomance Test 및 고려사항 :: javapattern.info
Property Utility Examples_1 :: javapattern.info
Property Utility Examples_2 :: javapattern.info
Reflection을 이용한 Value Object비교 :: javapattern.info
박용우님의 '스노우크래프트'자바강좌 :: 자바스터디

JSP
 

1.JSP 란? MS의 ASP처럼 java로 구현된 서버 스크립트입니다.

2.프로그램? java.sun.com/products/servlet/index.html

3.매뉴얼? java.sun.com/products/jsp/tags/tags.html

4.자세한 정보 java.sun.com/products/jsp

5.JSP FAQ http://www.50001.com/language/javaside/www.esperanto.org.nz/jsp/jspfaq.html

6.JSP Developer's Guide java.sun.com/products/jsp/docs.html

JSP강좌 [01] [02] [03] :: JSTORM
JSP기초JSP이론 [01] [02] [03] [04] [05] [06] [07] :: 자바스터디강좌 by 파란공책
http://www.jabook.org/jbjsp/jbjsp_20000_0_0.html :: jabook의 JSP강좌 링크
JSP기초(Java Server Programming 번역일부) :: JSTORM

INSTALL

Tomcat4 설치하기 Windows NT/2K/XP, 98/ME :: okjsp

Tomcat4 Apache1.3.22연동 (mod_jk이용) (mod_webapp이용) :: okjsp

Tomcat 가상호스트 설정하기 :: okjsp

Apache 가상호스트 설정하기 ::okjsp

win98+apache+tomcat (win98과 winMe Tomcat 3.2.1, apache 1.3.14) :: okjsp

윈98 + 아파치 + 톰켓 설치 :: kimho.pe.kr

Tomcat 4.0 설치 (Windows 2000) :: kimho.pe.kr

apache + Tomcat설치하기 :: 자바스터디

리눅스에서 Tomcat 4.0 + 아파치 설치 :: kimho.pe.kr

Apache와 Tomcat4.0.1의연동(윈도2000) :: 김성박

Tomcat-apache 연동 :: okjsp

linux + apache + Tomcat설치하기 :: 자바스터디

Tomcat 3.2의 루트디렉토리 (Tomcat의 기본디렉토리 변경) :: okjsp

Tomcat 4.1의 루트디렉토리 (+ Context 추가) :: okjsp

win2k server + IIS + tomcat 3.2.3 (이미지 캡쳐) :: okjsp

IIS + tomcat 3.2.3 Context추가 (conf/uriworkermap.properties 변경) :: okjsp

IIS에서 자카르타톰캣 돌리기 :: 최종명

oracle 9i + jdbc + tomcat 4.0.3 연동 :: 하이텔 김현규(pasome)

일반계정으로 JSP 돌리기 :: kimho.pe.kr

Tomcat 서비스 설치하기 (NT, Tomcat 3.2.2 ) :: okjsp

win2000+apache+tomcat :: 자바스터디

win2000+IIS5+Resin (Resin 1.2.1) :: okjsp

resin install :: 자바스터디

Win2000에서 resin설치하기 :: 자바스터디

IIS에서 RESIN설치하기 :: 중앙정보기술 정원희

Resin 루트디렉토리 (Resin 1.2.1 기본디렉토리를 변경) :: okjsp

Apache1.X or 2.X+Resin 2.1.6 installed on Linux or Unix :: javapattern.info

자바 서비스를 위한 리눅스 보안 (영문) :: IBM

응용

Eclipse 시작하기 :: okjsp

Form study #1 :: okjsp

Tomcat 4 Manager 사용하기 :: okjsp

jsp에서 log() 이용하기 :: okjsp

WAR (Web ARchive jsp로 만든 웹 어플리케이션을 쉽게 배포) :: okjsp

한글처리 (일반적인 한글처리) :: okjsp

한글처리 빈 (빈에서의 한글처리) :: okjsp

useBean :: okjsp

톰켓에서 useBean 사용하기 :: kimho.pe.kr

session bean :: okjsp

bean 활용[1] [2] :: okjsp

FileUpload :: okjsp

JspSmartUpload 설치 :: okjsp

JspSmartUpload F&Q :: okjsp

jsp 에러잡기 :: okjsp

include 집중분석 :: okjsp

수학 내용을 포함하는 동적 웹 사이트 구축하기(JSP 기술과 LateX) :: IBM

패킹(Packing) (영문) :: IBM

The expression language_JSP 애플리케이션용 MA 단순화하기 :: IBM

Echo 웹 프레임웍으로 작업하기 [1] [2] :: IBM

include를 이용한 동적 콘텐트 조작 (영문) :: IBM

JSP 코드로 이미지 관리하기_동적 서블릿 이미지 메이킹을 마음대로! :: IBM

JSP best practices 외부 사이트에서 콘텐트를 가져오는 JSTL 태그 :: IBM

JSTL primer 프리젠테이션 (영문) :: IBM

JSTL을 이용한 JSP 페이지 업데이트 (영문) :: IBM

JSTL 기초 핵심에 접근하기_커스텀 태그를 이용한 플로우 제어와 URL 관리 :: IBM

JSTL 기초, Part 4 SQL과 XML 콘텐트에 접근하기 (영문) :: IBM

JSP best practices 타임 스탬프의 힘_JSP 페이지에 타임 스탬프 만들기 :: IBM

JSP best practices JSP 태그용 커스텀 애트리뷰트 만들기 :: IBM

JSP include 메커니즘으로 “look and feel”을 더욱 좋게 (영문) :: IBM

Struts, Tiles, JavaServer Faces 통합하기 :: IBM

Struts와 Tiles, 컴포넌트 기반의 개발 도우미 (영문) :: IBM

JSP Model 1 vs JSP Model 2 Architecture overview :: javapattern.info

URL Rewriting을 이용한 session tracking_1 :: javapattern.info

URL Rewriting을 이용한 session tracking_2 :: javapattern.info

[ JSP 기본 강좌 ] (http://www.ihelpers.co.kr)

“안녕하세요. 00 님!!!” 과 JSP 동작원리에 대하여

JSP Comment

JSP Directive

Scripting Elements

iimplicit object
Implicit Object - Request
Implicit Object - Response,Out
Implicit Object - Session, Application

공지사항 만들기 (1) (2) (3) (4) (5)

게시판 만들기 (1) (2) (3) (4) (5)

메일 발송 (1) (2)


진민님의 JSP 간단 강좌 ( http://myhome.shinbiro.com/~jimmy/ )

1. JSP 강좌1(jsp 기본구성)

2. JSP 강좌2(get,post처리 및 내장 인스턴트사용)

3. JSP 강좌3(외부 클래스 사용하는 방법)

4. JSP 강좌4(JDBC를 사용하는 방법)

5. JSP 강좌5(Cookie를 사용하는 방법)

6. JSP 강좌6(session을 사용하는 방법)

7. JSP 강좌7(session사용시 주의점)

김호님의 게시판 만들기 강좌 (http://www.kimho.pe.kr/)

JSP 게시판(방명록) 만들기 (글 내용보기)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

JSP 게시판(방명록) 만들기 (글 올리기)

JSP 게시판(방명록) 만들기 (리스트 출력하기)

JSP 게시판(방명록) 만들기 (페이징 기법)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 1회)

JSP 게시판(방명록) 만들기 (또 다른 페이징 기법 2회)

JSP 게시판(방명록) 만들기 (글 삭제하기)

JSP 게시판(방명록) 만들기 (글 수정하기)

답변형 게시판 만들기 1회 - 답변형 게시판 로직

답변형 게시판 만들기 2회 - 글 올리기

답변형 게시판 만들기 3회 - 글 리스트 보기

답변형 게시판 만들기 4회 - 글 내용 보기


servlet
 

http://www.jabook.org/jbjsp/jbjsp_10000_0_0.html :: jabook의 서블릿강좌 링크

자바 서블릿 프로그래밍 :: 박용우
자바 서블릿(Java ServletTM) 아키텍처 :: 박용우
Java Servlets 2.4를 이용한 필터링 (영문) :: IBM
Servlet API와 NIO 완벽한 결합 (영문) :: IBM
쿠키에 한글이 들어갈 경우 예제 서블릿 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_1 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_2 :: javapattern.info
Making the Http WebServer(Java로 web server를 구현하는 방법)_3 :: javapattern.info
Servlet2.3 API Filter interface Implementation :: javapattern.info
Servlet과 Applet간의 TCP_IP 통신_1 :: javapattern.info
Servlet과 Applet간의 TCP_IP 통신_2 :: javapattern.info
Servlet의 각종 Listener 사용방법 및 샘플 :: javapattern.info
Web Tier Java Techonology :: javapattern.info

INSTALL

 JSPINSTALL 참고

 

taglibrary/customtag
 

JSP Tag Library 기초강좌 :: okjsp

커스텀 태그로 JSP 페이지 제어하기_커스텀 태그 라이브러리 통신의 모든 것 :: IBM

Custom Tag Library (1) (2) (3) (4) (5) (6) :: http://www.ihelpers.co.kr

커스텀 태그에서의 에러 핸들링 (영문) :: IBM

JSP 커스텀 태그를 구현하는 다섯 단계 (영문) :: IBM

InvokeEJB Custom Tag Library implementation_1 :: javapattern.info

InvokeEJB Custom Tag Library implementation_2 :: javapattern.info

InvokeEJB Custom Tag Library implementation_3 :: javapattern.info

Struts 1.1 Tiles-framework에 대한 개요 및 사용방법 :: javapattern.info

taglib (영문) :: IBM

 

웹서비스
 

웹 티어 클러스터링, Part 1 JavaGroups로 웹 서비스와 애플리케이션 설계 :: IBM

 

JAXP/JAXR/JAX-RPC
 

 

SOAP
 

아파치 SOAP 유형 매핑, Part 1 아파치의 직렬화 API 검토하기 :: IBM

아파치 SOAP 유형 매핑, Part 2 정의된 직렬자와 비직렬자를 작성 :: IBM

 

Enterprise JavaBeans(EJB)
 
J2EE 환경 소개 :: 자바스터디
오라이온 서버 설치 및 J2EE 애플리케이션 배치 :: 자바스터디
J2EE 신기술의 해설 :: 자바스터디

[ EJB 기본문서 ]

Java Enterprise edition tutorial :: SUN

썬 사의 EJB 규약

Enterprise Java Beans란 무엇인가? [01] [02] [03] [04] [05] :: JSTORM

EJB 한글자료

EJB 실전프로그래밍 (Persistence PowerTier for EJB) :: 자바스터디

Java Enterprise [PDF] :: 김국현님

EJB 성능향상을 위한 Best Practice [1] [2] :: JSTORM

Writing Enterprise Application [01] [02] [03] [04] [05] [06] [07] :: JSTORM

EJB 디자인 패턴 ↓

[ EJB 응용 ]

EJB의 트랜잭션 :: JSTORM 박지훈님

J2EE 애플리케이션에서의 XML :: JSTORM 한제택님

자바 서버상에서 서블렛의 활용 :: 핸디소프트 윤동빈님

J2EE에서의 작업 스케쥴링 :: JSTORM 윤준호님

J2EE 신기술 해설 :: 한국오라클(주) 안병문님

Component Architecture(CORBA, EJB, COM) :: 김국현님

Grady Report - EJB, Design Pattern, XP 강좌 문서 :: 박현철(hpark@kebi.com)

이런 J2EE프로젝트는 위험하다 :: JSTORM

LDAP 소개 :: database.sarang.net 부산대학교 컴공과 박근오님 (MS WORD)

분산 관리 솔루션 (영문) :: IBM

상태보존형(stateful) 네트워크용 J2EE (영문) :: IBM

싱글사인온 솔루션 구현 (영문) :: IBM

싱글사인온 GSS-API와 Kerberos 티켓을 사용하여 SSO를 구현 :: IBM

EJB 예외 처리 실전 (영문) :: IBM

타당성검사(Validation) 헬퍼(helper) 클래스_데이터-포맷 타당성 검사에서 코드 중복 없애기 :: IBM

데이터 타당성검사(validation) (영문) :: IBM

동적 delegate_Java reflection을 이용하여 보다 일반적인 business delegate 구현하기 :: IBM

보다 나은 예외 처리 프레임웍 구현하기 (영문) :: IBM

엔터티 빈 보호_Session Facade 패턴으로 데이터를 안전하게 관리하기 :: IBM

Business Delegate 패턴_EJB 디자인에서의 추상 비지니스, 구현, 애플리케이션 로직 :: IBM

delegation의 한계_business delegate의 대안 :: IBM

JNDI의 산업용 최적화 (영문) :: IBM

JNDI 미로 통과하기 (영문) :: IBM

value 객체를 사용하여 RMI 트랜잭션 속도 높이기 (영문) :: IBM

EJB State와 SOAP 헤더 (영문) :: IBM

JavaSpaces로 적응력 있고 광범위한 솔루션 구현하기 (영문) :: IBM

J2EE 1.2에 다중 애플리케이션 전개하기 (영문) :: IBM

J2EE 내부 객체 사용 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 1 (영문) :: IBM

J2EE 영속적인 데이터 관리, Part 2 (영문) :: IBM

J2EE를 이용한 서비스 지향 아키텍쳐 프레임웍 설계 (영문) :: IBM

stateful 웹 애플리케이션의 구현과 관리 (영문) :: IBM

stateless 네트워크용 J2EE 기술 (영문) :: IBM


Java Message Service(JMS)
 

벤더로부터 독립된 JMS 솔루션 구현하기 :: IBM

메시지 큐잉이 기업 애플리케이션의 유연성과 확장성을 향상시키는 방법 :: IBM

JMS를 이용한 엔터프라이즈 메시징 (영문) :: IBM

 

application server
 

JEUS 기반의 J2EE - from TmaxSoft
   JEUS EJB Server의 관리와 이를 이용한 EJB 개발 (PDF)
   JEUS JTS의 구조와 이를 이용한 개발 (PDF)
    JDBC의 개념과 프로그래밍하는 방법 (PDF)
   XML 소개와 XML APPLICATION 개발 (PDF)
   JEUS JMS의 구조와 이를 이용한 개발 (PDF)
   JEUS JNDI의 구조와 이를 이용한 개발 (PDF)
   WebtoB Web Server의 소개 (PDF)

HP Netaction Application Server 기반의 J2EE - from Nicstech
   HP Netaction Application Server 설치 방법(WIN 환경) [MS-Word]
   HP Netaction Application Server 설치 방법(UNIX/LINUX 환경) [MS-Word]
   HP Netaction Application Server 에서 웹서버 세팅 방법 [MS-Word]
   HP Netaction Application Server 기반의 JSP, Servlet 개발 방법 [MS-Word]
   HP Netaction Application Server기반에서 EJB사용을 위한 Tutorial [PDF]
   RADPAK 개발툴 사용방법 [MS-Word]

Ea Server 기반의 J2EE - from Sybase
   EA Server 소개 (PDF)
   EJB-CORBA 개발 (PDF)
   분산어플리케이션 (PDF)
   EAServer & PowerJ Installation Guide (ZIP)

PowerJ 연재 강좌 (PDF)
   Simple Application | 웹 어플리케이션 | EJB 컴포넌트 작성 | 컴포넌트 사용하기
   완벽한 J2EE Application 구축방법 (PDF)


javapattern.info 강좌

IBM Webshpere 5.0 의 서버시작, 중지 및 EJB Deploy ANT Build

Web Application Framework개발방법(1)-Framework의 개요

Web Application Framework개발방법(2)-LifeCycle,Controller

Web Application Framework개발방법(3)-View page Composing

Web Application Framework최종 소스 및 인스톨

Weblogic 7에서 JMS Queue Browser 활용 1

Weblogic 7에서 JMS Queue Browser 활용 2

Weblogic EJB Deploy using ANT build

 

Java Data Objects(JDO)
 

Castor JDO 시작하기(영문) :: IBM

Castor를 이용한 데이터 바인딩 (영문) :: IBM

 

JavaMail
 

JavaMail 설치 :: 자바스터디

JavaMail 기본설치 :: okjsp

JavaMail 폼메일 :: okjsp

JavaMail 파일첨부메일 :: okjsp

JavaMail 메일링리스트 :: okjsp

Apache의 James 엔터프라이즈 이메일 서버 (영문) :: IBM

javapattern의 java WebMail 구현

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]

 

Transaction(JTA/JTS)
 

트랜잭션에 대한 소개_트랜잭션은 신뢰성 있는 애플리케이션을 위한 구성 요소 :: IBM

장막 뒤의 마법_J2EE 컨테이너가 트랜잭션 관리의 복잡성을 숨기는 방법 :: IBM

보안과 퍼포먼스 균형맞추기_트랜잭션 경계설정과 고립화 가이드라인 :: IBM

WS-AtomicTransaction과 JTA를 이용한 분산 트랜잭션 (영문) :: IBM

 

J2EE 기타
 

Authenticator클래스를 통한 서버인증 메일전송 :: javapattern.info

Distributed Transaction Introduce :: javapattern.info

JRMP, IIOP type의 RMI분산 객체(RMI over IIOP) :: javapattern.info

MarshalledObject and Deserialization :: javapattern.info

RMI Peering System Construct :: javapattern.info

RMI programming, The Lifecycle of server :: javapattern.info

WebLogic WLSPool Size변경 application :: javapattern.info

 

모바일(J2ME) :

J2ME와 mobile device :: 김종원

핸드폰 단말기용 자바 애플리케이션의 구현 :: 배준현

네덜란드의 무선 기술 (영문) :: IBM

모바일 장치 디텍션(detection) (영문) :: IBM

P2P 네트워크 모바일 디바이스를 JXTA와 Jabber 클라이언트로 전환하기 :: IBM

기존의 네트워크 경계를 넘어 확장되는 P2P 시스템 설계 :: IBM

JXTA 2 고성능 P2P 네트워크 (영문) :: IBM

무선 J2ME 보안 (영문) :: IBM

EPOC에서 자바 애플리케이션 만들기 (영문) :: IBM

J2ME 101, Part 3 Record Management System (영문) :: IBM

J2ME 101, Part 4 Generic Connection Framework (영문) :: IBM

J2ME 기록 관리 저장 (영문) :: IBM

J2ME 애플리케이션과 Kerberos, Part 3 (영문) :: IBM

J2ME를 무선 메시지교환으로 확장하기 (영문) :: IBM

J2MEMIDP 애플리케이션 보안 (영문) :: IBM

MIDlets 클래스_모든 J2ME 프로그램의 기반하에 구축하기 :: IBM

Secrets of the wireless elite Jason Loia (영문) :: IBM

Secrets of the wireless elite Nancy Lehrer(영문) :: IBM

J2ME를 이용한 모바일 결제(m-payments)-모바일 장치에서 결제까지 :: IBM

강사님별 강좌
 

배준현님 마소 강의


무선단말을 위한 자바플랫폼 : CLDC/MIDP
핸드폰에는 나만의 자바 애플리케이션을!
OSGi로 여는 임베디드 자바 세상

이경범님 마소 강의

알라딘 기반의 상용만화 애플리케이션 만들자

김종원님 프세 강의

MIDP를 사용한 휴대폰 프로그래밍
J2MEWTK를 사용한 MIDlet Httpconnection 프로그래밍
SK-Aladdin VM(virtual machine)을 이용한 멀티 플렛폼 채팅 프로그램 작성
&J2ME와 embedded device

유제정님 모바일 DB 강의

1. 모바일데이터베이스를 이용한 MIDP Sample 프로그램 구현

김준동님 모바일 강의

소형기기를 위한 프로그래밍 전략

정성권님 번역 자료

Introduction to Wireless Application Development

권기경님 번역 자료

Using XML in Wireless Applications
Connected Limited Device Configuration (CLDC) (CLDC API) (KJAVA API)

권기경님 자료

컴파일에서 사전 검증, 실행까지
이미지 사용 예제 분석
[번역] Connection Framework


기기별 강좌
 

Mobile Information Device Profile (MIDP) (MIDP-FCS API)
권기경님 자료

컴파일에서 사전 검증, 실행까지
웹서버에 midp 응용프로그램을 올려 놓고 실행하기

[번역]
MIDP Inter-Communication with CGI and Servlets
HTTP를 사용하는 MIDP Network Programming과 Connection Framework (정창수님번역)
MIDP GUI Programming Programming the Phone Interface (오용석님번역)
Quick Start Guide: JavaTM 2 Platform Micro Edition, Wireless Toolkit (오광신님 번역)
MIDP Database Programming using RMS: a Persistent Storage for MIDlets (번역)

PALM Pilot PDA (Palm OS) (PALM API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

WABA (WabaSoft) (WABA API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

n.TOP 마법사 (SK Telecom, XCE) (n.TOP 마법사 API) (XCE Tutorial)

박재범님 강의 :: 컴파일에서 실행까지
마소자료 :: MIDP 소개 | SKT-P 소개 | 게임작성 소개

EZ-JAVA 핸드폰 (LG Telecom) (EZ-JAVA 영문 API) (EZ-JAVA 한글 API)

권기경님 자료
  컴파일에서 사전 검증, 실행까지
  실제 폼에서 ez-java 응용프로그램 실행하기

박재범님 자료 :: 이미지 사용 예제 분석

-MODE 핸드폰 (Nttdocomo) (I-MODE API)

권기경님 자료
  컴파일에서 사전 검증, 실행까지
i모드 Java 확장 API 클래스 라이브러리가 아닌 i-jade를 사용하여 컴파일과 실행까지

wizardee님 자료 :: iAppli 개발환경 만들기

iDEN 핸드폰 (Motorola) (CLDC API) (MIDP API)

권기경님 자료 :: 컴파일에서 사전 검증, 실행까지

Personal Java 강좌

황제헌님 자료
  Personal Java Programming
  Personal Java 한글 encoding 문제 해결

CessHan for Palm-sized PC & PocketPC 설치 방법

KVM에 대한 기본 설명
어플리케이션 사이즈를 줄여주는 Obfuscator
SUN의 Monty 프로젝트 관련 자료
MIDP NG (New Generation) 버젼에 관한 자료 [UI, Games, and Sound] [Security and Networking]
Parsing XML in J2ME MIDP
Introducing Wireless JMS (PDF)

XML
 
XML의 기본개요 :: javapattern.info
XML 정리 (pdf파일)
XML korean spec :: http://user.chollian.net/%7E7Eclevekim
자바와 XML :: JSTROM
Using XML in Oracle
XML 게시판 [소스] :: 김미영 님
XML 과 데이타베이스 :: 박용우
XSL, XSLT, XPATH [1] [2] [3] [4]:: 전윤경(ygchon@penta.co.kr)
DOM으로 프로그래밍하자 [1] [2] :: 전윤경(ygchon@penta.co.kr)
About DOM & DOM Programming with Java :: javapattern.info
DOM Level 3 Core의 핵심 기능 [1] [2] (영문) :: IBM
About SAX & SAX programming with Java :: javapattern.info
SAX 파서 설치하기 (영문) :: IBM
자바 프로그래밍으로 온라인 XML 데이터 검색하기_XML 파싱 :: IBM
자바 프로그래밍의 XML-RPC (영문) :: IBM
자바가 본 XML :: 자바스터디
Digester와 Lucene을 이용한 XML 파싱, 인덱싱, 검색 (영문) :: IBM
XML 로 홈페이지 만들기 :: 전윤경(ygchon@penta.co.kr)
IBM developerWorks XML 아티클 템플릿 (영문) :: IBM
자바 문서 모델 사용법_상이한 자바 XML 문서 모델들이 작동하는 방식 :: IBM
Schema Infoset Model로 스키마에 대한 복잡한 쿼리를 간단히! :: IBM
Working XML 경로 컴파일과 테스트 자동화_알고리즘과 JUnit 자세히 살펴보기 :: IBM
XML 데이터 바인딩, 성능 (영문) :: IBM
XML 데이터 바인딩, JiBX architecture (영문) :: IBM
XML 데이터 바인딩, JiBX 사용하기 (영문):: IBM
About JDOM & JDOM Programming with Java.htm :: javapattern.info
FOP를 이용한 PDF생성시 한글변환방법 :: javapattern.info
XML을 이용한 Database Query Manager 구현하기 :: javapattern.info
XMLBeans를 이용한 xml binding.htm :: javapattern.info

IDE

 
JBuilder 5 한글 매뉴얼 (pdf)
JBuilder 6 한글 매뉴얼
JBuilder 7 [인스톨] [환경설정](ppt)
JBuilder 에서 휠마우스 사용
제이빌더에서 라인넘버 표시
제이빌더에서 Ant 실행
제이빌더에서 자바코드 뷰티파이어
한국 인프라이즈 제공 J 빌더 특강 [ZIP로 내려받기] :: javastudy.co.kr
Eclipse Platform 시작하기 :: IBM
Eclipse 플러그인 개발하기_플러그인 구현, 디버그, 설치 :: IBM
Eclipse 플러그인 서비스 (영문) :: IBM
Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 간단한 파일 탐색 애플리케이션 :: IBM
Eclipse Workbench 밖에서 Eclipse GUI 사용하기, 메뉴, 툴바 추가(영문) :: IBM
Eclipse와 HSQLDB 관계형 데이터베이스를 Eclipse에 임베딩하기, Part 1 (영문) :: IBM
Eclipse의 자바 개발 툴 확장하기 (영문) :: IBM
Graphical Editing Framework을 사용하여 Eclipse 기반 애플리케이션 만들기 (영문) :: IBM

매뉴얼
 
VisualAgeForJava 3.0 한글 매뉴얼 (pdf)
WSCP 매뉴얼 (doc) :: 윤성민

디자인패턴
 
디자인패턴 실전체험 [1] [2] [3] [4] :: 자바스터디
기본패턴 Overview :: javapattern.info
인터페이스! 다시 생각하기 :: 오광신
Good Java Style :: JSTORM
Command패턴의 기초 :: JSTORM
동적으로 자바 어플리케이션 확장하기 :: JSTORM
DesignPattern for Java [소스] :: JSTORM
리팩토링(Refactoring)_Eclipse의 자동화 리팩토링 기능 :: IBM
Double-checked locking과 Singleton 패턴_double-checked locking 이디엄 :: IBM
반 패턴으로 프로그래밍을 향상시키는 방법 :: IBM

EBJ 디자인패턴

Session Facade :: JSTORM

EJB Home Factory :: JSTORM

Business Interface :: JSTORM

Dual Persistent Entity Bean :: JSTORM

JDBC for Reading :: JSTORM

Business Delegate :: JSTORM

Data Transfer HashMap :: JSTORM

Data Transfer RowSet :: JSTORM

EJB Command Pattern :: JSTORM

Version Number :: JSTORM

"Dependent Value Object" 와 큰 단위의 BMP 엔티 :: JSTORM

EJB 전략, 팁 그리고 관례 :: JSTORM

Message Facade :: JSTORM

Value Object Factory :: JSTORM

Data Access Command Beans :: JSTORM

Blueprint(J2EE Petstore) client tier pattern overview :: javapattern.info

EJB design performance tips :: javapattern.info


객체지향 UML
 
박용우님의 객체지향형 프로그래밍 :: 자바스터디
심원도님의 UML강좌 :: 자바스터디
이준규님의 객체지향형 강좌 :: 자바스터디
Rational Rose에서 UML을 이용한 모델링 [1] [2] [3] [4] :: 자바스터디
http://www.jabook.org/jbjava2/jbjava2_10000_0_0.html :: jabook의 객체지향강좌링크

자바스크립트
 
자바스크립트 레퍼런스(win help용)
자바 초보자를 위한 JavaScript 강좌 :: javanuri
애플릿과의 통신(LIVE CONNECTION)을 위한 netscape.jar

XP(Extreame Programming)
 
Extreme Programming 돌아온 XP distilled, Part 1_XP의 진실
Extreme Programming을 밝힌다 돌아온 XP distilled, Part 2 (영문)
Extreme Programming을 밝힌다 돌아온 XP distilled, Part 3 (영문)
Extreme Programming을 밝힌다 진정한 XP 고객_소프트웨어 프로젝트를 운영하는 방법 배우기
Extreme Programming을 밝힌다 페어 프로그래밍(Pair programming) (영문)
Extreme Programming Just-in-time 디자인 (영문)
Extreme Programming Test-driven 프로그래밍_코드를 작성하기 전에 테스트 먼저 작성하기
Extreme Programming 작업에 맞는 (XP) 툴
Extreme Programming Just-in-time 디자인 (영문)

기타
 
ANT 매뉴얼 [] [] :: http://www.hanbitbook.co.kr/
Apache ANT Guide :: 최지웅
자바 마이그레이션 :: 하동욱(handan@hitel.net)
JINI기술과 실제 :: 자바스터디
고급 객체 직렬화 :: JSTORM
COM과 자바의 연결 :: 핸디소프트 윤동빈
PDF와 자바 :: JSTORM 윤준호
JavaCC를 이용하여 당신만의 언어를 만들자 [소스]:: JSTORM 윤준호
JavaCC, 파스 트리, XQuery 문법, Part 1 (영문) :: IBM
JavaCC, 파스 트리, XQuery 문법, Part 2 (영문) :: IBM
인스턴트 로깅(Instant logging) log4j 활용하기 (영문) :: IBM
Log4j를 위한 여러가지 환경설정(xml property)_1 :: javapattern.info
Log4j를 위한 여러가지 환경설정(xml property)_2 :: javapattern.info
Log4j의 출력방향 전환하기 :: javapattern.info
Extract unicode from ASCII format text :: javapattern.info
MP3 File Footer ID3V2 Spec Navigator :: javapattern.info
객체 보유 (object prevalence) 소개 (영문) :: IBM
동적 이벤트 리스너 프록시 (영문) :: IBM
리눅스에 LSID 권한 구현하기 (영문) :: IBM
매력적인 Jython (영문) :: IBM
소프트웨어 개발의 미래 (영문) :: IBM
접근가능성을 위한 코딩 (영문) :: IBM
쉬운 코드 관리를 위한 디자인 (영문) :: IBM
영속적인 트레이스 시스템으로 디버깅을 쉽게! (영문) :: IBM
영역 지향 프로그래밍(Aspect -oriented programming)으로 모듈화 향상시키기(AspectJ) :: IBM
강결합의 약점을 없앤 AOP (영문) :: IBM
자바 native 컴파일의 무게 재기_자바 소스에서 native 코드를 생성할 때의 장단점 :: IBM
자바 프로그래밍에서의 Assertion과 temporal logic (영문) :: IBM
버그 패턴에 Temporal logic 사용하기 (영문) :: IBM
콘텐트를 배치하는 새로운 방법 (영문) :: IBM
플랫폼 의존 gotchas: platform-dependent bug patterns (영문) :: IBM
AspectJ와 mock 객체를 이용한 유연한 테스팅 :: IBM
Concurrency made simple util.concurrent package :: IBM
Concurrent 컬렉션 클래스 (영문) :: IBM
ContentHandler의 애트리뷰트 (영문) :: IBM
ContentHandler의 엘리먼트와 텍스트 (영문) :: IBM
'스팩(specification)'이라는 줄타기를 하다_잘 정의된 스팩의 중요성 :: IBM
깊이 우선 Visitor와 broken dispatches_Visitor 패턴 변종으로 코드 간결성 향상 :: IBM
대화식 검사 기능을 제공하는 Repls_소프트웨어를 효과적으로 진단하는 기법 :: IBM
Run-on Initializer 버그 패턴_인자를 가진 생성자를 피함 :: IBM
e-business on demand 개발자의 로드맵 (영문) :: IBM
Eye on performance 객체 레퍼런싱 (영문) :: IBM
Eye on performance 마이크로 퍼포먼스 벤치마킹 (영문) :: IBM
Eye on performance 스트레스의 하중 (영문) :: IBM
Eye on performance 예외에 대한 예외 (영문) :: IBM
Eye on performance 향상된 개발 프로세스 (영문) :: IBM
Javassist를 이용한 클래스 변형 (영문) :: IBM
JML 시작하기_JML 주석으로 자바 프로그램 향상시키기 :: IBM
peer-to-peer 컴퓨팅의 실제 IP 멀티캐스트 기반의 검색 :: IBM
1vs순차N구조의 name-value pair DataSet 정의 :: javapattern.info
코딩지침 :: javapattern.info
Proxy하에서의 Client IP얻기.htm :: javapattern.info

※ 자료는 서로 공유되어야 합니다. ^_^ 각 강의자료의 저작권은 저작권자에게 있습니다.


Java Internet Programming

[서언(緖言)]
예제 소스 exam.zip

제 1 장 자바 시작하기

1. 자바란?
가. 자바란?
나. 자바의 장정 및 이익
다. 자바의 단점과 해결책
라. 자바관련 사이트 및 뉴스그룹
2. 자바 프로그램과 자바 개발 키트
가. 자바 프로그램의 종류
나. 자바 애플리케이션의 구조및 실행
다. 자바 애플릿의 구조 및 실행
라. 자바 개발 키트(Java Development Kit: JDK)
3. 자바 개발도구 사용예
가. 자바 작업 디렉토리 생성하기
나. 자바 개발도구 사용

제 2 장 자바 기본 문법

1. 기본 자료형과 수식
가. 기본 자료형
나. 정수 및 문자 자료형과 수식
다. 부동소수 자료형과 수식
라. 진리 자료형과 수식
2. 연산자와 우선순위
가. 산술(Arithmetic) 연산자와 부호(Sign) 연산자
나. 증감(Increment/Decrement) 연산자
다. 관계(Relational) 연산자
라. 논리(Logical) 연산자
마. 비트(Bitwise) 연산자
바. 대입(Assignment) 연산자
사. 조건(Conditional) 연산자
아. 연산자 우선순위와 결합성
자. 기본 자료형과 형변환
3. 자바 프로그램의 구성문
가. 자바 프로그램 구성문
1) 주석문
2) 지역변수 선언문, 수식문, 그리고 블록문
3) 선택문
4) 반복문
5) 분기문
나. 자바 가상머신의 메모리 모델과 배열 객체
1) 자바 가상머신의 메모리 모델
2) 클래스의 구성요소와 메모리 모델
3) 배열
4) 다차원 배열
5) 문자배열 및 String 클래스
6) 자바 애플리케이션에 매개변수 값 넘겨주기

제 3 장 자바객체지향프로그래밍

1. 객체지향 개념과 자바
가. 객체지향 개념
나. 클래스 정의 및 인스턴스(객체) 생성
다. 변수 및 메소드의 접근제어
라. 메소드의 다중 정의(Overloading)
2. 객체 생성자와 객체 생성 과정
가. 객체 생성자
나. this
다. 클래스 맴버와 인스턴스 맴버
라. 클래스 초기화 및 객체의 생성 과정
3. 상속
가. 상속
나. 상위클래스와 하위클래스
다. 상속과 생성자 및 생성 과정
라. 상속과 인스턴스 메소드의 재정의(Overrriding)
마. 상속과 변수 및 메소드의 접근제어
4. ABSTRACT/FINAL/INTERFACE
가. 추상클래스와 추상메소드
나. final변수(상수)와 상수 객체
다. final 클래스와 final 메소드
라. 인터페이스
마. 인터페이스의 구현 및 다중 상속
5. 선언 지역에 따른 클래스의 구분
가. 중첩클래스(nested class)
나. 내부클래스(inner class)
다. 지역클래스(local class)
라. 익명클래스(anonymous class)

제 4 장 예외처리

1. 예외와 예외처리
가. 예외와 예외처리방법
나. 예외처리 기본 구문 - try/catch 문
다. 예외처리 추가 구분 - finally 문
라. 예외의 분류
마. 예외 발생시키기 및 처리하기 -throw, throws

제 5 장 자바패키지

1. 패키지
가. 패키지란?
나. 패키지의 사용법 -import
다. 자바표준 패키지 -자바 API
라. 새로운 패키지를 만드는 방법
마. 패키지 내의 클래스 접근 제어
바. 패키지 찾는 방법 - 클래스 파일 탐색
2. java.lang 패키지의 Object클래스
가. 최상위 클래스 Object 클래스
나. instanceof연산자
다. Object 클래스의 equals 매소드와 '==' 연산자
3. java.lang 패키지의 System클래스
가. 시스템 클래스 - System 클래스
나. 배열 객체 복사하기
다. 시스템 속성(System Property)얻기 및 설정하기
라. 프로그램의 종료 상태를 시스템에 전달하기
4. Wrapper 클래스
가. Wapper 클래스
나. Wapper 클래스와 기본형간의 변화
다. Integer 클래스와 Lang 클래스
라. Character 클래스
마. String 클래스
바. StringBuffer 클래스
5. java.util 패키지
가. StringTokenizer 클래스
나. Emumeration 인트페이스와 Iterator 인터페이스
다. 벡터(Vector) 클래스
라. 스택(Stack) 클래스
마. 링크드 리스트(Linkedlist) 클래스
바. 해시테이블(Hashtale) 클래스

제 6 장 스레드

1. 프로세서와 스레드의 생성 및 종료
가. 프로세스 생성 및 종료
나. 상호작용 명령어의 실행
2. 스레드
가. 스레드
나. Thread클래스를 상속하는 스레드의 생성 및 시작
다. Runnable 인터페이스를 구현하는 스레드의 생성 및 시작
라. 스레드의 종료 및 대기
마. 스레드의 상태
바. 스레드의 우선순위와 자바 스케줄링
사. 스레드 그룹(ThreadGroup)
아. 데몬 스레드와 데몬 그레드 그룹
3. 멀티스레딩(Multi-Threading)
가. 멀티 스레드 프로그래밍
나. 생성자/요청자 문제(Generator/Requester Problem)
다. 스레드의 동기화
라. 모니터
마. 효율적인 동기화 기법 -wait 및 notify메소드

제 7 장 자바입출력

1. 파일과 디렉토리 관리
가. 추상 경로명(abstract pathname)
나. File클래스
다. 현재 작업 디렉토리 얻기와 변경
라. 임시파일의 생성
2. 자바 입출력 스트림 모델
가. 입출력 스트림 모델
나. 문자 스트림의 장점
다. 문자 스트림과 바이트 스트림
3. 기본 입출력 스트림
가. 기본 입출력 스트림
나. 파일 입출력 스트림
4. 연결 입출력 스트림
가. 연속 입력 스트림
나. 파이프 입출력 스트림
5. 메모리 입출력 스트림
가. 메모리 입출력 스트림
나. 배열 입출력 스트림
다. 문자열 입출력 스트림
6. 필터 입출력 스트림
가. 필터 입출력 스트림
나. 필터 입출력 스트림
다. 버퍼 입출력 스트림
라. 데이터 입출력 스트림
마. 라인 번호 입력 스트림
바. 되돌림 입력 스트림
사. 프린트 출력 스트림
아. 스트림 토크나이져
7. 객체 직렬화와 무작위 접근 파일
가. 객체 직렬화
나. 직렬화 인터페이스
다. 자료압출, 자료 손상 검사, 파일 묶기
라. RandomAccessFile 클래스(무작위접근 파일)

제 8 장 AWT

1. AWT(Abstract Window Toolkit) 컴포넌트(Component)
가. AWT 컴포넌트모델
나. Component 클래스
다. 레이블(Lable) 컴포넌트
라. 버튼(Button) 컴포넌트
마. 체크박스(Checkbox) 컴포넌트
바. 선택(Choise) 컴포넌트
사. 리스트(List) 컴포넌트
아. 스크롤바(Scrollbar) 컴포넌트
자. 캔버스(Canvas) 컴포넌트
2. 컨테이너(Container) 컴포넌트
가. Container 클래스와 Inset 클래스
나. 패널(Panel) 컴포넌트
다. 윈도우(Window) 컴포넌트
라. 프레임(Frame) 컴포넌트
마. 대화상자(Dialog) 컴포넌트
바. 파일 대화상자(FileDialog) 컴포넌트
3. 텍스트(Text) 컴포넌트
가. 텍스트 필드 컴포넌트와 텍스트 영영 컴포넌트
나. TextComponent 클래스
다. 텍스트 필드(TextField) 컴포넌트
라. 텍스트 영역(TextArea) 컴포넌트
4. 컨테이너와 레이아웃 관리자
가. 컨테이너 내에서의 컴포넌트 레이아웃
나. 플로우 레이아웃 관리자(FlowLayout)
다. 그리드 레이아웃 관리자(GridLayout)
라. 보더 레이아웃 관리자(BorderLayout)
마. 카드 레이아웃 관리자(CardLayout)
바. 그리드백 레이아웃 관리자(GridBagLayout)
사. 레이아웃 관리자를 사용하지 않는 레이아웃(Absolute Positioning)
5. 메뉴(MENU)
가. 메뉴
나. MenuComponent 클래스
다. 메뉴바(MenuBar) 컴포넌트
라. 메뉴 아이템(MenuItem) 컴포넌트
마. 체크박스 메뉴 아이템(CheckboxMenuItem) 컴포넌트
바. 메뉴(Menu) 컴포넌트
사. 팝업메뉴(PopupMenu) 컴포넌트
아. 메뉴 단축키(MenuShortcut) 컴포넌트
6. 그래픽스
가. 그래픽스(Graphics) 클래스
나. 컴포넌트의 그리기 메소드
다. 컬러(Color)
라. 팔레트 제작
마. 폰트(Font)
바. 커서(Cursor)
사. 이미지(Image)
아. 미디어 트렉커(Media Tracker)
자. 프린트(Print)
7. 자바이벤트모델
가. 자바 이벤트 처리 모델
나. 이벤트의 종류
다. 액션 이벤트(Action Event)
라. 조정 이벤트(Adjustment Event)
마. 컴포넌트 이벤트(Component Event)
바. 컨테이너 이벤트(Container Event)
사. 포커스 이벤트(Focus Event)
아. 입력 이벤트(Input Event)
자. 키 이벤트(Key Event)
차. 마우스 이벤트(Mouse Event)
카. 아이템 이벤트(Item Event)
타. 텍스트 이벤트(TextComponent Event)
파. 윈도우 이벤트(Window Event)
하. 이벤트 큐(Event Queue)
가. 메뉴단축키와 이벤트 처리

제 9 장 애플릿

1. 자바 애플릿(Applet)
가. 자바 애플릿
나. 자바 애플릿의 실행
다. >APPLET<태그와 >PARAM<태그
라. 애플릿에서이미지와 사운드 출력
마. 애니메이션 애플릿의 작성
바. 애플릿과 브라우저 사이의 통신
사. 같은 HTML 페이지 내에 포함된 애플릿 사이의 통신
아. 브라우저 알아내기 및 기본 브라우저 실행하기
자. 실제 스크린 사이즈를 고려하여 애플릿을 작성
차. 애플릿과 JAR 파일

제 10 장 네트워크

1. 자바 네트워크 프로그래밍
가. IP주소(Internet Protocol Address)
나. URL(Uniform Resorce Location)
다. TCP 소켓(Transmission Control Protocol Socket)
라. UDP(User Datagram Protocol
마. 클라이언트/서버 프로그래밍

제 11 장 서블릿

1. 자바 서블릿 개발 환경
가. JSDK1.2 디렉토리구조
나. default.cfg
다. 자바 서버 루트 디렉토리 및 가상 디렉토리의 구조
2. 자바 서블릿
가. 일반 서블릿(GenericServlet)
나. HTTP 서블릿(HttpServlret)
다. 쿠키와 세션
라. 자바 서블릿 예제 프로그램

제 12 장 부록 A. 자바개발환경설정

1. 자바 개발 키드 설치
2. 자바 실행을 위한 환경변수 설정
3. 자바 도큐먼트 설치
4. 자바 튜토리얼 설치
5. 자바 예제 프로그램 실행하기



     getJava 사이트 방문하기 http://my.dreamwiz.com/conbox/
     아래 문서의 소유권은 getJava에 있으며, 리포스팅에 대한 문의는 getJava로 하시기 바랍니다.


For Beginner :::::


Basic Lecture :::::

  1. 데이터 형과 연산자
  2. 제어문과 배열
  3. 클래스의 기본
  4. 클래스의 고급
  5. 주요 키워드와 클래스 종류
  6. 중요 클래스
  7. AWT와 배치
  8. 이벤트 처리
  9. 애플릿
  10. 쓰레드
  11. 예외처리
  12. 입출력(java.io)
  13. 네트워크
  14. JDBC
  15. 객체직렬화

Deep Lecture :::::

  1. Swing
  2. 분산 네트워킹(java.rmi)
  3. New I/O(java.nio)

사이트 1

사이트 2

플래시 사이트

자바

데이타베이스

ORACLE

http--www.netp.pe.kr-db-oracle-server.805-a66585-toc.htm

mysql

리눅스 시스템 관리자를 위한 홈페이지

오라클

DB

JSP 강좌 - MySQL 설치
낙서판
DATABASE.SARANG.NET 홈페이지
http--www.dbakorea.pe.kr-
http--www.dbakorea.pe.kr-misc-


http://nzeo.com/webcasting.html

자바스크립트

홈페이지 만들기
------------
moyamoya's work
JavaScript Guide
JavaScript 강좌
Cyber Web Shool에 오신것을 환영합니다.
Voodoo's Intro to JavaScript

JSP

Beans를 사용하여 회원제 사이트를 만들자!
WebDox
http://okjsp.pe.kr
http://www.4offline.org/
http://www.jspmaster.com/
http://www.javanuri.net/DirServ?sId=JN&cmd=homePage
http://www.doubleiq.pe.kr/

http://www.javaservice.net/

자바스터디 네트워크
Welcome to Yongwoo's Park
Jimmy(진민)의 홈페이지
JAVA 묻고 답하기
JAVA 관련 사이트
Web Engine Sample Servlets

Resin Download
http--javastudy.co.kr-docs-lec_javaweb-
JSP Master에 오신것을 환영합니다.
JSP School
jspSmart
Java Servlet Technology
JavaServer Pagessupfont size=-2TM-font-sup Technology
JSP 강좌
Java(TM) 2 Platform, Enterprise Edition - Documentation
java Server Page API

포럼

Java Developer Connection Forums
Java Network Programming, Second Edition
JAVA 관련 사이트
Java(TM) 2 SDK Documentation


자바 웹 서버/JSP/서블릿

GNUJSP

자바 튜토리얼

자바 빈번한 질문과 답(FAQ)

자바 공개 소스

  • Some Character Encoders in Java(BASE64, UUENCODE, ...)
  • Tim Macinta's Java Swapware
  • Metrochat
  • LazloFont
  • How to access a RS-232 port from Java?
  • JavaChat 1.0, a distributed Java applet
  • Jim Buzbee's Hershey Font Page
  • The Java Cup International Contest Winners Circle
  • Simple Java Servers
  • Java Distributed TCP/IP Message Handling System written by Radu Sion
  • Radu Sion의 소스
  • Rich Burridge Home Page
  • http://www.dd.transnet.de/~meissner/site/java/CreditRoll.html
  • Typewriter Applet 
  • 자바 뉴스그룹/Java Community

    국내 자바 사이트

  • yoonforh의 자바 묻고 답하기 게시판
  • 김덕태 님의 자바 1.1 한글 관련 내용
  • 한국 자바 개발자 컨퍼런스
  • MobileJava Developer Community
  • 자바 문서 한글화 사이트(자바 문서 한글화에 참여할 뜻있는 분들을 기다리고 있습니다.)
  • 김필호 님의 자바와 한글 게시판
    유료 자바 게시판이며 답변이 신속, 성실하게 올라옵니다.
  • 김필호 님의 자바 Q&A 게시판
  • 강신동 님의 Korea Java Developer Connection
  • Whang's Java List Version 2.0
  • Java FAQ - Korean Version
  • 광운대 자바랜드(JavaLand:자바네 동네)
  • 이경하 님의 자바 페이지


  • 자바 온라인 매거진




    자바 리소스 디렉토리

    자바 기술

  • Pointers for Research on Java Implementation

    Threads/Concurrency

  • The Java Memory Model
  • package util.concurrent (by Doug Lea)
  • (Book) Concurrent Programming in Java - Design principles and patterns 2nd ed.(by Doug Lea)
  • JINI

  • The JINI COMMUNITY
  • Jan Newmarch's Guide to JINI Technologies(A tutorial)
  • 지니에 흥미를 가지고 있는 그룹(Jini Korea Interesting Group)
  • JNDI

  • Java(TM) Naming & Directory Interface (JNDI(TM))
  • Internationalization

  • Writing Global Programs
  • RMI

  • rmi-users.logfile by thread
  • java.rmi Properties
  • sun.rmi Properties
  • JNI

  • Frequently Asked Questions - JavaTM 2 SDK v1.2 and JNI
  • JDBC

  • JDBC Frequently Asked Questions
  • http://splash.javasoft.com/jdbc/jdbc.drivers.html
  • George Reese's Java Pages(JDBC-mSQL 홈페이지)
  • The JDBC(tm) database access API.
  • MsqlJava(mSQL.class) Home Page
  • 오러클 JDBC 드라이버 다운로드
  • 자바 빈즈

    Java Imaging

    Java Card

    자바 컴파일러

    자바 역컴파일러

    자바 Obfuscator(decompile 방지 툴)

    자바 C 번역기

    오피스 웨어

    메일 프로그램

  • 큐빅 메일


  • 자바 파운데이션 클래스 - Swing

  • Java Foundation Classes
  • Swing by Matthew Robinson and Pavel Vorobiev - an online avaialbe swing book
  • Netscape IFC: Overview
  • Netscape DevEdge - IFC
  • 마이크로소프트의 자바 사이트(AFC)
  • 자바 Plugins

  • Java Plug-in Product Homepage
  • Java Plug-in 1.2 Software FAQ
  • JAVA PLUG-IN SCRIPTING (자바 플러그인을 스크립트와 연동하기)
  • 자바 Collections API

  • Download JDK 1.1 Collections Package (to use JDK 1.2 Collections package in JDK 1.1)
  • reference objects

  • a Javaworld article : Interact with garbage collector to avoid memory leaks
  • Reference Objects and Garbage Collection
  • Package summary of java.lang.ref
  • Chapter 9 of Inside the Java 2 Virtual Machine Garbage Collection by Bill Venners
  • 자바 개발 환경

  • 시맨텍 까페
  • 비주얼 까페 팁 페이지
  • 시맨텍 비주얼 까페 
  • JBuilder Home page
  • 썬 자바 워크숍
  • 넷빈즈
  • JDE - Java Development Environment for Emacs
  • 마이크로소프트 (비주얼 J++/C++)
  • Visual J++ Web site
  • Using MSVC for Java
  • Using JDK1.1 in Visual J++
  • Microsoft SDK for Java Download
  • J2EE

  • Enhydra Enterprise - Open Source J2EE Application Server for the Enterprise
  • 자바 CGI

    Security

  • The Scoop on RMI and SSL
  • Securing Java RMI with the SSLava Toolkit
  • Creating a Custom RMI Socket Factory
  • JavaTM Secure Socket Extension (JSSE)
  • Frequently Asked Questions - Applet Security
  • Signed Applet Example (JDK 1.1.x)

    아래의 빈번한 질문과 답 사이트에 좀더 많은 정보가 있습니다.

  • Performance / Benchmark

  • Java Performance Tuning
  • Jack Shirazi's Java Performance Tuning website
  • The Java Performance Report
  • Java Benchmark
  • Volano Report
  • Java Versus C/C++ Benchmarks
  • Java Memory Management Performance
  • Improving Swing Performance
  • 자바 버그

    XML 관련

    UML

    자바 포팅 이슈

  • Java-Linux
  • jGuru Java on Linux FAQ
  • Platforms Supporting Java
  • IBM 자바 개발 센터
  • IBM's Java-related Technology
  • KAFFE - A virtual machine to run Java(tm)* code
  • alphaWorks
  • OSF Java Program Page
  • 넷스케이프의 JDK 1.1.x 지원
  • 썬의 자바 공식 페이지

  • 자바 홈페이지
  • Documentation Index
  • White Papers
  • Using HotJava(tm)
  • Java(tm) IDL
  • Java API Overview
  • Java: The Inside story
  • Java Coding Conventions(자바 코딩 관례)
  • Examples of Using the JDK 1.1 AWT
  • Java Platform Debugger Architecture
  • JIMI Software Development Kit - a class library for managing images
  • 자바 스크립트

  • JavaScript Developer Central(DevEdge Online)
  • JavaScript Documentation
  • Microsoft Scripting Technologies(JScript and VBScript)
  • WEBFX Javascript Examples
  • JavaScript Library
  • The JavaScript Index v2.0
  • Squatt Java/JavaScript Net-Zine
  • About Kyle's JavaScript Navigator Window
  • Microsoft Internet Explorer 관련

  • Microsoft Windows Script Technologies
  • 기타

  • James Gosling 홈페이지





    인터넷사업

    검색도구 사업
    iBizHelper

    웹기술

    ASP

    VB&SQL Technique Forum Site
    [웹매니아] 매니아포럼

    CGI

    HappyCGI
    unix 강좌

    PHP

    Home
    김성박의 PHP & MySQL & ORACLE 사이트
    PHP3 Manual File upload support
    풋내기의 myphp
    PHP Hypertext Preprocessor
    투덜이 PHP

    ssl

    ssl

    cgis

    남천이네 홈페이지
    ===================================================================
    자바 강좌 (기초부터 고급까지 몽땅!!)
    1. 자바 초보를 위하여 I - 자바입문
    2. 자바 초보를 위해 II - 초보자가 하기 쉬운 실수
    3. 자바 애플릿의 기초 I
    4. 자바 애플릿의 기초 II
    5. 자바 제어구조
    6. 자바 AWT
    7. 자바 이벤트
    8. 자바 네트워크
    9. 자바 데이타베이스 프로그래밍 - JDBC 와 Postgres
    10. 자바 데이타베이스 프로그래밍 - JDBC 와 mSql
    11. 자바 분산 프로그래밍 - RMI
    12. 자바 분산 프로그래밍 - CORBA
    13. 자바 분산 프로그래밍 - CORBA CALLBACK
    14. 자바 OS
    15. 자바 프로그래밍 - 자바 쓰레드
    16. 자바 프로그래밍 - 라운드 로빈 스케쥴러
    17. 자바 IO (입출력)
    18. 자바 그래픽 프로그래밍 - 폰트를 이용하자.
    19. 자바 웹 프로그래밍 - CGI 1편 (인터넷 검색엔진의 원리)
    20. 자바 웹 프로그래밍 - CGI 2편
    21. 자바 문서화 프로그램 - JAVADOC
    22. JACL 소개
    23. 자바 프로그래밍 - 다형성(폴리모피즘)
    24. 자바 Cut & Paste
    25. 자바스크립트를 이용한 자바 애플릿 제어
    26. 자바 그래픽 프로그래밍 - 스윙 1편
    27. 자바 그래픽 프로그래밍 - 스윙 2편
    자바 웹 프로그래밍 (Servlet/JSP)
    1.JSWDK 사용법과 간단한 JSP
    2.자카르타 프로젝트 소개
    프로그래밍 예제
    1.JPEG 프로그래밍 예제
    2.더블 버퍼링 예제
    3.이미지 스케일링
    4.텍스트 필드에서 글자를 오른쪽으로
    5.AWT에서 메뉴 숏컷
  •  

    출처 : Tong - kkj2188님의 Java통

    반응형

    채팅프로그램을 짜는데 자동으로 스크롤이 되지 않는것을 발견

    자바스터디에 있는 Q & A 게시판 보고 해결했습니다.


    원래 스크롤페인은 자동스크롤이 되게 구현되어 있는데

    채팅프로그램과 같이 쓰레드를 사용하는 곳에선

    스크롤내의 컴퍼넌트 값은 변화하나 스크롤은 변화되지 않는다고

    합니다.


    이를 구현하기 위해선


    변수로

    JScrollPane txtScroll;

    JTextArea txtArea; 선언되었다고 치면.


    txtArea.append("내용"); //내용이 추가될때마다 아래문장을 호출

    txtScroll.getVerticalScrollBar().setValue(txtScroll.getVerticalScrollBar().getMaximum());

    반응형
    자바에서는 Timer 와 TimerTask 를 이용한 주기적인 작업이 가능합니다.
    예를 들어 1분에 한번씩 특정 디렉토리를 감시한다던지.
    매일 밤 12시에 백업을 실시한다던지...
    이런 기능이 필요하다면 Timer 와 TimerTask 를 사용해보세요.
    아래 예제는 1초에 한번씩 카운트 라벨이 바뀌는 스윙 프로그램입니다.

    import java.util.TimerTask;
    import javax.swing.*;
    import java.awt.*;
    import java.util.Timer;

    public class LabelChange {

    public static void main(String[] args) {
    MyFrame frame = new MyFrame();

    Timer timer = new Timer();
    //TimerTask, Delay시간, 동작주기
    timer.schedule(new LabelChangeTimerTask(frame), 0, (1 * 1000));
    }
    }

    class MyFrame
    extends JFrame {

    private JLabel label = null;

    public MyFrame() {
    this.getContentPane().setLayout(new BorderLayout());
    label = new JLabel();
    this.getContentPane().add(label, BorderLayout.CENTER);
    this.setSize(200, 200);
    this.setVisible(true);
    }

    public void setLabelValue(String msg) {
    label.setText(msg);
    }
    }

    class LabelChangeTimerTask
    extends TimerTask {

    private MyFrame frame = null;
    private static int cnt = 0;

    public LabelChangeTimerTask(MyFrame frame) {
    this.frame = frame;
    }

    public void run() {
    cnt++;
    frame.setLabelValue(cnt + "");
    }
    }
    <출처:ibm.com/developerworks/kr>
    반응형

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

    public class JImagePanel extends JPanel {
    Image image;

    public JImagePanel(Image image) {
    this.image = image;
    }

    public void paintComponent(Graphics g) {
    g.drawImage(this.image, 0, 0, this);
    }

    public static void main(String[] args) {
    JFrame frame = new JFrame();
    ImageIcon icon = new ImageIcon("d:\\java.gif");
    JImagePanel panel = new JImagePanel(icon.getImage());
    frame.getContentPane().add(panel);
    frame.setSize(300,300);
    frame.setVisible(true);
    }
    }
    <출처:ibm.com/developerworks/kr>

    반응형
    자바 API에서 제공하는 것은 가상머신 관련된 것 뿐이라서 실제 메모리하고는 상관이 없습니다.

    JNI를 사용해도 되겠지만 C 프로그램과는 친하고 싶지 않아서리... ^^ 꽁수를 부려봤습니다.



    윈도우 플랫폼의 메모리 사용량은 systeminfo 라는
    윈도우 명령을 사용해서 가능하기는 합니다만...
    윈도 XP 이상에서만 지원되죠. 98 같은데서는 안됩니다 =.=

    import java.io.*;

    public class MemoryInfo {
    public MemoryInfo() {
    }
    public static void main(String[] args) {
    try {
    String output, err;
    String[] cmd = {"systeminfo.exe"};
    Process proc = Runtime.getRuntime().exec(cmd);

    BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
    BufferedReader stderr = new BufferedReader(new InputStreamReader(proc.getErrorStream()));

    try {
    while ( (output = stdout.readLine()) != null) {
    if (output.indexOf("메모리") > 0) {
    System.out.println(output);
    }
    }
    while ( (err = stderr.readLine()) != null) {
    System.out.println(err);
    }
    }
    catch (IOException e) {
    System.exit(0);
    }
    }
    catch (IOException e1) {
    System.err.println(e1);
    System.exit(1);
    }
    }
    }

    ============== 실행 결과 =============

    총 실제 메모리: 511MB
    사용 가능한 실제 메모리: 158MB
    가상 메모리: 최대 크기: 2,048MB
    가상 메모리: 사용 가능: 2,004MB
    가상 메모리: 사용 중: 44MB
    <출처:ibm.com/developerworks/kr>
    반응형

    레지스트리는 운영체제와 프로그램에서 필요한 정보를 담고 있는 데이터베이스와 비슷하다고 할 수 있다. 일반적인 윈도우 프로그램들은 레지스트리에 접근 할 수 있지만 자바 프로그램에서는 접근 할 수 없었다. 그 이유는 "자바의 철학"에 위배 되기 때문일 것이다. 자바 프로그램은 모든 운영체제에서 실행 가능 해야 하는데 '윈도우에만 존재하는 레지스트리'라는 것을 지원하지 않는 것은 당연한 일이었다. 게다가 레지스트리는 잘못 건드리면 윈도우 자체가 폭탄처럼 변할 수 도 있기 때문에 상당히 조심스러울 수 밖에 없다.

    하지만 JDK 1.4 버전부터는 일부 제한적으로 레지스트리에 접근 할 수 있도록 그 기능이 추가되었다. 보통 자바 프로그램에서는 프로그램 실행에 필요한 정보들을 파일로 저장해 두었다가 프로그램이 종료된 후 다시 실행하더라도 필요한 정보를 얻도록 하는 방법을 사용했다. 이때 파일을 사용하게 되면 이런 저런 이유로 코딩도 복잡하고 귀찮기 짝이 없다. 특별히 복잡한 정보도 아닌데 여러 모로 프로그래머가 고생을 하는 것이다. 바로 이런 경우에 레지스트리를 사용하면 간단히 해결된다. 아마도 많은 자바 개발자들의 요구 사항으로 인하여 JDK 1.4부터 추가 된 것이 아닌가 싶다.

    그렇다면 과연 자바 프로그램에서 레지스트리를 어떻게 사용할 것인가? 아무리 좋은 기능이 있어도 그 기능을 적절한 곳에 사용하지 못한다면 소용이 없게 된다. 레지스트리에 스트링 값을 입력하고 읽어오는 간단한 예제를 하나 만들어 보도록 하자. (참고로 예제 작성과 실행은 윈도우 XP에서 이루어졌다. 윈도우 계열 운영체제에서는 대부분 작동하겠지만 윈도우를 제외한 다른 운영체제에서는 예측 할 수 없음을 밝혀두는 바이다.)

    레지스트리를 이용한 사용자 인증 프로그램

    우리가 주로 사용하는 윈도우 운영체제에서는 사용자 계정을 제공한다. 따라서 인증된 사용자가 아니면 사용할 수 없다. 우리가 작성할 예제는 이와 비슷하지만 훨씬 간단한 프로그램이다. 프로그램이 제공하게 될 간단한 기능은 다음과 같다.
    프로그램을 처음 사용하는 경우, 이름을 입력 받아 레지스트리에 등록한다.
    사용자로부터 이름을 입력 받아서 등록된 이름과 같다면 원하는 작업을 계속 수행한다.
    등록된 이름이 아닌 경우라면 그냥 종료된다.

    프로그램에 대한 설명은 따로 필요 없이 주석을 참고하면 된다. 그리고 컴파일이나 실행에 대해서 잘 모른다면 다른 자바 기초 서적을 참고하기 바란다.

    소스 코드는 다음과 같다.

    import java.util.prefs.*;
    import java.io.*;

    public class RegistryTest {

    // 키와 값을 출력한다.
    public static void printKeyValue(String key, String value) {
    System.out.println("Key = [" + key + "] , Value = [" + value + "]");
    }

    // 해당 노드에 키를 포함하고 있는지 검사한다.
    public static boolean contains(Preferences node, String key) {
    return node.get(key, null) != null;
    }

    // 키보드로부터 이름을 입력받는다.
    public static String readName() {
    System.out.println("Input your name.");
    String value = null;
    try {
    InputStreamReader isr = new InputStreamReader(System.in);
    BufferedReader in = new BufferedReader(isr);
    value = in.readLine();
    } catch (IOException e) {
    // 예외 처리...
    }
    return value;
    }

    public static void main(String args[]) throws BackingStoreException {
    Preferences userRootPrefs = Preferences.userRoot();

    String key = "name"; // 등록할 키 이름
    String value = "";
    String newName = null;
    if (contains(userRootPrefs, key)) { // 이미 키가 존재한다.
    System.out.println("Key already exists !");
    value = userRootPrefs.get(key, "");
    newName = readName(); // 키보드로부터 입력 받은 이름
    if (newName.equals(value)) {
    // 입력된 이름과 레지스트리에 등록된 이름 같다.
    printKeyValue(key, value);
    // 결과 출력 후, 다른 원하는 작업 수행...
    }
    else {
    // 이름이 다르다, 당신은 누구얏 ?
    System.out.println("Invalid user name !");
    }
    }
    else { // 키가 없으므로 처음 레지스트리에 등록
    value = readName();
    userRootPrefs.put(key, value);
    printKeyValue(key, value);
    }
    }
    }

    <출처:ibm.com/developerworks/kr>

    반응형
    '자바 프로그래머'라면 한번쯤 고민하게 되는 부분이 있다. 그 중 하나가 자바 API가 지원하지 못하는 부분에 대한 것이다. 예를 들어 자바 API로는 네트워크 인터페이스 카드(NIC, 흔히 랜 카드라고 부른다)의 맥 어드레스(MAC Address)를 알아 낼 방법이 없다. 결국 JNI(Java Native Interface)를 사용하거나 다른 꽁수(?)를 찾아내곤 한다. 본인이 생각하기에는 두 방법 모두 시원스런 방법은 아니라서 상당히 거시기한 느낌이다. JNI를 사용하자니 C/C++ 코드를 사용하여 플랫폼에 제한적이 되어버리고… 꽁수를 사용하자니 안 먹히는 경우가 너무 많고…

    어쨌거나 다른 해결 방법이 없다면 둘 중 하나를 사용해야 한다. 두 가지 중에서 본인이 많이 사용하는 방법은 꽁수를 사용하는 방법이다. 여기서 말하는 꽁수란 원하는 결과를 얻을 수 있는 외부 프로세스를 실행시키고 그 결과를 받아내어 필요한 부분만 얻어내는 방법을 사용하는 것이다. 이번 기사에서는 윈도우 XP 운영체제의 시스템 비밀스런(?) 정보를 얻어내는 자바 프로그램을 만들어 보도록 하자.

    ※ 주의: 본 소스의 모든 내용은 윈도우 XP 프로페셔널에서만 동작한다. 윈도우 XP 홈에디션에는 시스템 정보를 얻어내는 프로그램(systeminfo.exe)이 지원되지 않는다.

    일단 화면에 도스창을 하나 띄워보자. 그런 후, "systeminfo"라고 입력하면 자신이 사용하는 윈도우 시스템에 대한 여러 정보가 나타난다. 윈도우 XP 프로페셔널에 이런 프로그램이 있다는 사실은 본인도 이 프로그램을 작성하면서 처음 알게 된 것이다. 자세한 세부 사항은 "systeminfo /?"라고 입력하여 도움말을 참고하도록 하자.

    화면에 보이는 결과를 살펴보면 의외로 많은 사실들을 알 수 있다. 운영체제의 자세한 버전이나 사용자 정보, 실제 메모리 정보, 운영체제에 적용된 패치 등등… 이제부터는 이 정보들을 이용하여 자신이 원하는 몇 가지만을 보여주는 간단한 프로그램을 만들어보자.

    이 프로그램의 핵심은 자바 프로그램 내에서 외부 프로그램을 실행시키고 그 결과를 받아내는 것이다. 이미 알고 있는 사람들에게는 아주 쉬운 일이지만 한번도 사용해보지 않았다면 이번 기회에 익혀두도록 하자. 나중에 두고 두고 써먹을 수 있는 프로그램 기법이 될 것이다(실제로 필자도 위기가 닥칠 때마다 이용해서 아주 유용하게 사용하고 있다). 아래 자바 메소드는 실행할 외부 프로그램의 이름을 스트링으로 지정하고 그 프로그램을 실행 후에 표준 출력과 표준 에러를 받아 내는 것이 전부이다.

    public void run() {
    Runtime runtime = Runtime.getRuntime();
    Process process = null;

    try {
    // this.command = "systeminfo.exe";
    process = runtime.exec(this.command); // 외부 프로그램 실행
    } catch (IOException ioe) {
    ioe.printStackTrace();
    }

    // 표준 출력
    InputStream standardOutput = process.getInputStream();
    // 표준 에러
    InputStream standardError = process.getErrorStream();

    InputStreamReader ir = new InputStreamReader(standardOutput);
    InputStreamReader ow = new InputStreamReader(standardError);

    BufferedReader outReader = new BufferedReader(ir);
    BufferedReader errorReader = new BufferedReader(ow);

    StringBuffer stdout = new StringBuffer();
    StringBuffer stderr = new StringBuffer();
    String line = null;
    try {
    // 루프를 돌면서 퓨준 출력과 표준 에러를 계속 받아낸다
    while ( (line = outReader.readLine()) != null) {
    stdout.append(line).append("\n");
    }
    while ( (line = errorReader.readLine()) != null) {
    stderr.append(line).append("\n");
    }
    standardOutput.close();
    standardError.close();
    } catch (IOException ioe) {
    ioe.printStackTrace();
    }
    result.setStdout(stdout.toString()); // 이 결과를 나중에 사용한다
    result.setStderr(stderr.toString());
    }

    위의 코드 마지막 부분에 나중에 사용할 결과를 지정하는 부분이 있다. 그 결과를 이용해서 원하는 정보만 가려내는 코드는 다음과 같다.

    String result = pRunner.result.getStdout();
    StringTokenizer st = new StringTokenizer(result, "\n");
    while (st.hasMoreElements()) {
    String line = (String)st.nextElement();
    if (line.startsWith("호스트 이름")) {
    addSysInfo(line);
    }
    if (line.startsWith("OS 이름")) {
    addSysInfo(line);
    }
    if (line.startsWith("등록된 소유자")) {
    addSysInfo(line);
    }
    if (line.startsWith("Product ID")) {
    addSysInfo(line);
    }
    if (line.startsWith("System Up Time")) {
    addSysInfo(line);
    }
    }

    원하는 정보를 모두 얻었다면 이제 GUI로 아름답게 보여주는 일만 남았다. 이 부분에서는 여러 분들이 직접 원하는 형태대로 만들어보기 바란다.
    <출처:ibm.com/developerworks/kr>
    반응형

    자바 프로그래머라면 당연히 AWT나 Swing 컴포넌트에 대해서 알고 있고 GUI를 위해서 여러 형태의 컴포넌트들을 조합해서 원하는 화면을 만들어 보았을 것이다. 그러나 때로는 JDK 에서 지원하는 표준 컴포넌트들만으로는 무엇인가 부족함을 느껴 본적은 없는가? 자신의 입맛에 딱 맞는 컴포넌트가 없어서 오랜 시간을 허비하거나 고생해본 경험이 있을 수도 있다. 이번 기사에서는 자신만의 간단한 컴포넌트를 작성해보기로 하자.

    이번 소스에서 만들것은 CPU의 사용양을 윈도우의 작업 관리자에서 보이는 형태처럼 만드는 것이다. JProgressBar를 사용하면 비슷한 형태가 나오기는 하지만 아무래도 많이 다르다는 느낌이 들어서 직접 만들어서 사용하자.

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

    public class PmTickChartPanel extends JPanel {
    BorderLayout borderLayout1 = new BorderLayout();
    JPanel centerPanel = new JPanel();
    JPanel southPanel = new JPanel();
    JPanel northPanel = new JPanel();
    JLabel dataLabel = new JLabel();
    GridLayout gridLayout1 = new GridLayout();
    BorderLayout borderLayout2 = new BorderLayout();
    JLabel titleLabel = new JLabel();
    BorderLayout borderLayout3 = new BorderLayout();
    JPanel westPanel = new JPanel();
    JPanel eastPanel = new JPanel();

    // 편의상 눈금은 10개만 보이고 색상 변경도 10 단위로만
    int tickCount = 10;

    Border centerPanelBorder;
    private Border border1;

    public PmTickChartPanel() {
    try {
    jbInit();
    } catch (Exception e) {
    e.printStackTrace();
    }
    }

    private void jbInit() throws Exception {
    centerPanelBorder = BorderFactory.createLineBorder(Color.green, 1);
    border1 = BorderFactory.createBevelBorder(BevelBorder.LOWERED, new Color(4, 4, 4), new Color(3, 3, 3), Color.black, Color.black);
    this.setBackground(Color.black);
    this.setForeground(Color.green);
    this.setBorder(border1);
    this.setLayout(borderLayout1);
    centerPanel.setBackground(Color.black);
    centerPanel.setFont(new java.awt.Font("Dialog", 0, 12));
    centerPanel.setForeground(Color.green);
    centerPanel.setBorder(centerPanelBorder);
    centerPanel.setLayout(gridLayout1);
    southPanel.setBackground(Color.black);
    southPanel.setForeground(Color.green);
    southPanel.setLayout(borderLayout2);
    northPanel.setBackground(Color.black);
    northPanel.setForeground(Color.green);
    northPanel.setLayout(borderLayout3);
    dataLabel.setBackground(Color.black);
    dataLabel.setFont(new java.awt.Font("Dialog", 1, 12));
    dataLabel.setForeground(Color.green);
    dataLabel.setHorizontalAlignment(SwingConstants.CENTER);
    dataLabel.setHorizontalTextPosition(SwingConstants.CENTER);
    dataLabel.setText("");
    titleLabel.setBackground(Color.black);
    titleLabel.setFont(new java.awt.Font("Dialog", 1, 12));
    titleLabel.setForeground(Color.green);
    titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
    titleLabel.setHorizontalTextPosition(SwingConstants.CENTER);
    this.titleLabel.setText("CPU");
    gridLayout1.setColumns(1);
    gridLayout1.setRows(tickCount);
    gridLayout1.setHgap(1);
    gridLayout1.setVgap(1);
    eastPanel.setBackground(Color.black);
    eastPanel.setForeground(Color.green);
    westPanel.setBackground(Color.black);
    westPanel.setForeground(Color.green);
    this.add(centerPanel, BorderLayout.CENTER);
    this.add(southPanel, BorderLayout.SOUTH);
    southPanel.add(dataLabel, BorderLayout.CENTER);
    this.add(northPanel, BorderLayout.NORTH);
    northPanel.add(titleLabel, BorderLayout.CENTER);
    this.add(westPanel, BorderLayout.WEST);
    this.add(eastPanel, BorderLayout.EAST);
    setPreferredSize(new Dimension(90, 180));

    for (int i = 0; i < tickCount; i++) {
    Tick tick = new Tick(); // 눈금(tick)을 10개 생성하여 추가
    this.centerPanel.add(tick);
    }
    }

    /* 실제 컴포넌트에 값을 설정하면 눈금에 색상을 변경한다
    * 값의 범위는 0~100 으로 하자
    */
    public void setValue(int value) {
    if (value > 100) { // 100을 넘어가면 100으로
    value = 100;
    }
    else if (value < 0) { // 0보다 작으면 0으로
    value = 0;
    }

    // 일단 전체 tick 을 검정색으로 칠하고
    for (int j = 0; j < tickCount; j++) {
    Tick tick = (Tick)this.centerPanel.getComponent(j);
    tick.setBackground(Color.black);
    tick.repaint();
    }

    // 입력된 value 값에 해당하는 tick들만 다시 녹색으로 칠한다
    for (int i = 0; i < tickCount; i++) {
    Tick tick = (Tick)this.centerPanel.getComponent(i);
    if (tickCount - i > value / 10) {
    // nothing to do
    } else {
    tick.setColor(Color.green);
    tick.repaint();
    }
    }

    // 하단에 숫자로 값을 표시
    this.dataLabel.setText(value + " %");
    }

    public static void main(String args[]) {
    JFrame frame = new JFrame(); // 테스트용 프레임을 생성하자
    frame.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
    System.exit(0);
    }
    });
    PmTickChartPanel tickPanel = new PmTickChartPanel();
    frame.getContentPane().setLayout(new BorderLayout());
    frame.getContentPane().add(tickPanel, BorderLayout.CENTER);

    frame.setSize(300, 300);
    frame.setVisible(true);

    for (int i = 0 ; i < 100 ; i++) { // 테스트를 위해 값을 설정하는 부분
    try {
    Thread.sleep(100); // 잠시 쉬었다가
    tickPanel.setValue(i); // 1씩 증가되는 값을 설정, 10 단위로 눈금 색상 변경
    }
    catch (InterruptedException ie) {
    ie.printStackTrace();
    }
    }
    }
    }

    /* 10 단위의 눈금 하나에 해당하는 컴포넌트
    * 같은 값을 갖는 것이 좌우 하나씩 쌍으로 구성된다
    */
    class Tick extends JPanel {
    JPanel lPanel = new JPanel();
    JPanel rPanel = new JPanel();
    GridLayout layout = new GridLayout(1, 2);

    public Tick() {
    this.setBackground(Color.black);
    this.setForeground(Color.black);
    lPanel.setBackground(Color.black);
    lPanel.setForeground(Color.green);
    rPanel.setBackground(Color.black);
    rPanel.setForeground(Color.green);
    layout.setHgap(1);
    setLayout(layout);
    add(lPanel);
    add(rPanel);
    }

    protected void setColor(Color color) {
    lPanel.setBackground(color);
    rPanel.setBackground(color);
    }
    }
    <출처:ibm.com/developerworks/kr>

    + Recent posts