JAVA : 접근제어자(Access Modifier)

keymu·2024년 9월 24일
0

Access Modifier:

  • field, method에 붙음
  • private, protected, public
  1. private: 선언된 클래스 내에서만 사용 가능
  2. (default): 아무 것도 안 붙을 때. 자기 자신 / 같은 패키지에서 사용 가능
  3. protected: 자기 자신 / 같은 패키지 / 상속받은 클래스에서 사용 가능
  4. public: 어디서든 사용 가능

사용범위: private < (default) < protected < public

  • 포함범위가 커지는 쪽으로는 변경 가능 ex) protected>public

(주의) public 클래스의 이름은 .java 파일 이름과 반드시 같아야 함

// 다른 패키지의 (default) 클래스는 import 할수 없다!
//import com.lec.java.j14_04_access.TestDefault2;
import com.lec.java.j14_04_access.TestPublic2;

//import com.lec.java.j14_04_access.TestPublic;

public class Access03Main {

    public static void main(String[] args) {
       System.out.println("public, default 클래스");

       TestPublic t1 = new TestPublic();
       TestDefault t2 = new TestDefault();

       TestPublic2 t3 = new TestPublic2();
//     TestDefault2 t3;

       // 다른 패키지에 있는 동일 이름의 클래스를 사용하려면?
       //  패키지명까지 명시하여 구분.
       com.lec.java.j14_04_access.TestPublic t4 = new com.lec.java.j14_04_access.TestPublic();
       
    } // end main()

} // end class

그 외의 Modifier:
final, static, abstract, transient, synchronized, volatile

  1. Final

public class Final01Main {

    // final 멤버변수(필드)
    // (주의) final 멤버 변수는 반드시 선언과 동시에 초기화 (혹은 생성자에서 초기화) 해야 한다
    final int NUM1 = 1;

//  final int NUM2;    // 초기화 되지 않은 final 필드는 에러!
    final int NUM3;

    public Final01Main() {
       NUM3 = 10;
    }

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

       final int NUM1;
       NUM1 = 88;

    } // end main()

} // end class Final01Main
  1. Static
  • 클래스에 선언된 멤버 변수/멤버 메소드는 static 여부에 따라 아래와 같이 불려진다
  • 인스턴스 변수: static 이 안붙은 변수
    • 인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에) 사용할 수 있는 변수
  • 인스턴스 메소드:static 이 안 붙은 메소드
    • 인스턴스를 생성한 다음에(new 생성자(); 호출된 다음에 사용할 수 있는 메소드
  • 클래스 변수(static 변수): 클래스의 멤버 변수들 중에서, 인스턴스를 생성하지 않아도 사용할 수 있는 변수
  • 클래스 메소드(static 메소드): 인스턴스를 생성하지 않아도 사용할 수 있는 메소드


public class Static01Main {

    // 클래스 메소드 (class method, static method)
    public static void test1(){
       System.out.println("test1(): static");
    }

    // 인스턴스 메소드 (instance method, non-static method)
    public void test2(){
       System.out.println("test2(): non-static");
    }
    
    public static void main(String[] args) {
       System.out.println("인스턴스 변수/메소드 vs 클래스 변수/메소드");

       test1();

       // static 에서는 non-static 사용못한다! ★★
//     test2();

       // 인스턴스 생성한 후에 사용 가능.
       Static01Main tc = new Static01Main();
       tc.test2();


    } // end main()

} // end class

클래스 변수 / 메소드 특징 (static)
1. 메모리의 '메소드 영역'에 클래스가 로드 될때(프로그램 시작될때) '한번만' 생긴다
2. 인스턴스가 생성되지 않아도 사용할 수 있다.
- 클래스이름.static변수, 클래스이름.static메소드()
- 따라서, 인스턴스를 나타내는 this 와 super 는 static 메소드에서 사용불가
3. 모든 인스턴스는 하나의 static 변수/메소드를 '공유'한다.

package com.lec.java.j14_07_static;

public class Static02Main {

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

       Test.show2();

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

//     Test.num = 10;  // 에러

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

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

       t2.sNum = 340;  // 가능하나, 바람직한 static 사용방법 아님!
       t.show();

       Test.sNum = 100;
       t.sNum = 500;
       t2.sNum = 700;
       System.out.println(Test.sNum);
       System.out.println(t.sNum);
       System.out.println(t2.sNum);

       
    } // end main()

} // end class
package com.lec.java.j14_07_static;

public class Test {
    int num;   // 인스턴스 변수 (non-staic 변수)
    static int sNum; // 클래스 변수 (static 변수)

    // 인스턴스 메소드
    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(this.num);

        System.out.println("클래스(static) sNum = " + sNum);
    }

}
profile
Junior Backend Developer

0개의 댓글