객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
객체 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수 있기 때문이다.
ex) 자동차 속도는 음수 불가, 하지만 외부에서 음수로 설정하면 객체 무결성이 깨진다.
따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.
데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서
외부에서 메소드를 통해 데이터에 접근하도록 유도한다.
(메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문이다.)
이러한 역할을 하는 메소드 Setter!
ex) 자동차 속도를 setSpeed( ) 메소드로 변경할 경우 아래와 같이 검증 코드를 작성할 수 있다.
void setSpeed(double speed) { //Setter
if(speed < 0) {
this.speed = 0; // 매개값이 음수라면, 필드에 0으로 저장하고 메소드 실행 종료
return;
} else {
this.speed = speed;
}
}
외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다.
객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다.
이런 경우 메소드로 필드값을 가공 후, 외부로 전달한다.
이런 역할을 하는 메소드 Getter!
ex) 자동차 속도를 마일에서 Km 단위로 환산해서 외부로 리턴하는 getSpeed( ) 메소드
double getSpeed() {
double km = speed * 1.6; // 필드 값인 마일(speed)를 km 단위로 환산 후 외부로 리턴
return km;
}
클래스를 선언할 때 가능하다면 필드를 private 로 선언해서 외부로부터 보호하고
필드에 대한 Setter / Getter 메소드를 작성해서 필드값을 안전하게 변경 / 사용하는 것이 좋다.
Setter / Getter 메소드 선언 방식
(검증 코드 / 변환 코드는 필요에 따라 추가한다.)
private 타입 fieldName; // 필드 접근 제한자 : private
//Getter
public 리턴타입 getFieldName() {
return fieldName;
}
//Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
Getter : getFieldName( )
- 접근 제한자 : public
- 리턴 타입 : 필드의 리턴 타입
- 메소드 이름 : get + 필드 이름 (첫문자는 대문자)
- 리턴값 : 필드값
Setter : setFieldName(타입 fieldName)
- 접근 제한자 : public
- 리턴 타입 : void
- 메소드 이름 : set + 필드 이름 (첫문자는 대문자)
- 매개 변수 타입 : 필드 타입
만약 필드 타입이 boolean일 경우, Getter는 get으로 시작하지 않고 is 로 시작하는 것이 관례이다.
ex) stop 필드의 Getter / Setter
private boolean stop; // 필드 접근 제한자 : private
//Getter
public boolean isStop() {
return stop;
}
//Setter
public void setStop(boolean stop) {
this.stop = stop;
}
Getter : isStop( )
- 접근 제한자 : public
- 리턴 타입 : 필드 타입
- 메소드 이름 : is + 필드이름 (첫문자는 대문자)
- 리턴값 : 필드값
Setter : setStop(boolean stop)
- 접근 제한자 : public
- 리턴 타입 : void
- 메소드 이름 : is + 필드이름 (첫문자는 대문자)
- 매개 변수 타입 : 필드 타입
외부에서 필드값을 읽을 수만 있고, 변경하지 못하도록 하려면(읽기 전용)
Getter 메소드만 선언하거나, Setter 메소드를 private 접근 제한을 갖도록 선언한다.
* 이클립스에서 클래스에 선언된 필드에 대해 자동적으로 Getter / Setter 메소드를 생성하기
필드를 선언한 후, 메뉴에서
[Source → Generate Getter and Setters] 를 선택하면, 자동으로 생성할 수 있는 대화상자가 열린다.
ex) Car 클래스의 speed, stop 필드에 대한 Getter / Setter
Car.java : Getter / Setter 메소드 선언
public class Car {
//필드
private int speed;
private boolean stop;
//생성자
//메소드
public int getSpeed() { // Getter
return speed;
}
public void setSpeed(int 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;
}
}
CarExample.java
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car(); // 객체 생성
//잘못된 속도 변경
myCar.setSpeed(-50);
System.out.println("현재 속도 : "+ myCar.getSpeed()); // 0 출력
//올바른 속도 변경
myCar.setSpeed(60);
//멈춤
if(!myCar.isStop()) {
myCar.setStop(true);
}
System.out.println("현재 속도 : "+ myCar.getSpeed()); // 0 출력
}
}
speed 필드값을 음수로 변경하려 하면, Setter인 setSpeed 에서 매개값 검사 후 0 으로 변경하기 때문에
0 이 출력된다.
stop 필드의 Getter 인 isStop() 리턴값이 false 일 경우,
Setter 인 setStop(true) 를 호출해서 stop 필드를 true로, speed 필드를 0 으로 변경한다.
'Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어] > 4. 객체지향 프로그래밍' 카테고리의 다른 글
12. Java 자바 - 어노테이션 (1) | 2020.05.21 |
---|---|
10. Java 자바 - 접근 제한자 public, protected, default, private (0) | 2020.05.20 |
9. Java 자바 - 패키지 (package) (0) | 2020.05.19 |
8. Java 자바 - final 필드와 상수 (2) | 2020.05.18 |
7. Java 자바 - 정적 멤버와 static, 싱글톤(singleton) (0) | 2020.05.18 |