1. 접근제어자?

  1. 접근제어자란?

    1. 변수(Variable)나 메서드(Method)의 사용 권한을 말함
  2. 접근제어자 종류

    1. private
    2. default
    3. protected
    4. public
    5. 접근제어자 순서 : private → default → protected → public [허용범위]
  3. private

    1. private가 붙은 변수, 메서드는 해당 클래스에서만 접근이 가능함

    2. [예제]

      public class Test {
          private String test;
          private String getTest() {
              return this.test;
          }
      }
      // test변수와 getTest메서드는 오직 Test Class에서만 접근이 가능하며
      // 다른 Class에서는 접근이 불가함
      
  4. default

    1. 접근제어자를 별도로 설정하지 않는다면 접근 제어자가 없는 변수, 메서드는 default 접근제어자가 되어 해당 package내에서만 접근이 가능함

    2. [예제]

      package test; // 패키지가 동일함
      
      public class TestHello {
      		// sayHello은 default 접근제어자로 설정됨
          String sayHello = "Hello!";  
      }
      
      package test; // 패키지가 동일함
      
      public class TestBye {
          String sayHello = "Hello!";
      
          public static void main(String[] args) {
              TestHello hello = new TestHello();
      				// TestHello 클래스의 sayHello변수를 사용할 수 있음
              System.out.println(hello.sayHello); // Hello!
          }
      }
      // TestHello과 TestBye의 Package는 test로 동일하기에
      // TestBye 클래스에서 TestHello의 sayHello변수에 접근이 가능함
      
  5. protected

    1. 접근제어자가 protected로 설정되었다면 protected가 붙은 변수와 메서드는 동일한 Package의 클래스 or 해당 클래스를 상속받은 다른 Package의 클래스에서만 접근이 가능함

    2. [예제]

      package test; // 패키지가 서로 다름
      
      public class TestHello {
      		// sayHello은 protected 접근제어자로 설정됨
          protected String sayHello = "Hello!";  
      }
      
      package test.bye; // 패키지가 서로 다름
      
      public class TestBye extends TestHello { // TestHello를 상속받음
      
          public static void main(String[] args) {
              TestHello hello = new TestHello();
      				// 상속한 TestHello 클래스의 protected 변수는 접근이 가능함
              System.out.println(hello.sayHello); // Hello!
          }
      }
      // TestHello클래스를 상속한 TestBye클래스의 package는 test.bye이므로 
      // TestHello의 package인 test와 다르지만 TestHello의 sayHello변수가
      // protected이기 때문에 hello.sayHello와 같은 접근이 가능함
      
      // 단, sayHello의 접근제어자가 protected가 아닌 default접근제어자였다면
      // hello.sayHello문장은 컴파일 오류가 발생하게 됨!
      
  6. public

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

    2. [예제]

      package test; // 패키지가 서로 다름
      
      public class TestHello {
      		// sayHello은 public 접근제어자로 설정됨
          public String sayHello = "Hello!";  
      }
      
      package test.bye; // 패키지가 서로 다름
      
      public class TestBye {
      
          public static void main(String[] args) {
              TestHello hello = new TestHello();
      				// TestHello 클래스의 public 변수는 어떤 클래스라도 접근가능함
              System.out.println(hello.sayHello); // Hello!
          }
      }
      // TestHello클래스의 public 접근제어자를 설정한 sayHello는
      // TestBye클래스에게 접근이 가능함! 왜냐, public접근제어자는 어떤 클래스라도
      // 접근 할 수 있으며, 상속받지 않아도 package가 달라도 public 접근제어자에
      // 접근이 가능함!