접근제어자😒🤔
package g_oop2;
public class AccessModifier {
//다른 패키지에서도 접근이 가능함
//생략해야 default
//오직 이 클래스 안에서만
public void publicMethod(){
System.out.println(publicVar);
}
protected void protectedMethod(){
System.out.println(publicVar);
}
void defaultMethod(){
System.out.println(publicVar);
}
protected void privateMethod(){
System.out.println(publicVar);
}
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();
접근제어자를 사용하는 이유
- 데이터를 보호하기 위해
- 사용하는데 불필요한 멤버를 숨기기 위해
Time t = new Time();
//객체를 출력하면 주소가 나와야 하는데 tostring으로 값이 출력함
t.hour = 14;
t.miniute = 7;
t.second = -30; // 변수에 접근제어자를 붙여서 아무나 접근할수 없게 만듬
t.setHour(14);
t.setMiniute(7);
t.setSecond(-30);
System.out.println(t);
t.clock();
// t.stop(); //부수적인 메서드로 숨겨 놓는게 나음
}
}
출력1
package g_oop2;
public class AccessTest {
public static void main(String[] args) {
//4가지와 접근 범위 암기하기
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
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();
AccessTest at = new AccessTest(); // 상속 받은 클래스를 통해서 받아야함
System.out.println(at.protectedVar);
at.protectedMethod();
// System.out.println(at.defaultVar);
// System.out.println(at.privateVar); //접근 제어자에 영향을 받음
}
}
package g_oop2;
public class Time {
private int hour;
private int miniute;
private int second;
public int getHour() {//변수의 값을 얻기 위해 (현재시간의 값)
return hour ;
}
public void setHour(int hour) {
//변수의 값을 저장하기 위함/ 값을 받기 위해 파라미터도 있음
(AccessModifier에서 생성한 값이 들어옴)
if(hour<0){
this.hour = 0;
}else if(23 < hour){
this.hour = hour % 24;
}else{
this.hour= hour;
}
}
public int getMiniute() {
return miniute;
}
public void setMiniute(int miniute) {
if(miniute<0){
this.miniute = 0;
}else if(59<miniute){
this.miniute = miniute % 60;
setHour(this.hour + (miniute / 60));
}else{
this.miniute= miniute;
}
}
public int getSecond() {
return second;
}
public void setSecond(int second) {
if(second<0){
this.second = 0;
}else if(59<second){
// this.second = 59;
this.second = second % 60;
setMiniute(this.miniute + (second / 60));
}else{
this.second = second;
}
}
void clock(){// 1초에 한번씩 시간을 증가시키며 출력
while(true){
System.out.println(toString());
stop();//시간을 멈추기위해
setSecond(second + 1);//1을 더해주고 파라미터로 넘기기
}
}
private void stop(){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//프로그램 잠시 멈추게 가능: 1초간 멈추게됨, 컴파일에러는 예외처리를 안해줘서 그럼
}
@Override // source - generate to string
public String toString() {
//오버라이딩 된 메서드(상속받은 메서드의 내용을 변경하기 위해 만든것)/
//toString: 클래스의 객체가 문자열로 출력될때 자동으로 넣어줌
return hour+":"+ miniute+":"+ second ;
}
}