Java AccessModifier(접근 제어자)

JMS·2022년 1월 29일
0

Java

목록 보기
1/4
post-thumbnail

1. 접근제어자를 사용하는 이유?

  • 불필요한 접근으로부터 데이터를 보호하기 위해
  • 사용하는데 불필요한 멤버를 숨기기 위해

2. 종류

  1. public : 접근제한이 없음
  2. protected : 같은 패키지 or 상속받은 클래스에서 접근가능
  3. private : 클래스 내에서만 접근 가능
  4. default : 같은 패키지에서만 접근 가능하며 기본값으로 변수나 메서드 앞에 아무것도 붙이지 않은멤버

3. 예제로 알아보기

1.같은 클래스내에서 실행(g_oop2/AccessModifier)

package g_oop2;

public class AccessModifier {

	public String publicVar = "public : 접근제한이 없음";
	protected String protectedVar = "protected : 같은 패키지 + 상속받은 클래스에서 접근 가능";
	String defaultVar = "default : 같은 패키지에서만 접근 가능";
	private String privateVar = "private : 클래스 내에서만 접근 가능";
	
	public void publicMethod() {
		System.out.println(publicVar);
	}
	
	protected void protectedMethod() {
		System.out.println(protectedVar);
	}
	
	void defaultMethod() {
		System.out.println(defaultVar);
	}
	
	private void privateMethod() {
		System.out.println(privateVar);
	}
	
	public static void main(String[] args) {
		AccessModifier am = new AccessModifier();
		
		System.out.println(am.publicVar);
		am.publicMethod();
		
		System.out.println(am.protectedVar);
		am.protectedMethod();
		
		System.out.println(am.defaultVar);
		am.defaultMethod();
		
		System.out.println(am.privateVar);
		am.privateMethod()

같은 클래스 내에서는 모든 접근제어자가 접근 가능

2. 다른 클래스내에서 실행(g_oop2/AccessTest)

package g_oop2;

public class AccessTest {

	public static void main(String[] args) {
		AccessModifier am = new AccessModifier();
		
		System.out.println(am.publicVar);
		am.publicMethod();
		
		System.out.println(am.protectedVar);
		am.protectedMethod();
		
		System.out.println(am.defaultVar);
		am.defaultMethod();
		
		System.out.println(am.privateVar);
		am.privateMethod();
	}

}

public, protected, default는 같은 패키지 내에서는 클래스가 달라도 접근가능,

다른 클래스에서는 private 접근제어자가 붙은 변수와 메서드는 접근할 수 없다.

3. 다른 패키지/상속받은 클래스(g_oop2.test/AccessTest extends AccessModifier)

package g_oop2.test;

import g_oop2.AccessModifier;

public class AccessTest extends AccessModifier{

	public static void main(String[] args) {
		AccessModifier am = new AccessModifier();
		
		System.out.println(am.publicVar);
		am.publicMethod();
		
		
		//상속을 받았지만 내것이 아닌 부모객체통해 접근했으므로 에러가 나타난다
		System.out.println(am.protectedVar);
		am.protectedMethod();
	
		System.out.println(am.defaultVar);
		am.defaultMethod();
		
		System.out.println(am.privateVar);
		am.privateMethod();
	}

}

default와 private는 g_oop2가 아닌 g_oop2.test 패키지이므로 다른 패키지에서 접근>>컴파일에러

protect는 AccessModifier로 부터 상속을 받았지만 위 코드에서는 상속받은 내것이 아닌 AccessModifier객체를 통해 접근했으므로 컴파일에러가 발생했다.

AccessTest at = new AccessTest();
		//AccessModifier로부터 상속을 받아 내것이 된 상태에서 생성한 객체를 통해 접근해야함
		System.out.println(at.protectedVar);
		at.protectedMethod();

상속을 받고 새로 자식객체를 생성하여 접근하면 protect접근제어자에 접근가능하다.

4. 접근제어자를 이용해 데이터변경하기

현재시간이 실시간으로 출력되도록 하는 객체

package g_oop2;

public class Time {
	//변수 데이터를 보호하기 위해 다른클래스에서 접근하지 못하도록 private로 선언
	private int hour;
	private int minute;
	private int second;
	
	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		if(hour < 0 || hour > 23) {
			return;
		}
		this.hour = hour;
	}

	public int getMinute() {
		return minute;
	}

	public void setMinute(int minute) {
		if(minute < 0) {
			this.minute = 0;
		}else if(minute > 59) {
			this.minute = 59;
		}else{			
			this.minute = minute;
		}
	}

	public int getSecond() {
		return second;
	}

	public void setSecond(int second) {
		if(second < 0) {
			this.second = 0;
		}else if(second > 59) {
			this.second = 59;
		}else {			
			this.second = second;
		}
	}
	
	void clock() {
		while(true) {
			System.out.println(toString());
			stop();
			setSecond(second + 1);
		}
	}
	
	//stop()메서드는 clock()메서드에서만 사용하고 다른곳에서 쓰게 할 필요가 없으므로 private로 선언
	private void stop() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} // 1000ms동안 잠깐 멈추는 메서드
	}

	@Override
  //변수에 저장된 데이터를 문자열로 출력하는 메서드
	public String toString() {
		return hour + ":" + minute + ":" + second;
	}
	
}
package g_oop2;

public class AccessModifier {
	
	
	public static void main(String[] args) {
		Time t = new Time();
		
//객체의 변수에 직접 접근 : 옳지않은방법
		t.hour = 14;
		t.minute = 9;
		t.second = 99;
//객체의 메서드를 통해 변수에 접근 : 옳은방법
		t.setHour(16);
		t.setMinute(1);
		t.setSecond(1);
		t.clock();
	}
} 

객체의 변수에 직접적으로 접근할 경우 second변수에는 0~60사이 정수를 넣고싶지만 잘못된 값을 입력했을경우 막을 방법이 없어 데이터를 보호하는데에 좋지않은 방법이다.

이럴땐 객체의 set메서드를 통해서 메서드의 로직을 통해 잘못된 값을 거르는 접근 방식이 옳바른 접근 방법이다.

profile
비 전공 ZEROBASE 개발 꿈나무

0개의 댓글

관련 채용 정보