GET, SET
객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막는다.
객체 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수 있기 때문이다.
ex) 자동차 속도는 음수 불가, 하지만 외부에서 음수로 설정하면 객체 무결성이 깨진다.
따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.
데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서
외부에서 메소드를 통해 데이터에 접근하도록 유도한다.
(메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문이다.)
이러한 역할을 하는 메소드 Setter!
외부에서 객체의 데이터를 읽을 때도 메소드를 사용하는 것이 좋다.
객체 외부에서 객체 필드값을 사용하기 부적절한 경우가 있다.
이런 경우 메소드로 필드값을 가공 후, 외부로 전달한다.
이런 역할을 하는 메소드 Getter!
Setter / Getter 메소드 선언 방식
클래스 내에 SET, GET 메소드를 선언한다.
SET 은 변수값을 할당하는 목적의 함수이기 때문에 인자를 받아야 하고,
GET 은 변수값을 반환하는 목적이기 때문에 return 이 필요하다.
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 접근 제한을 갖도록 선언한다.
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 으로 변경한다.
인텔리제이에서 Getter/Setter 메소드를 생성하는 단축키
Alt + Insert
'Java' 카테고리의 다른 글
[자바] hasNext() 와 next() 메서드의 차이는??? (1) | 2022.09.26 |
---|---|
[자바] 정적 멤버와 static,싱글톤(singleton) (0) | 2022.09.26 |
[자바] 생성자(constructor) (0) | 2022.09.25 |
[자바] 인스턴스(Instance)란? (0) | 2022.09.25 |
[자바] 함수와 메서드 (0) | 2022.09.21 |