접근 제어자 public, protected, default, private
그 외: static, final, abstract, native, transient, synchronized, volatile, strictfp
static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭
final이 사용될 수 있는 곳 - 클래스, 매서드, 멤버변수, 지역변수
class Card{
final int NUMBER; //상수지만 선언과 함께 초기화 하지 않고
final String KIND; //생성자에서 단 한번만 초기화할 수 있다.
static int width = 100;
static int height = 250;
Card(String kind, int num)
{
KIND = kind; //매개변수로 넘겨받은 값으로
NUMBER = num; //KIND와 NUMBER를 초기화한다.
}
Card()
{
this("HEART", 1);
}
public String toString()
{
return KIND + " " + NUMBER;
}
}
class FinalCardTest{
public static void main(String args[])
{
Card c = new Card("HEART", 10);
c.NUMBER = 5; //에러 ! cannot assign a value
//to final variable NUMBER
System.out.println(c.KIND);
System.out.println(c.NUMBER);
System.out.println(c); //System.out.pritnln(c.toString());
}
}
메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용한다.
abstract가 사용될 수 있는 곳 - 클래스, 메서드
추상 클래스는 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도' 이므로 인스턴스를 생성할 수 없다.
abstract class AbstractTest{ //추상 클래스
abstract void move(); //추상 메서드
}
이런 클래스는 인스턴스를 생성해봐야 할 수 있는 것이 없다. 그래서 인스턴스를 생성하지 못하게 클래스 앞에 제어자 'abstract'를 붙여 놓은 것이다.
public abstract class WindowAdaptor
implements WindowListener, WindowStateListener, WindowFocusListener{
public void windowOpened(WindowEvent e) {}
public void windowClosing(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
}
위 클래스 자체로는 쓸모가 없지만, 다른 클래스가 이 클래스를 상속받아서 일부의 원하는 메서드만 오버라이딩해도 된다는 장점이 있다.
접근 제어자는 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
public > protected > (default) > private
- 메서드에 static과 abstract를 함께 사용할 수 없다.
- 클래스에 abstract와 final을 동시에 사용할 수 없다.
- abstract메서드의 접근 제어자가 private일 수 없다.
- 메서드에 private와 final을 같이 사용할 필요는 없다.