제어자란?
제어자(modifier)는 변수나 메서드의 선언부에 사용되며 부가적인 의미를 부여한다.
크게 두 가지로 분류가 되는데 접근 제어자와 그 외의 제어자로 나눌 수 있다.
접근 제어자 : public, protected, default, private
그 외 : static, final, abstract, native, transient, synchronized, volatile, strictfp
제어자는 클래스나 멤버변수와 메서드에 주로 사용되고 여러 제어자를 조합해서 사용하는 것이 가능하다.
단, 접근 제어자는 네 가지 중 하나만 선택해 사용 가능하다.
static - 클래스의, 공통적인
static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.
인스턴스 변수는 각 인스턴스마다 다른 값을 유지하지만, 클래스변수(static변수)는
하나의 변수를 모든 인스턴스가 공유한다.
static이 붙은 멤버변수와, 메서드, 초기화 블록은 인스턴스가 아닌 클래스에 관계된 것이기 때문에
인스턴스를 생성하지 않고도 사용할 수 있다.
인스턴스 메서드와 static메서드의 차이는 메서드에서 인스턴스 멤버를 사용하는가의 여부에 있다.
static메서드는 인스턴스 멤버(메서드, 변수)를 사용하지 못한다.
static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블록
제어자 | 대상 | 의미 |
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이 붙으면 값을 변경할 수 없는 상수가 된다. | |
지역변수 |
final class FinalTest { // 조상이 될 수 없는 클래스
final int MAX_SIZE = 10; // 값을 변경할 수 없는 멤버변수(상수)
final void getMaxSize() { // 오버라이딩할 수 없는 메서드(변경불가)
final int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수(상수)
return MAX_SIZE;
}
}
abstract - 추상의, 미완성의
abstract는 '미완성'의 의미를 가지고 있다. 메서드의 선언부만 작성하고 실제 수행 내용은
구현하지 않은 추상 메서드를 선언하는 데 사용된다.
abstract가 사용될 수 있는 곳 - 클래스, 메서드
제어자 | 대상 | 의미 |
abstract | 클래스 | 클래스 내에 추상 메서드가 선언되어 있음을 의미한다. |
메서드 | 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다. |
추상 클래스는 완성되지 않은 메서드가 존재하는 '미완성 설계도'이므로 인스턴스를 생성할 수 없다.
abstract class AbstractTest { // 추상 클래스(추상 메서드를 포함한 클래스)
abstract void move(); // 추상 메서드(구현부가 없는 메서드)
}
드물게 추상 메서드가 없는 완성된 클래스도 abstract를 붙여 추상 클래스로 만드는 경우가 있다.
예를 들어 아래와 같이 내용이 없는 경우 인스턴스를 생성해도 할 수 있는 것이 아무것도 없고
그래서 인스턴스를 생성하지 못하게 클래스 앞에 abstract를 붙여 놓는다.
public abstract class WindowAdapter
implements WindowListener, WindowStateListener, WindowFocusListener{
public void windowOpened (WIndowEvent e) {}
public void windowClosing (WIndowEvent e) {}
public void windowClosed (WIndowEvent e) {}
public void windowIconified (WIndowEvent e) {}
···
}
클래스 자체로는 쓸모가 없지만, 다른 클래스가 이 클래스를 상속받아 일부의 원하는 메서드만
오버라이딩해도 된다는 장점이 있다.
접근 제어자에 대한 내용이 궁금하다면 아래 링크를 클릭하시라👍
2020/12/14 - [JAVA BASE/05. OOP(객체지향 프로그래밍)] - 09-2. [JAVA] 제어자(modifier)
abstract.. 흠..🤔
곧 다시 공부할 내용이지만
오버라이딩 전용? 부모 클래스를 만든다는 느낌인것 같다
댓글