본문 바로가기

프로그래밍/자바

[자바/기본] Modifier 제어자

728x90
반응형
SMALL

Modifier 란?

  • 클래스나 변구, 메소드의 선언부 앞에 붙여주어 부가적인 제어를 할 수 있도록 도와줌
  • Access Modifier (접근 제어자) : 멤버 변수, 멤버메소드에 대한 접근 권한을 제한한다.
    • private : '자기 자신' 이 선언된 클래스 에서만 사용 가능
    • protected : 자기 자신' + '같은 패키지' + '상속받은 클래스'에서 사용 가능 (다른 패키지의 클래스라도 상속 받으면 사용 가능)  
    • public :   어디서든지 사용 가능
    • (default)  : '자기 자신' + '같은 패키지' 에 있는 클래스들에서 사용 가능

접근 제어자의 사용 범위 :  private < (default) < protected < public

[클래스의 접근 제어자는 딱 두가지 => public, default]

 

  • 예제
public class Access01Main {

    public static void main(String[] args) {
       System.out.println("접근권한 수식어(Access Modifier)");

       Test01 t1 = new Test01();	//같은 패키지에 있는 클래스

//      t1.privateNum = 10;	//자기자신이 선언된 클래스가 아니므로 사용 X
        t1.defaultNum = 20; // 같은 패키지에 있으므로 사용 가능
        t1.protectedNum = 30; // 같은 패키지에 있고 더 나아가서 상속 받으면 사용 할 수 있으므로 사용 가능
        t1.publicNum = 40;   // 어디서나 사용 가능

        Test02 t2 = new Test02();	//다른 패키지에 있는 클래스

//     t2.privateNum = 10;
//     t2.defaultNum = 20;
//     t2.protectedNum = 40;  // 같은 패키지도 아니고 상속 받지도 않았기 때문에 사용 불가
       t2.publicNum = 50;


    } // end main()

} // end class Access01Main

 - 선언 했을 때 오류가 나는 것들은 주석처리 하였음.

 


  • 그 외
    • final : 멤버 변수에 주로 붙히며 반드시 선언과 동시에 초기화해줘야 한다.
    • final 은 변경 할 수 없는 상수를 뜻하며, 개발자가 final 로 선언 한 변수는 변경되지 않을 변수라는 것을 알아차려야함.
    • 예제
public class Final01Main {

	final int NUM1 = 1;
	//final int NUM2;
	final int NUM3;   // 생성자에서 초기화 가능

	public Final01Main(){
		//NUM1 = 10;
		NUM3 = 10;
	}
	


	public static void main(String[] args) {
		System.out.println("final: 변경할 수 없는 상수");
        
		int num1 = 1;
		num1 = 10;

		final int num2;
		num2 = 1;
		//num2 = 10;		// 이미 1로 초기화 된 FINAL 변수를 변경하려고 해서 에러 발생, 주석처리

	} // end main()

} // end class Final01Main

 


  • static
    • 클래스의 멤버변수 중 static 변수를 자기고 있다면 그 변수는 클래스의 인스턴스를 사용하지 않아도 사용 할 수 있는 변수
    • 클래스의 멤버 메소드 중 static 변수를 가지고 있다면 인스턴스를 생성하지 않아도 사용 할 수 있는 메소드
    • [static 메소드 안에서 static 이 아닌 메소드를 바로 호출 할 수 없다!]
    • [static은 non-static을 사용하지 못한다.]
    • 특징
      • 메모리의 메소드 영역에 (JVM) 클래스가 로드 될때 한번만 생성된다.
      • 인스턴스가 생성되지 않아도 사용 할 수 있다.
        • 클래스이름.static변수명, 클래스이름.static메소드()
      • 모든 인스턴스는 하나의 static변수/메소드를 공유한다. (이를 이용한 singleton 패턴 설계)
    • 예시
public class Static02Main {

    public static void main(String[] args) {
       System.out.println("인스턴스 변수/메소드");

       Test.show2();  // static 변수도 기본값으로 초기화 됨
       				 // show2()를 static 으로 선언해주니 인스턴스 생성 없이 사용해도 사용 가능

       Test.sNum = 123;
       Test.show2();
       System.out.println();

       // Test.num = 10;

       Test t = new Test();
       t.num = 100;
       t.show();

       Test t2 = new Test();
       t2.show();

       Test.sNum = 987;
       System.out.println("t:");
       t.show();
       System.out.println("t2:");
       t2.show();

       t2.sNum = 340; // 가능하나, 바람직한 static 사용법이 아님! (warning 뜬다)
       t.show();
       
    } // end main()

} // end class Static02Main



public class Test {

    int num;  // 인스턴스 변수
    static int sNum;  // 클래스 변수

    // 인스턴스 메소드
    public void show(){
        System.out.println("인스턴스 num = " + num);
        System.out.println("클래스(static) sNum = " + sNum);
    }

    // 클래스 메소드
    public static void show2(){
        //System.out.println("인스턴스 num = " + num);
        System.out.println("클래스(static) sNum = " + sNum);
    }

}

 - 위의 예시 코드를 돌려보면  sNum이라는 static 변수가 다른 인스턴스를 통해 변경되었음 에도 서로 다른 인스턴스에서 같은 값을 가지고 있는 것을 확인 할 수 있다.

  • static을 사용한 singleton 패턴 예제
public class Test {

    private int num;
    
    // singleton 디자인패턴
    // 생성자는 private 으로

    private Test() { this.num = 100; }

    private static Test instance = null;   // 생성된 instance 를 reference

    public static Test getInstance(){
        if(instance == null){  // 기존에 생성된 인스턴스가 없었다면
            instance = new Test();  // 생성!
        }
        return instance;
    }

    // 메소드 (getter / setter)
    public int getNum() {
        return num;
    }
    public void setNum(int num) {
        this.num = num;
    }

}

 

 

그 밖에 abstract, transient, syncronized, volatile 등의 MODIFIER 가 존재 한다. 

728x90
반응형
LIST