package com.mycompany;
public class ClassName {
...
}
위 코드에서 클래스의 풀네임은 com.mycompany.ClassName 이다.
디렉토리상에서 해당 파일의 위치는 com/mycompany/ClassName.java 가 된다.
컴파일러는 패키지 선언을 보고 디렉토리를 자동으로 생성한다.
패키지 선언은 항상 소스 파일 최상단에 위치해야 한다.
같은 패키지에 있는 클래스는 import 없이 사용이 가능하다.
package com.mycompany;
import com.apple.Cpu;
public class Computer {
Cpu cpu = new Cpu();
/* 또는 풀네임 사용 (import 생략 가능) */
com.apple.Cpu cpu = new com.apple.Cpu();
}
서로 다른 패키지에서 이름이 같은 클래스를 여러개 불러와야 할 경우, 클래스의 풀네임을 사용한다.
객체의 필드와 메서드가 외부에 노출되지 않도록 하려면 접근 제한자를 알맞게 변경한다.
접근제한자 class ClassName { ... }
public class ClassName { ... }
class ClassName { ... }
protected class ClassName { ... }
private class ClassName { ... }
public : 제한 없음(default) : 같은 패키지에서만 사용 가능 (클래스 자체도)protected : 같은 패키지 또는 자식 객체일때만 필드, 생성자, 메서드 사용 가능private : 객체 내부에서만 필드, 생성자, 메서드 사용 가능생성자가 갖는 접근 제한자에 따라 호출할 수 있는 범위가 달라진다.
생성자는 public , private , (default) 접근 제한을 가질 수 있다.
public class ClassName {
/* 생성자 초기화 */
ClassName(...) { ... }
public ClassName(...) { ... }
private ClassName(...) { ... }
}
public : 모든 패키지에서 객체 생성 가능
(default) : 같은 패키지에서만 객체 생성 가능
private : 클래스 내부에서만 객체 생성 가능
필드와 메서드도 public , private , (default) 접근 제한을 할수 있다.
public : 모든 패키지에서 필드 읽기/변경 가능, 메서드 호출 가능
(default) : 같은 패키지에서만 필드 읽기/변경 가능, 메서드 호출 가능
private : 클래스 내부에서만 필드 읽기/변경 가능, 메서드 호출 가능
필드를 외부에서 마음대로 변경할 경우, 값이 이상해질 수 있다.
따라서 메서드로 값의 유효성을 검사한 후 필드를 변경하는 것이 좋다.
public class ClassName {
private double price;
public void setPrice(int price) {
if(price < 0) {
this.price = 0;
return;
} else {
this.price = price;
}
}
}
Setter 메서드인 setPrice 는 가격 값의 유효성을 검사한 후, 필드에 값을 저장한다.
필드 값을 읽기만 할 때에도 메서드가 필요한 경우가 있다.
예를 들어 price 는 사용되는 곳에 따라 화폐의 단위가 달라질 수 있다.
private double price;
public double getPrice(double currency) {
double wonPrice = price * currency;
return wonPrice;
}