본문 바로가기

Java SE Tutorials/Access Modifiers

Java Access Modifiers

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; } }