객체지향 프로그래밍에서는 객체의 필드(멤버변수)를 객체 외부에서 직접적으로 접근하는 것을 막는다. 이유는 외부에서 마음대로 변경 시 객체의 무결성이 깨질 수 있기 때문
ex) 음수가 될 수없는 자동차의 속력이 외부에서 음수로 변경될 경우
myCar.speed = -100;
이런 문제점을 방지하기 위해 객체 지향 프로그래밍에서는 메소드를 통한 필드변경방법을 선호한다.
필드는 외부에서 접근할 수 없도록 막고, 메소드는 공개하여 외부에서 메소드를 통해 필드에 접근을 유도.
메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있기 때문이다
이 역할을 하는 메소드가
setter
public void setSpeed(double speed) {
this.speed = speed;
}
↓
public void setSpeed(double speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
Source - Generate Getters and Setters 메뉴에서 자동 생성한 setter 메소드 변경
매개값이 음수일 경우 speed 필드에 0으로 저장하고 메소드 실행 종료.
접근제한자: public
리턴타입: void
메소드이름: set+필드이름
매개변수타입: 필드타입
외부의 값을 저장할 때 뿐 아닌 외부에서 객체의 데이터를 읽을때에도 필드 값을 직접 읽기보다 메소드를 사용하는 것이 좋다. 이런경우엔 메소드로 필드값을 가공 후 외부로 전달하면 된다
이때 사용하는 메소드가
Getter
public double getSpeed() {
return speed;
}
↓
public double getSpeed() {
double km = speed * 1.6;
return km;
}
필드값인 마일을 km 단위로 환산 후 외부로 리턴.
클래스를 선언할 때 가능하면 필드를 private로 선언해서 외부로부터 보호하고 getter/setter 메소드를 작성해 필드값을 안전하게 변경/사용하는것이 좋다
접근제한자: public
리턴타입: 필드타입
메소드이름: get+필드이름
리턴값: 필드값
다만 만약 필드 타입이 boolean일 경우에는 getter 는 get 대신 is로 시작한다
private boolean stop;
public boolean is stop() {
return stop;
}
예제
package a220708;
public class Car {
private double speed;
private boolean stop;
public double getSpeed() {
double km = speed * 1.6;
return km;
}
public void setSpeed(double speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
public boolean isStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
}
}
package a220708;
public class CarEx {
public static void main(String[] args) {
Car myCar = new Car();
//잘못된 속도변경
myCar.setSpeed(-50);
System.out.println("현재 속도: " + myCar.getSpeed());
//올바른 속도변경
myCar.setSpeed(80);
System.out.println("현재 속도: " + myCar.getSpeed());
//멈춤
if (!myCar.isStop()) {
myCar.setStop(true);
}
System.out.println("현재 속도: " + myCar.getSpeed());
}
}
잘못된 속도변경시 setter메서드에서 매개값을 검사하기때문에 개터의 리턴값이 0으로 나온다.
STOP시 stop필드의 getter(isStop())리턴값이 false일 경우, 자동차를 멈추기위해 Setter(setStop(true))를 호출해서 stop 필드를 true로, speed를 0으로 변경한다
참고 :
- 혼자 공부하는 자바(신용권), 한빛미디어
'개발 > JAVA' 카테고리의 다른 글
[Java] 타입 변환과 다형성 (0) | 2022.07.11 |
---|---|
[Java] 상속 (0) | 2022.07.11 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2022.07.07 |
[Java] 메소드 (0) | 2022.07.06 |
[Java] 생성자(constructor) (0) | 2022.07.05 |