컴퓨터공학 💻 도서관📚

Part2. 2-10 접근 제어 지시자 본문

✅🌲강의 복습 노트/패캠 JavaSpring 강의,코드 복습

Part2. 2-10 접근 제어 지시자

들판속초록풀 2024. 12. 25. 16:56

접근 제어 지시자 (accesss modifier) : 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를

지정하는 키워드

 

private : 같은 클래스 내부에서만 접근 가능 (외부 클래스, 상속 관계의 클래스에서도 접근 불가)

 

아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 (상속 관계라도 패키지가 다르면 접근 불가)

 

protected : 같은 패키지상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음

 

public : 클래스의 외부 어디서나 접근 할 수 있음

 


논리적으로 패키지의 역할은 소소의 묶음이다
사용하려는 객체가 다른 패키지에 속해 있는 경우는 import 키워드를 사용한다

 

 

get() / set() 메서드 : private 으로 선언된 멤버 변수(속성, 필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공함

(get() 메서드만 제공 되는 경우 read-only 필드)

(이클립스 기능 증 Sources -> Generate Getters and Setters 을 사용하면 get, set 메서드를 알아서 만들어준다)

 

 

멤버변수는 선언이 되면 기본값을 갖는데 int 형은 0 을, boolean(불리언) 형은 false 를 기본값으로 가진다

 


(1) 멤버변수를 public으로 설정하는 것과  (2) 멤버변수를 private로 설정하고 get, set 메서드로 접근하는 것의 차이는
무엇인가?

멤버변수를 public으로 설정하면  date.month = 100;  이와 같이 멤버변수에 바로 접근할 수 있어서
멤버변수에 잘못된 값이 입력되도 제어를 할 수가 없다. 

하지만 멤버변수를 private로 설정하면 set 메서드 쪽에서  private boolean isValid; 변수를 활용해
잘못된 값이 입력되어도 제어를 해서 정보를 보호할 수 있다

 

package part2_ch08;

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

    private boolean isValid;
    private boolean checkLeap;

    public int getDay() {
        return day;
    }
    public void setDay(int day) {
        if (month == 2){
            checkLeapYear(year);
            if (checkLeap == true) {
                if (day < 30) this.day = day;
                else { isValid = false; }
            }
            if (checkLeap == false ){
                if (day < 29) this.day = day;
                else { isValid = false; }
            }
        }
        else if (month == 4 || month == 6 || month == 9 || month == 11){
            if (day < 31)  this.day = day;
            else { isValid = false; }
        }
        else {
            if (day < 32)  this.day = day;
            else { isValid = false; }
        }
    }

    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {
        if (month < 1 || month > 12) {    // set 메서드에서 이와 같이 제어가 가능하다
            isValid = false;
        } else {
            this.month = month;
        }
    }

    public int getYear() {
        return year;
    }
    public void setYear(int year) {
        if (year > 1581){
            this.year = year;
            isValid = true;
        }
        else { isValid = false; }
    }
    public void checkLeapYear(int year){
        if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
            checkLeap = true;
        }
    }

    public void showDate() {

        if (isValid) {
            System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
        }
        else {
            System.out.println("유효하지 않은 날짜 입니다");
        }
    }
}

 

 

Year 에서 조건이 맞으면 true 로 고정하고

그 다음 Month와 Day 에서는 조건이 맞으면 true 선언 안 하고, 값만 대입하고
조건과 다르면 false 를 선언한다

이렇게 해야 Year에서는 false로 선언했는데  Month 와 Day 에서 true로 바뀌는 오류가 없다
Year 가 false 여도  Month 나 Day 에서 true 선언하는 코드가 없기 때문에 true로 안 바뀐다

Year : true , false 둘 다 있음
Month :  false 만 있음
Day :  false 만 있음

 

 

package ch10;

public class BirthDayTest {

	public static void main(String[] args) {
		BirthDay date = new BirthDay();
		
		date.setYear(2019);
		date.setMonth(77);
		date.setDay(100);
		
		date.showDate();	
	}
}
Comments