Java

제어자 Modifier

화요밍 2022. 5. 20. 16:48
728x90
반응형
제어자 Modifier란?
제어자는 클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여합니다.
여러 제어자를 조합하여 사용하는 것이 가능하나, 접근 제어자의 경우 하나만 사용할 수 있습니다.

 

  • static - 클래스의, 공통적인
대상 의미
멤버변수 - 모든 인스턴스에서 공통적으로 사용되는 클래스 변수가 된다.
- 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리(메서드 영역)에 로드될 때 생성된다.
메서드 - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
초기화 블럭 - 클래스 변수를 초기화 하는 블럭이다.
- 인스턴스를 생성하지 않아도 초기화 블럭이 수행된다.
class StaticTest {
    //클래스 변수(static 변수)
    static int x = 200;
    static int y = 120;
    
    //클래스 초기화 블럭
    static {
    	x = 300;
    }
    
    //클래스 메서드(static 메서드)
    static int max(int a, int b) {
    	return a > b ? a : b;
    }

}

 

  • final - 마지막의, 변경될 수 없는
대상 의미
클래스 - 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
- 다른 클래스의 조상이 될 수 없다.
메서드 - 변경될 수 없는 메서드가 된다.
- 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 - 값을 변경할 수 없는 상수가 된다.
- 선언과 초기화를 동시에 하거나, 선언만 하고 생성자에서 초기화시킬 수 있다.
지역변수 - 값을 변경할 수 없는 상수가 된다.
//부모가 될 수 없는 클래스
final class FinalTest {
    //값을 변경할 수 없는 멤버변수(상수)
    final int MAX_SIZE = 10;
    
    //오버라이딩할 수 없는 메서드(변경 불가)
    final void getMaxSize() {
    	//값을 변경할 수 없는 지역변수(상수)
    	final int LV = MAX_SIZE;
    }
}

 

  • abstract - 추상의, 미완성의
대상 의미
클래스 - 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
- 추상 클래스는 추상 메서드가 존재하기 때문에 인스턴스를 생성할 수 없다.
메서드 - 선언부만 작성하고 구현되어 있지 않은 추상 메서드가 된다.
//추상 클래스(추상 메서드를 포함한 클래스)
abstract class AbstractTest {
    //추상 메서드(아직 구현되지 않은 메서드)
    abstract void move();
}

접근 제어자 Access Modifier

접근 제어자는 멤버나 클래스에 사용되며, 해당 멤버나 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 합니다.

외부로부터 데이터를 보호하고, 외부에서는 불필요하고 내부적으로만 사용되는 부분을 감추는 캡슐화를 가능하게 합니다.

public, protected, default, private이 있으며, 접근 제어자가 지정되어 있지 않으면 기본적으로 default입니다.

public > protected > default > private 순으로 접근 범위가 넓습니다.

  • private: 같은 클래스 내에서만 접근 가능
  • default: 같은 패키니 내에서만 접근 가능
  • protected: 같은 패키지 또는 다른 패키지의 자식 클래스에서 접근 가능, 패키지에 관계없이 상속관계에 있는 자식 클래스에 접근 가능
  • public: 접근 제한이 전혀 없음
제어자 같은 클래스 같은 패키지 자손 클래스 전체
public O O O O
protected O O O X
default O O X X
private O X X X
대상 사용가능한 접근 제어자
클래스 public, default
메서드 public, default, protected, private
멤버변수
지역변수 X

 


대상 사용가능한 제어자
클래스 public, default, final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final

 


싱글톤 패턴 Singleton Pattern

private과 static 제어자를 사용해서 외부에서 생성자에 직접 접근할 수 없어 인스턴스를 생성할 수 없도록 구현할 수 있습니다.

생성자가 private인 클래스는 다른 클래스의 부모가 될 수 없습니다.

자식 클래스의 인스턴스를 생성할 때 부모 클래스의 생성자를 호출해야 하는데 private 접근 제어자로 인해 자식 클래스에서 호출이 불가하기 때문입니다.

따라서 클래스 앞에 final을 추가해서 상속할 수 없는 클래스라는 것을 알리는 것이 좋습니다.

final class Singleton {
    private static Singleton s = new Singleton();
    
    private Singleton() {
    	//..
    }
    
    public static Singleton getInstance() {
    	if(s == null) {
        	s = new Singleton();
        }
        
        return s;
    }
}

class SingletonTest {
    public static void main(String args[]) {
    	Singleton s = Singleton.getInstance();
    }
}

 


참고

  • 참고 도서: Java의 정석 - 남궁성 지음
728x90
반응형

'Java' 카테고리의 다른 글

추상화 Abstraction  (0) 2022.05.24
다형성 Polymorphism  (0) 2022.05.23
super와 this  (0) 2022.05.20
상속 Inheritance  (0) 2022.05.20
오버로딩(Overloading)과 오버라이딩(Overriding)  (0) 2022.05.19