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()
같은 클래스 내에서는 모든 접근제어자가 접근 가능
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 접근제어자가 붙은 변수와 메서드는 접근할 수 없다.
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접근제어자에 접근가능하다.
현재시간이 실시간으로 출력되도록 하는 객체
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메서드를 통해서 메서드의 로직을 통해 잘못된 값을 거르는 접근 방식이 옳바른 접근 방법이다.