본문 바로가기
JAVA/언어입문

자바(JAVA) - 접근제어자(private/default/protected/public)

by Sunyoung95 2022. 3. 15.
접근제어자 (Access Modifier)

  • 변수나 메소드의 접근권한을 설정
  • private → default → protected → public 순으로 보다 많은 접근을 허용
  • 사용이유 : 코딩실수 방지, 이상 데이터 등의 위험요소를 제거할 수 있다.

 

private
  • 범위 : 해당 클래스 내에서만 접근 가능
  • 클래스의 외부에서 클래스 내부의 멤버변수나 메서드에 접근(access)하지 못하게하는 경우 사용
  • 멤버변수나 메서드를 외부에서 사용하지 못하도록하여 오류를 줄일 수 있다.
  • 데이터의 무결성을 지킬 수 있다. (ex : 이상 데이터의 입력방지, ...)
  • 멤버변수 사용이 필요한 경우 getter/setter 메서드를 통해 사용가능
  • 코드 예시
    • 아래와 같이 class BirthDay의 멤버변수들을 private로 설정하면
      // 생일을 설정하는 class BirthDay 생성
      public class BirthDay {
          // private로 설정한 변수나 메소드는 각 클래스 내(현재는 BirthDay 클래스)에서만 사용가능
          private int day;
          private int month;
          private int year;
      }
    • 다른 클래스나 .java 파일에서 접근할때 직접 멤버변수를 설정하려한다면 오류발생
      // 생일을 설정하는 class BirthDay 생성
      public class BirthDayTest {
      	public static void main (String[] args) {
              BirthDay myBirthDay = new BirthDay();
              // BirthDay 클래스 내부의 멤버변수를 private로 설정 -> 다른 클래스에서 직접 접근이 불가능
              myBirthDay.year = 1995; //Error
              myBirthDay.month = 2;  //Error
              // 이렇게 직접 변수를 설정한다면 2월에 없는 31일이 그대로 저장될 수도 있다.
              myBirthDay.day = 31;  //Error
          }
      }
    • BirthDay 클래스에서 getter/setter를 public으로 설정하면 타 클래스에서 멤버변수에 접근할 수 있다.
      // 생일을 설정하는 class BirthDay 생성
      public class BirthDay {
          private int day;
          private int month;
          private int year;
          
          public void setYear(int year) {
          	this.year = year;
          }
          
          public void setMonth(int month) {
          	this.month = month;
          }
          // 멤버변수를 설정할 때 조건식을 집어넣어 이상데이터를 거를 수 있다 = 데이터 무결성
          public void setDay(int day) {
          	if (month==2) {
              	if (day<1 || day>29) {
                  System.out.println("날짜오류입니다")
                  } else {this.day = day;}
              } else {this.day = day;}
          }
          
          public int getYear() {
          	return year;
          }
          
          public int getMonth() {
          	return month;
          }
          
          public int getDay() {
          	return day;
          }
      }
      // 생일을 설정하는 class BirthDay 생성
      public class BirthDayTest {
      	public static void main (String[] args) {
              BirthDay myBirthDay = new BirthDay();
              // BirthDay 클래스 내부의 멤버변수를 private로 설정 -> getter/setter사용
              myBirthDay.setYear(1995);
              myBirthDay.setMonth(2);
              myBirthDay.setDay(31);  // 날짜오류입니다
              myBirthDay.setDay(10);  // day변수설정 성공
          }
      }

 

default
  • 범위 : 같은 package 내
  • 접근제어자를 별도로 설정하지 않은 상태 = 접근제어자 생략
  • 코드 예시
    • package drink;
      
      public class Ade {
      	String cola = "coke"; //접근제어자를 쓰지 않았으므로 default접근제어자로 설정됨
      }
    • package drink;  // 위의 클래스와 같은 package
      
      public class DrinkTest {
      	public static void main(String[] args) {
          	Ade bestDrink = new Ade();
              System.out.println(bestDrink.cola); //"coke" : 같은 package의 변수를 불러올 수 있다
          }
      }

 

protected
  • 범위 : 동일 package 내 혹은 해당 클래스를 상속받은 다른 패키지의 클래스 내
  • 코드 예시
    • drink/Ade.java
      package drink;
      
      public class Ade {
      	protected String cola = "coke";  //멤버변수를 protected로 설정
      }
    • drink/beer/nonAlchol.java
      package drink.beer; // Ade 클래스와 패키지가 다름
      
      import drink.Ade; //사용할 클래스 불러옴
      
      public class nonAlchol extend Ade { // Ade를 상속
      	public static void main(String[] args) {
          	Ade best = new Ade();
              System.out.println(best.cola); // 상속한 클래스의 protected 변수는 접근가능
          }
      }

 

public
  • 범위 : 어디에서든 접근가능
  • public으로 설정된 클래스, 변수, 메소드는 package, 상속에 상관없이 어떤 클래스라도 접근이 가능하다.
  • 코드 예시
    • package drink;
      
      public class Ade {
      	protected String cola = "coke";  //멤버변수를 protected로 설정
          public String info = "에이드클래스입니다"; // protected와 다르게 어느 클래스든 접근가능
      }

 

댓글