Java 프로그래밍, 접근 제한자 ( Access Modifiers )
다수개의 클래스가 한개의 프로그램을 구성할 때 한 클래스의 멤버(변수, 메소드)들을 다른 클래스에서 접근하는 것을 제한할 수가 있다. 클래스 외부로부터 변수나 메소드에 불필요한 접근을 차단하여 프로그램이 안정되게 실행되도록 하기 위해 접근 제한자(Access Modifiers)를 사용한다.
Access Level 에 따른 접근 제한
https://en.wikipedia.org/wiki/Java_syntax#/media/File:JavaAccessSpecifier.jpg
Access Level 설정시 고려할 사항
- 가능한 제한적인 레벨을 선택한다. 의미 없이 public 을 사용해서는 안된다
- 특별한 이유가 없다면 일단 private 으로 설정한다
멤버변수에 private 을 설정하여 외부에서 직접 접근(Direct Accessd)하지 못하게 한 경우(오류 발생)
public class Tutorials { public static void main(String[] args) { // 객체 생성(참조변수에 생성된 객체의 참조가 저장됨) User user = new User(10,"홍길동", "hong@naver.com"); String email = user.email; //오류! private멤버에 직접 접근할 수 없다 System.out.printf("E-mail : %s %n", email); // 인스턴스 메소드 호출 user.printUser(); } } class User { private int num; private String name; private String email; User(int num, String name, String email){ this.num = num; this.name = name; this.email = email; } public void printUser() { System.out.println("====== 회원정보 ======"); System.out.printf(" 번호 : %d %n", num); System.out.printf(" 이름 : %s %n", name); System.out.printf(" 메일 : %s %n", email); } }
멤버변수에 직접 접근하지 못하는 경우 setter, getter 메소드를 이용하여 간접적으로 접근하는 예
public class Tutorials { public static void main(String[] args) { // 객체 생성(참조변수에 생성된 객체의 참조가 저장됨) User user = new User(10,"홍길동", "hong@naver.com"); user.setEmail("gildong@gmail.com"); // 인스턴스 메소드 호출 user.printUser(); } } class User { private int num; private String name; private String email; User(int num, String name, String email){ this.num = num; this.name = name; this.email = email; } public void printUser() { System.out.println("====== 회원정보 ======"); System.out.printf(" 번호 : %d %n", num); System.out.printf(" 이름 : %s %n", name); System.out.printf(" 메일 : %s %n", email); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
private 멤버를 초기화할 때 setter 메소드를 사용하는 예 (기본 생성자가 정의되지 않아서 오류가 발생하는 경우)
public class Tutorials { public static void main(String[] args) { // 기본 생성자(Default Constructor)를 이용하여 객체를 생성하려고 함 User user = new User(); // 오류! 기본 생성자가 정의되어 있지 않음 user.setNum(10); user.setName("홍길동"); user.setEmail("gildong@gmail.com"); // 인스턴스 메소드 호출 user.printUser(); } } class User { private int num; private String name; private String email; User(int num, String name, String email){ this.num = num; this.name = name; this.email = email; } public void printUser() { System.out.println("====== 회원정보 ======"); System.out.printf(" 번호 : %d %n", num); System.out.printf(" 이름 : %s %n", name); System.out.printf(" 메일 : %s %n", email); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }
기본 생성자가 정의되지 않아서 오류가 발생한 경우 아래처럼 오류를 해소하면 된다
public class Tutorials { public static void main(String[] args) { // 기본 생성자(Default Constructor)를 이용하여 객체를 생성하려고 함 User user = new User(); // 오류 해소됨! 기본 생성자를 정의했기 때문 // setter 메소드를 이용하여 인스턴스 변수에 간접 접근하여 초기화함 user.setNum(10); user.setName("홍길동"); user.setEmail("gildong@gmail.com"); // 인스턴스 메소드 호출 user.printUser(); } } class User { private int num; private String name; private String email; // 기본 생성자를 이용해서 객체를 생성할 수 있도록 함 User(){} User(int num, String name, String email){ this.num = num; this.name = name; this.email = email; } public void printUser() { System.out.println("====== 회원정보 ======"); System.out.printf(" 번호 : %d %n", num); System.out.printf(" 이름 : %s %n", name); System.out.printf(" 메일 : %s %n", email); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } }