접근제어자 (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변수설정 성공 } }
- 아래와 같이 class BirthDay의 멤버변수들을 private로 설정하면
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 변수는 접근가능 } }
- drink/Ade.java
public
- 범위 : 어디에서든 접근가능
- public으로 설정된 클래스, 변수, 메소드는 package, 상속에 상관없이 어떤 클래스라도 접근이 가능하다.
- 코드 예시
-
package drink; public class Ade { protected String cola = "coke"; //멤버변수를 protected로 설정 public String info = "에이드클래스입니다"; // protected와 다르게 어느 클래스든 접근가능 }
-
'JAVA > 언어입문' 카테고리의 다른 글
자바(JAVA) - 객체간 협력 (0) | 2022.03.16 |
---|---|
자바(JAVA) - 예약어 this (0) | 2022.03.16 |
자바(JAVA) - 참조자료형(Reference Data Type) (0) | 2022.03.14 |
자바(JAVA) - 생성자(constructor) (0) | 2022.03.09 |
자바(JAVA) - 클래스(class) / 메소드(method) / 인스턴스(instance) (0) | 2022.03.09 |
댓글