Java 정보은닉

김정훈·2024년 4월 16일

Java

목록 보기
12/48

정보 은닉

멤버 변수에 직접 값을 대입을 지양해야한다.
why? 통제가 불가능하기 때문에!

  • (멤버 변수의 접근 제어자(private))
  • 멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set) → 제어가능

1. 접근제어자

public : 모든 패키지에서 접근이 가능
protected : 동일 패키지에서 접근 가능(default) + 외부 패키지에 있는 클래스에서 상속을 받으면 클래스 내부에서 접근 가능(private)
default : 동일 패키지에서 접근 가능(접근 제어자 명시 X)
private : 클래스내부의 메서드 내에서만 접근 가능


  • public
package exam03;
public class Ex01 {
    public static void main(String[] args) {
        exam02.A a = new exam02.A(); //
        // 다른 패키지 : 클래스이름앞에 패키지를 써야한다
        // 같은 패키지 : 생략가능
        // A a = new A(); //오류
    }
}
package exam03;
import exam02.A;
public class Ex01 {
    public static void main(String[] args) {
        A a = new A(); 
        //다른패키지이지만, import 사용하면 생략가능
    }
}

  • default
package exam02;

public class A { //exam02.A
    public int numA;
    int numAA; // default 접근 제어자, 동일패키지만 접근가능.
}
package exam03;
import exam02.*;
public class Ex01 {
    public static void main(String[] args) {
        //exam02.A a = new exam02.A(); //
        // 다른 패키지 : 클래스이름앞에 패키지를 써야한다
        // 같은 패키지 : 생략가능
        A a = new A(); //다른패키지이지만, import 사용하면 생략가능
        B b = new B();
        a.numA=5;
        //a.numAA=5; 오류
        }
}

참고)

  • 다른 패키지에 있는 클래스를 사용하려면 import
    import 패키지명.클래스명;
  • 하위 패키지도 다른패키지로 취급.

2. get(), set() 메서드

  • 데이터 클래스 : 데이터를 담고 조회할수있는 클래스
  • 멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set) → 제어가능

  • set( )
public class Schedule {
    private int year;
    private int month;
    private int day;

    public void setYear(int _year){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        year = _year;
    }

    public void setMonth(int _month){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        month = _month;
    }

    public void setDay(int _day){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        day = _day;
    }

    void showDate(){
        System.out.printf("year : %d, month : %d, day : %d\n",year,month,day);

    }
}
package exam02;

public class Ex01 {
    public static void main(String[] args) {
        Schedule s1 = new Schedule();
        s1.setYear(2024);
        s1.setMonth(2);
        s1.setDay(31);
        s1.showDate();
    }
}

  • get( )
package exam02;

public class Schedule {
    private int year;
    private int month;
    private int day;

    public void setYear(int _year){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        year = _year;
    }
    public void setMonth(int _month){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        month = _month;
    }
    public void setDay(int _day){ //멤버 변수의 값을 확인할 수 있는 접근 가능한 메서드 추가(set)
        if(month == 2 && _day>28){
            _day=28;
        }
        day = _day;
    }

    public int getYear(){
        return year;
    }
    public int getMonth(){
        return month;
    }
    public int getDay(){
        return day;
    }

    void showDate(){
        System.out.printf("year : %d, month : %d, day : %d\n",year,month,day);

    }
}
package exam02;

public class Ex01 {
    public static void main(String[] args) {
        Schedule s1 = new Schedule();

        s1.setYear(2024);
        s1.setMonth(2);
        s1.setDay(31);

        int year = s1.getYear();
        int month = s1.getMonth();
        int day = s1.getDay();
        System.out.printf("%d %d %d\n",year,month,day);

        s1.showDate();
    }
}

참고) Record 클래스

package exam01;
public record Schedule2(int year, int month, int day) {
}
package exam01;
public class Ex04 {
    public static void main(String[] args) {
        Schedule2 s1 = new Schedule2(2024,4,17);
        int year = s1.year();
        int month = s1.month();
        int day = s1.day();
        System.out.printf("%d, %d, %d",year, month, day);
        System.out.println(s1);
    }
}
profile
안녕하세요!

0개의 댓글