Programming/Java

[JAVA] 제어자

Supreme_YS 2021. 11. 8. 13:25

* 제어자(modifier)

- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여

 

* 접근제어자 : public, private, (default), protected

* 그 외 : static, final abstract, native, transient, synchronized, volatile, stricffp

- 하나의 대상에 여러 제어자를 같이 사용 가능(접근 제어자는 하나만 가능)

public class ModifierTest {
	public static final int WIDTH = 200;
    
    public static void main(String[] args) {
    	System.out.println("WIDTH="+WIDTH);
    }
}

* static - 클래스의, 공통적인

- static 은 멤버변수, 메서드에 사용할 수 있다.

- 멤버변수에 사용할 때 의미 : 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 됨, 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다, 클래스가 메모리에 로드될 때 생성된다.

- 메서드에 사용할 때 의미 : 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 됨, static 메서드 내에서는 인스턴스 멤버(IV, IM)들을 직접 사용할 수 없다. -> IV 멤버들은 객체를 만들고 나서 사용할 수 있기 때문에 static에서는 사용 불가, static은 객체 생성없이 사용가능하기 때문에!

class StaticTest {
	static int width = 200; // 클래스 변수(static 변수)
    static int height = 100; // 클래스 변수(static 변수)
    
    static { // 클래스 초기화 블럭
    		// static 변수의 복잡한 초기화 수행
    }
    
    static int max(int a, int b) { // 클래스 메서드(static 메서드)
    	return a > b ? a : b;
    }
}

 

* 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 class AbstractTest {  // 추상 클래스(추상메서드를 포함한 클래스)
	abstract void move();      // 추상 메서드(구현부가 없는 메서드)
}

* 접근 제어자 (public > protected > (default) > private 순으로 제한이 넓다)

public 접근 제한이 전혀 없다
private 같은 클래스 내에서만 접근이 가능하다
(default) 같은 패키지 내에서만 접근이 가능하다
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
package AFTERCH6;

class MyParent {
    private int prv;   // 같은 클래스
    int dft;           // 같은 패키지
    protected int prt; // 같은 패키지 + 자손(다른 패키지)
    public int pub;    // 접근제한 없음.

    public void printMembers() {
        System.out.println(prv); // ok
        System.out.println(dft); // ok
        System.out.println(prt); // ok
        System.out.println(pub); // ok
    }
}

public class MyParentTest {
    public static void main(String[] args) {
        MyParent p = new MyParent();
//        System.out.println(p.prv); // private 에러 발생, 같은 클래스 내에서만 사용이 가능하기 때문에
        System.out.println(p.dft); // ok
        System.out.println(p.prt); // ok
        System.out.println(p.pub); // ok
    }
}