- 클래스를 선언할 때 가능하다면 필드를 private로 선언해서 외부로부터 보호
- 필드에 대한 Setter와 Getter 메소드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋음
* 외부에서 필드값을 읽을 수만 있고 변경하지 못하도록 하려면 (읽기전용)
- Getter 메소드만 선언
- Setter 메소드를 private 접근 제한을 갖도록 선언
Getter
- 객체 외부에서 객체의 필드값을 사용하기에 부적절한 경우도 있음
- 외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋음
- 메소드로 필드값을 (가공한 후) 외부로 전달
private 타입 fieldName; //필드 접근 제한자 : private
//Getter
public 리턴타입 getFieldName() {
return fieldName;
}
- 접근 제한자 : public
- 리턴 타입 : 필드타입
- 메소드 이름 : get + 필드이름 (첫문자 대문자)
- 리턴값 : 필드값
private boolean fieldName;
//Getter
public boolean isFieldName() {
return fieldName;
}
- 필드 타입이 boolean일 경우 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례
- 접근 제한자 : public
- 리턴 타입 : 필드타입
- 메소드 이름 : is + 필드이름 (첫문자 대문자)
- 리턴값 : 필드값
getter EX)
double getSpeed() {
double km = speed * 1.6;
return km;
}
- 필드값인 마일을 km 단위로 환산 후 외부로 리턴함
Setter
- 일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막음
- 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성 (결점이 없는 성질)이 깨질 수 있음
EX) 자동차의 속도 → 음수가 될 수 없는데 외부에서 음수로 변경하면 객체의 무결성이 깨짐
myCar.speed = -100; - 이러한 문제점을 해결하기 위해 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호
- 데이터는 외부에서 접근할 수 없도록 막고 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도
➡ 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문
private 타입 fieldName; //접근 제한자 : private
//Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
- 접근 제한자 : public
- 리턴 타입 : void
- 메소드 이름 : set + 필드이름 (첫문자 대문자)
- 매개 변수 타입 : 필드타입
setter EX)
void setSpeed(double speed) {
if(speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
- 속도를 setSpeed() 메소드로 변경할 경우 검증 코드를 작성할 수 있음
- 매개 값이 음수일 경우 speed 필드에 0으로 저장하고 메소드를 실행 종료 함