제어자(modifier)
: 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여
제어자의 종류
1. 접근 제어자 : public, protected, (default), private
2. 그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
제어자는 클래스나 멤버변수와 메서드에 주로 사용
하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능
단, 접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용 가능
▶즉, 하나의 대상에 대해서 public과 private를 함께 사용할 수 없음
제어자들 간의 순서는 관계 없지만, 주로 접근 제어자를 제일 왼쪽에 놓는 경향이 있음
접근 제어자 외에도 여러 제어자가 있으나, static, final, abstract를 제외하고는 자주 사용되지 않음
static
: '클래스의' 또는 '공통적인'의 의미를 가짐static이 사용될 수 있는 곳 = 멤버변수, 메서드, 초기화 블럭
제어자 | 대상 | 의미 |
---|---|---|
static | 멤버변수 | 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨 / 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능 / 클래스가 메모리에 로드될 때 생성 |
메서드 | 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨 / static메서드 내에서는 인스턴스멤버들을 직접 사용불가 |
class StaticTest {
static int width = 200; //클래스 변수(static변수)
static int height = 120; //클래스 변수(static변수)
static { //클래스 초기화 블럭
//static변수의 복잡한 초기화 수행
}
static int max(int a, int b) { //클래스 메서드(static메서드)
return a > b ? a : b;
}
}
final
: '마지막의', '변경될 수 없는' 의미를 가지고 있으며, 거의 모든 대상에 사용가능final이 사용될 수 있는 곳 = 클래스, 메서드, 멤버변수, 지역변수
제어자 | 대상 | 의미 |
---|---|---|
final | 클래스 | 변경될 수 없는 클래스, 확장될 수 없는 클래스가 됨. 그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없음 |
메서드 | 변경될 수 없는 메서드,final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없음 | |
멤버변수/지역변수 | 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 됨 |
final클래스의 대표적인 예는 String과 Math임
final class FinalTest { //조상이 될 수 없는 클래스
final int MAX_SIZE = 10; //값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() { //오버라이딩할 수 없는 메서드(변경불가)
final int LV = MAX_SIZE; //값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
abstract
: '미완성의'의 의미 abstract가 사용될 수 있는 곳 = 클래스, 메서드
제어자 | 대상 | 의미 |
---|---|---|
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미 |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알림 |
abstract class AbstractTest { //추상 클래스(추상 메서드를 포함한 클래스)
sbstract void move(); //추상 메서드(구현부가 없는 메서드)
}
추상 클래스는 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도'이므로, 인스턴스 생성불가
AbstractTest a = new AbstractTest(); //에러. 추상클래스의 인스턴스 생성불가