자바는 객체 지향 프로그래밍 언어다. 객체 지향 프로그래밍에서 객체의 데이터는 무결성을 위해 객체 외부에서 직접적으로 접근하는 것을 막는다. 예를 들어 나이를 입력하는 필드가 있다고 하자. 이때 나이는 음수가 될 수 없으므로 음수 값이 들어가면 안 되지만 외부에서 음수로 변경을 하게 되면 객체의 무결성이 깨지게 된다.
Setter
이러한 상황을 해결하기 위해 객체 지향 프로그래밍에서는 메소드를 통해서 데이터를 변경하는 방법을 선호한다. 데이터를 외부에 공개하지 않고 메소드를 공개해서 이 메소드로 데이터에 접근할 수 있도록 유도한다. 메소드를 활용하는 이유는 메소드는 유효 데이터를 검증할 수 있기 때문이다. 예를 들어 나이를 입력하는 메소드에 음수가 입력된다면 다시 입력하게 반환할 수 있다. 이러한 역할을 하는 것이 Setter 메소드이다. 다음은 나이를 검증하고 설정하는 setAge
메소드이다.
void setAge(int age) {
if(age < 0) {//매개 값으로 받은 age가 음수라면
this.age = 0;//age필드에 0으로 저장한다.
return;//바로 종료
}
else {//아닌 경우 매개값을 age 필드에 넘긴다.
this.age = age;
}
}
Getter
내부의 필드 값을 외부에서 읽는 경우에도 메소드를 사용하는 것이 좋다. 객체 외부에서 현재 객체의 필드값을 사용하기에 적절하지 않을 수가 있다. 이 경우에 메소드로 필드값을 가공 한 후 외부로 가공된 값을 전달한다. 이러한 메소드가 Getter 메소드이다. 예를 들어 자동차의 속도를 마일에서 KM 단위로 환산해서 외부로 리턴해 주어야 하는 경우를 들 수 있다.
double getSpeed() {
double km = speed*1.6;
return km;
}
이렇게 되면 외부에서 직접 필드 값에 접근하지 않고 데이터를 넘길 수 있다. 따라서 클래스를 선언할 때 필드에 대한 Setter, Getter 메소드를 작성 가능하면 클래스 내의 필드를 private 접근 제한을 걸어 보호해주는 것이 좋다.
boolean에서의 Getter
예외적으로 필드 타입이 boolean일 경우 Getter메소드가 get으로 시작하지 않고 is로 시작하는 것이 일반적이다.
private boolean run;
//Getter
public boolean isRun() {//getRun이 아닌 isRun이라고 이름을 지었다.
return run;
}
다음 예시를 통해서 전체적으로 이해해보자.
Car.java
public class Car {
//private 접근 제한을 해 Car클래스의 필드에 직접적으로 접근을 못하게 막았다.
private int speed;
private boolean stop = false;//초깃값은 false이다.
Car() {}//생성자
public int getSpeed() {//speed값을 알려준다.
return speed;
}
public void setSpeed(int speed) {//외부에서 받은 speed 값을 검증하고 대입한다.
if(speed < 0) {
this.speed = 0;//매개값이 음수이면 속도를 0으로 한다.
return;
}
else {
this.speed = speed;//올바른 매개값인 경우 speed 필드에 이 값을 대입한다.
}
}
public boolean isStop() {//현재 자동차 멈춤 여부를 boolean으로 알려준다.
return stop;
}
public void setStop(boolean stop) {//자동차의 stop여부를 결정한다.
this.stop = stop;
if(stop){
this.speed = 0;
System.out.println("자동차 멈춤!!");
}
}
}
Main.java
public class Main {
public static void main(String[] args) {
Car myCar = new Car();//객체 생성
myCar.setSpeed(-100);//올바르지 않은 값 전달
System.out.println("현재 속도 : " + myCar.getSpeed());
myCar.setSpeed(100);//올바른 값 전달
System.out.println("현재 속도 : " + myCar.getSpeed());
if(!myCar.isStop()){//stop 필드가 false이라면
myCar.setStop(true);//stop필드를 true로 바꾸어 준다.
}
}
}
실행 결과
현재 속도 : 0
현재 속도 : 100
자동차 멈춤!!
'Java' 카테고리의 다른 글
[JAVA]리플렉션(reflection)과 어노테이션 정보의 사용 (0) | 2021.05.07 |
---|---|
[JAVA]어노테이션(Annotation) (0) | 2021.05.07 |
[JAVA]접근 제한자(Access Modifier) (0) | 2021.05.06 |
[JAVA] 패키지(package), import문 (0) | 2021.05.06 |
[JAVA]final 키워드와 상수(static final)의 이해 (0) | 2021.05.06 |