Java

[Good Java Style -3] import 문장들 - End

감식자 2006. 5. 16. 19:20

프로그래머가 전체 패키지(예를 들어, java.awt.* ) 대신에 개별적인 클래스들을 import하는 경우에특히 클래스는 많은 수의
import 문장들을 가질 수 있어 제어할 수 없는 지경에 이룰때가 있다. import 문장을 다음과 같이 배치해보라.


1. 자바 표준 클래스들 (java.*)
2. 자바 확장 클래스들 (javax.*)
3. 서드파티 업체가 제공한 클래스들
4. 응용프로그램의 클래스들

서드파티 업체가 제공한 클래스들과 응용프로그램 클래스들에 대해서는 주석을 다는 것을 확실히 하고, 특히 그것들이 명확하지

않은 이름을 갖지 않도록 하라. 줄 끝의 주석(//)을 사용하거나 그 부문의 처음에 주석을 배치하라.

또한 당신이 완벽주의자라면 import하는 각 그룹을 알파벳 순으로 정렬하는 것도 괜찮을 것이다..

E x a m p l e 7. 나쁜 i m p o r t 스타일

import java.util.*;
import javax.swing.*;
import java.awt.event*;
import com.gensym.com.*;
import javax.swing.table.*;
import com.pv.jfcx.*;
import java.awt.*;
import com.melthorn.util.*;

E x a m p l e 8. 좋은 i m p o r t 스타일

import java.awt.*;
import java.awt.event*;
import java.util.*;
import javax.swing.table.*;
import com.gensym.com.*; // BeanXporter
import com.pv.jfcx.*; // ProtoView
import com.melthorn.util.*; // Utilities

// Java classes
import java.awt.*;
import java.awt.event*;
import java.util.*;
import javax.swing.table.*;

// BeanXporter
import com.gensym.com.*;

// ProtoView GUI components
import com.pv.jfcx.*;

// Application classes
import com.melthorn.util.*;

클래스

하나의 소스 파일에 여러 개의 클래스가 들어 있을 경우 클래스들을 정리하지 않고 그냥
소스코드만을 정리한다면 그다지 좋은 스타일을 얻을 수 없다. 꼭 클래스의 배치 까지도
고려하여 정리해줘야 한다. 다음은 당신의 소스 파일들 안에 클래스들을 구성하는 순서
이다.

1. Javadoc 주석이나 다른 헤더 주석
2. 클래스 선언
3. 필드(field) 선언들
4. 빈 줄이나 다른 구분자(seperator)
5. 생성자
6. 빈 줄이나 다른 구분자(seperator)

7. main()을 제외하고 논리적으로 그룹 지어진 메서드(method)들
8. 빈 줄이나 구분자(seperator)
9. inner 클래스들
10. 빈 줄이나 구분자(seperator)
11. main()

E x a m p l e 9 . 나쁜 클래스 스타일

// RotPad -- GUI app. for ROT ciphering
public class RotPad extends JFrame {
private static final String TRANSFORM_ROT13 = "ROT13";
private static final String TRANSFORM_ROT13N5 = "ROT13N5";
private static final String TRANSFORM_ROTASCII = "ROT-ASCII";
private void jbInit() throws Exception {
...
}
public static final String TITLE = "RotPad";
public static final String VERSION = "1.0";
public static void main(String[] args) {
...
}
public RotPad() {
...
}

private JPanel jPanel1 = new JPanel();
private JPanel jPanel2 = new JPanel();
private BorderLayout borderLayout1 = new BorderLayout();
...
}

E x a m p l e 1 0. 좋은 클래스 스타일

/**
* RotPad is a simple GUI application for performing
* rotation ciphers on plain text.
*
* @author Thornton Rose
* @version 1.0
*/
public class RotPad extends JFrame {

// Public constants


public static final String TITLE = "RotPad";
public static final String VERSION = "1.0";

// Private constants


private static final String TRANSFORM_ROT13 = "ROT13";
private static final String TRANSFORM_ROT13N5 = "ROT13N5";
private static final String TRANSFORM_ROTASCII = "ROT-ASCII";

// GUI components [JBuilder generated]


private BorderLayout borderLayout1 = new BorderLayout();
private JPanel jPanel1 = new JPanel();
private JPanel jPanel2 = new JPanel();

...

/**
* Construct a new instance of this class.
*/
public RotPad() {
...
}

/**
* Initialize UI components. [JBuilder generated]
*/
private void jbInit() throws Exception {
...
}


...

/**
* Start the application.
*/
public static void main(String[] args) {
...
}
}


필드 선언(Field Declaration)

어떤 클래스들은 상당히 많은 수의 필드들을 가지고 있고 만약 필드들이 잘 구성되지 않으면 유지보수하기가 어려워진다.
그러므로 다음과 같은 순서로 필드들을 구성하는 것을 권장한다.
1. public 상수들 (final 과 static final)
2. public 변수들
3. protected 상수들
4. protected 변수들
5. package 상수들
6. package 변수들
7. private 상수들
8. private 변수들


덧붙여, 필드를 선언할 때 다음과 같은 지침을 따르기를 바란다.

o 한 줄에 하나의 선언을 사용하라.
o 최소한 public 필드와 protected 필드에 대해 Javadoc 주석을 사용하라.
o 상수(constant)들의 이름에 대해 대문자를 사용하라. 대문자를 사용하면 선언(declaration)과 표현(Expression)

모두가 명확해 진다.
o JBuilder나 Visual Cafe와 같이 필드 선언을 생성하는 도구를 사용한다면 프로그램이 자동적으로 생성한 필드들과

다른 필드들을 나눠서 배치하라.그렇게 하면 UI 코드의 유지보수가 훨씬 쉬워진다.

E x a m p l e 1 1 . 나쁜 필드 스타일


public class CustomerSearchDialog extends JDialog {
private JLabel firstNameLabel = new JLabel();
private JLabel lastNameLabel = new JLabel();
public static final RESULT_SELECT = 1;
private Vector results = new Vector(); // Search results.
private DefaultTableModel tableModel = new DefaultTableModel();
public static final RESULT_CANCEL = 0;
// ...
}

E x a m p l e 1 2 . 좋은 필드 스타일


/**
* ...
*/
public class CustomerSearchDialog extends JDialog {
/**
* Indicates that search was cancelled; returned by showDialog() when
* user clicks cancel button.
*/
public static final RESULT_CANCEL = 0;

/**
* Indicates that a customer was selected; returned by showDialog() when
* user clicks select button.
*/
public static final RESULT_SELECT = 1;
private Vector results = new Vector(); // Search results.
private DefaultTableModel tableModel = new DefaultTableModel(); // Grid model.

// GUI fields. [JBuilder]

private JLabel firstNameLabel = new JLabel();
private JLabel lastNameLabel = new JLabel();
// ...
}


메서드 선언(Method Declaration)


메서드 선언을 작성하는 데 다음과 같은 지침을 사용하라.
o 항상 Javadoc 주석이나 헤더 주석을 갖도록 하라.
o 항상 접근 제한자(access modifier)를 처음에 위치시켜라.
o 줄이 너무 길면 하나 이상의 줄로 나눠라.
o 메서드가 많은 전달인자를 갖는다면 분리된 줄에 각각을 배치하는 것에 대해고려하라.
o 메서드 이름과 여는 괄호 사이에 공백을 넣지 말라.
o 항상 닫는 소괄호(')')와 함수를 여는 중괄호({} 사이에 개행문자(line break)와같은 공백을 추가하라.


E x a m p l e 1 3. 나쁜 메서드 스타일

public int getTypeCount (String custType){
...
}
static public getInstance(){ ... };
public void showRange()
throws RangeException {
...
}

E x a m p l e 14 . 좋은 메서드 스타일

/**
* Return the single instance of this class.
*/
public static CalculationEngine getInstance() {
return instance;
}

/**
* Calculate the consumption coefficient.
*/
public float calculateConsumptionCoefficient(int base, float variance,
int iterations) throws RangeException {
// ...
}

/**
* Calculate the consumption coefficient.
*/
public float calculateConsumptionCoefficient(int base,float variance,int iterations)throws RangeException {
// ...
}

/**
* Calculate the consumption coefficient.
*/
public float calculateConsumptionCoefficient(int base,float variance,int iterations) throws RangeException
{
// ...
}


결론


결론적으로 나는 코드 스타일이라는 주제로 당신에 대해 하나의 최종적인 생각을 가지고 있다.
당신이 무슨 지침을 따르든, 들여 쓰기 스타일(cf. Raymond "Indent Style")과 같은 것에맹신적이건 간에,
당신이 코드를 작성할때는 다른 누군가에 의해 이해할 수 있고, 유지보수할 수 있도록 만들어야 한다는 것을 명심하라.