접근 제어 지시자 (accesss modifier)
- 클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드
(부모자식클래스, 탑클래스, 슈퍼클래스 라고도 함) 굉장히 밀접한 관계가 있는 클래스 -상속되는 클래스 - private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)
- 아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근 불가)
-패키지의 역할 : 소스들의 묶음 (A패키지에는 이런 소스들만 묶어놨다, B패키지에는 이런 소스들을 묶어놨다)
객체를 가지고 올때 어느 패키지에 속해있느냐 (나랑 같은 패키지에 있는 경우는 상관없음) , 다른 경우 임포트 해서 가지고 옴
따라서 같은 패키지에 있을 떄는 아무것도 쓰지 않으면 사용 가능하지만 다른 패키지에 있을 때는 접근 불가 - protected : 같은 패키지나 상속관계의 클래스(상위클래스에서 하위클래스로)에서 접근 가능하고
그 외 외부에서는 접근 할 수 없음 - public : 클래스의 외부 어디서나 접근 할 수 있음(공용으로 어디서나 접근 가능)
get()/ set() 메서드
(우클릭 > source > Generate Getters and Setters... > Select All)
- private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
- get() 메서드만 제공 되는 경우 read-only 필드
- 이클립스에서 자동으로 생성됨
BirthDay.java
public class BirthDay {
private int day; //만약 private 없이 열어서 int만 사용한다면,
//멤버변수의 오용과 오류를 객체가 잘못 사용되는 것을 노출하게 되고 객체의 역할에 대해 문제가 생길 수 있음.
private int month;
//그래서 private로 막아주고 메서드에서 제어를 해주는 것이 좋음
private int year; //get은 값을 가져가니까 상관없지만
//set에서 이런것들을 제어해주게 되면 쓸데없는 데이터의 오용을 막을 수 있다.
//객체의 맴버변수에 접근제한을 가함으로서 객체를 사용할 때 오류를 막을 수 있고,
//나중에 디버깅 할 때 편함
private boolean isValid; //boolean 의 기본값은 false이다.
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
if (month < 1 || month > 12) {
isValid = false;
}else {
isValid = true;
this.month = month;
}
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public void showDate() {
if(isValid) {
System.out.println(year + "년 " + month + "월 " + day + "일 입니다.");
} else {
System.out.println("유효하지 않은 날짜입니다.");
}
}
public boolean getIsValid() {
return isValid;
} //특히 isValid는 값이 유효한지만 체크할 때 많이 쓰기때문에 밖으로 내보낼 일 이 없어서
//밖으로 내보내고 싶을때 이렇게 제공하면 됨
//대신 set은 제공하지 않음 - 이 날짜가 유효한지만 나타내는 것이기 때문에 Set이 필요하지 않음
}
BirthDayTest.java
public class BirthDayTest {
public static void main(String[] args) {
BirthDay date = new BirthDay();
date.setYear(2019);
date.setMonth(13);
date.setDay(30);
date.showDate(); //유효하지 않은 날짜입니다. 라는 결과가 나옴
}
}
정보 은닉
- private으로 제어한 멤버 변수도 public 메서드가 제공되면 접근 가능하지만
변수가 public으로 공개되었을 때보다 private 일때 각 변수에 대한 제한을 public 메서드에서 제어 할 수 있다.
-- BirthDay.java 25째줄 참고
public void setMonth(int month) {
if ( month < 1 || month > 12) {
isValid = false;
}
else {
this.month = month;
}
}
- 객체 지향 프로그램에서 정보 은닉은 필요한 외부에서 접근 가능한 최소한의 정보를 오픈함으로써 객체의 오류를 방지하 클라이언트 객체가 더 효율적으로 객체를 활용할 수 있도록 해준다.
'Java > [패스트캠퍼스] Java & SpringBoot로 시작하는 웹 프로그래밍' 카테고리의 다른 글
Ch 02. 객체 지향 입문 - 12. 객체 자신을 가리키는 this (0) | 2022.12.30 |
---|---|
Ch 02. 객체 지향 입문 - 11. 캡슐화 (encapsulation) (0) | 2022.12.30 |
Ch 02. 객체 지향 입문 - 09. 참조 자료형 변수 (0) | 2022.12.30 |
Ch 02. 객체 지향 입문 - 08. 복습해봅시다 (객체 구현하기) (0) | 2022.12.30 |
Ch 02. 객체 지향 입문 - 07. 여러가지 생성자를 정의하는 생성자 오버로딩 (overloading) (0) | 2022.12.30 |
댓글