Java/제어자 (Modifier)

제어자(modifier)

PiccoBella 2023. 3. 18. 22:49

■ 제어자란?(modifier)

 클래스와 클래스 멤버의 선언 시 사용하여 부가적인 의미를 부여하는 키워드를 의미한다. 

자바에서 제어자는 접근 제어자(access modifier)와 기타 제어자로 구분할 수 있고, 기타 제어자는 경우에 따라 여러 개를 함께 사용할 수도 있지만, 접근 제어자를 두 개 이상 같이 사용할 수는 없다.  그리고 접근 제어자와 기타 제어자는 조합에 따라 함께 사용할 수 있다. 자바는 접근제어자를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다.

■ 접근 제어자(access modifier)

  • 멤버 또는 클래스에 사용되어 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 함
  • 접근제어자가 사용될 수 있는 곳 : 클래스, 멤버변수, 메서드, 생성자
  1. private : 같은 클래스 내에서만 접근 가능
  2. default : 같은 패키지 , 다른 클래스 내에서만 접근 가능
  3. protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
  4. public접근 제한이 전혀 없다.

private
private으로 설정되었다면 private 이 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능하다.

 

public class Sample {
     private String secret;
     private String getSecret() {
        return this.secret;
     }
}
secret 변수와 getSecret 메서드는 오직 Sample 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.

 

public
public 접근제어자가 붙은 변수, 메서드는 어떤 클래스에서라도 접근이 가능하다.

 

*누구나 접근 허용
public class Everywhere {
    public String var = "누구든지 허용"; // public 필드
    public String getVar() {             // public 메소드
        return this.var;
    }
}
default
접근 제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근 제어자가 되어 해당 패키지 내에서만 접근이 가능하다.
*같은 패키지만 접근 허용
package test;
 
public class SamePackage {
    String sameVar = "같은 패키지는 허용"; // default 필드

*같은 클래스도 접근 허용
package test;
 
public class SameClass {
    String var = "다른 패키지는 접근 불가"; // default 필드
    public static void main(String[] args) {
        SamePackage sp = new SamePackage();
        System.out.println(sp.sameVar);     // 같은 패키지는 허용
    }
}

 

protected 
protected가 붙은 변수, 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 다른 패키지의 클래스에서만 접근이 가능하다.
* 같은 패키지 허용
package test;
public class SameClass {
    protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; // protected 필드
}

*다른 패키지에 속하는 자식 클래스도 접근 허용
package test.other;
import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.
 
public class ChildClass extends SameClass {
    public static void main(String[] args) {
        SameClass = new SameClass();
        System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용
    }
}

 

■ 기타 제어자 

final 제어자

- final 은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있으며 거의 모든 대상에 사용 될 수 있다
- 변수에 사용하면 값을 변경할 수 없는 상수가 되며,
- 메서드에 사용하면 오버라이딩응 할 수 없게 되고
- 클래스에 사용되면 자신을 확장하는 자손 클래스를 정의하지 못한다

자바에서 final 제어자를 사용할 수 있는 대상은 

  • 클래스
  • 메소드
  • 필드
  • 지역 변수
final class Car {                    // 이 클래스는 상속을 통해 서브 클래스를 생성할 수 없음.
    final int VAR;                   // 이 필드는 상수화되어 값을 변경할 수 없음.
    final void brake() {             // 이 메소드는 오버라이딩을 통해 재정의할 수 없음.
        final double MAX_NUM = 10.2; // 이 지역 변수는 상수화되어 값을 변경할 수 없음.
    }
}

 

 

static 제어자

- static 은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.
- 인스턴스 변수는 하나의 클래스로 부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static 멤버 변수)는 인스턴스에 관계 없이 같은 값을 갖는다.
- 그 이유는 하나의 변수를 모든 인스턴스가 공유하기 때문
- static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 신스턴스가 아닌 클래스에 관계된것이기 떄문에 인스턴스를 생성하지 않고도 사용할 수 있다

자바에서 static이 사용될 수 있는 곳 :

  • 멤버변수
  • 메서드
  • 초기화 블럭
class Car {
    static int var;       // 클래스 필드(static 변수)
    static {              // static 초기화 블록
    // 보통 클래스 필드의 초기화를 진행함.
    {
    static void brake() { // 클래스 메소드(static 메소드)
         ...
    }
}

 

 

 

abstract 제어자

- abstract는 '미완성'의 의미를 가지고 있다.
- 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상메서드를 선언하는데 사용한다

자바에서 abstract 제어자를 사용할 수 있는 대상은 

  • 클래스,
  • 메서드
abstract class Car {       // 추상 클래스
    abstract void brake(); // 추상 메소드
}