클래스를 선언할 때 필드는 일반적으로 private 접근 제한을 한다.
- Getter의 필요성 - 외부에서 값 변경 없이 읽을 수만 있게 함.
- Setter의 필요성 - 외부에서 간접적으로 값을 변경할 수 있게 해 준다. 하지만 아무 값이나 필드에 저장 못하게 함
Getter
- private 필드의 값을 리턴하는 역할을 한다. (필요할 경우 필드의 값을 가공해서 리턴)
- getFieldName() 또는 isFieldName() 메서드를 말함. (isFieldName()은 boolean인 경우)
Setter
- 외부에서 주어진 값을 필드값으로 수정한다. (필요한 경우 외부의 값을 유효성 검사한다.)
- setFieldName(타입 변수) 메서드를 말함. (매개 변수 타입은 필드의 타입과 동일)
- 실습
들어가기에 앞서, getter와 setter를 직접 적어도 되지만,
alt + shift + s 를 눌러서 자동으로 만들 수 있다.
* 방법
1. 우선 필드 값을 먼저 적는다.
2. alt + shift + s 눌러서 아래 사진과 같은 Generate Getter and Setter... 를 클릭한다.
3. > 아이콘을 누르면 speed 처럼 아래쪽에 체크할 수 있는 요소들이 나타난다.
getter를 만들거나 setter 혹은 둘다 체크하면 둘 다 만들어진다.
오른쪽에 선택할 수 있는 버튼을 눌러서도 가능함.
4. 다 선택했다면 가장 아래쪽에 있는 Generate를 누르자.
5. 그러면 기본 형태는 만들어진다.
- Getter
1. Car 클래스를 만든다.
public class Car {
private int speed;
private boolean stop;
public int getSpeed() {
return speed;
}
public boolean isStop() {
return stop;
}
}
필드는 private로 선언.
메서드는 외부에서 사용 가능하게 public으로 만들고 타입(int, boolean)은 필드와 같게 만들어야 함.
2. CarExample 클래스를 만든다.
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
System.out.println(myCar.getSpeed());
System.out.println(myCar.isStop());
}
}
※ System.out.println 는 하나하나 치지 말고 syso를 적은 다음 ctrl + 스페이스바를 누르자.
myCar.speed가 아닌 myCar.getSpeed로 접근한 이유는 speed는 private라서 직접 접근 불가.
getSpeed는 public으로 선언했기에 사용 가능.
ctrl + f11을 눌러서 java application을 실행해보자.
0과 false 가 뜨는 이유는 초기값을 주지 않았기 때문이다.
- Setter
1. Getter에서 만든 Car 클래스에 작성한다.
public class Car {
private int speed;
private boolean stop;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
this.speed = speed;
}
public boolean isStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
}
}
setSpeed와 setStop을 추가해준다. (매개변수는 필드의 타입과 변수를 동일하게 쓴다.)
2. Getter에서 만든 CarExample 클래스에 작성한다.
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.setSpeed(60);
myCar.setStop(false);
System.out.println(myCar.getSpeed());
System.out.println(myCar.isStop());
}
}
ctrl + f11로 실행해보자.
setSpeed(60) 지정한 60과, setStop(false) false가 잘 나온다.
---
지금 만든 상태로는 private의 의미가 없다.
자유롭게 Getter로 볼 수 있고 Setter로 값을 변경할 수 있기 때문이다.
만약, 읽기 전용으로 만들려면 Getter만 만들어준다.
---
Setter가 빛을 보는 건 유효성 검사가 필요한 경우다.
외부에서 값이 들어올 때 올바른 값일 때만 필드에 저장하고, 아닐 때는 저장하지 않게 만들어야 한다.
ex) speed 필드의 값이 음수가 됐을 때 음수의 값을 넣지 않고 무조건 0으로 되게 만들자.
3. 다음과 같이 Setter를 작성하자.
public class Car {
private int speed;
private boolean stop;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if(speed < 0) {
this.speed = 0;
} else {
this.speed = speed;
}
}
public boolean isStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
}
}
양수와 0일 때는 정상적으로 값을 넣고,
speed < 0 즉, 음수 일때 0을 할당하게 한다.
4. CarExample 클래스에 있는 myCar.setSpeed() 음수 값으로 바꿔보자.
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.setSpeed(-60);
myCar.setStop(false);
System.out.println(myCar.getSpeed());
System.out.println(myCar.isStop());
}
}
setSpeed에 -60을 넣고 실행해보자.
Setter에서 만든 if(speed < 0) 이 실행돼서 0으로 나오면 된다.
5. 앞서 테스트를 했으니 최종적으로 작성해보자.
Car 클래스에 있는 setStop을 작성한다.
public class Car {
private int speed;
private boolean stop;
public int getSpeed() {
return speed;
}
public void setSpeed(int speed) {
if(speed < 0) {
this.speed = 0;
} else {
this.speed = speed;
}
}
public boolean isStop() {
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
if(stop == true) {
speed = 0;
}
}
}
6. CarExample 클래스를 작성한다.
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.setSpeed(-50);
System.out.println("현재 속도 : " + myCar.getSpeed());
myCar.setSpeed(60);
System.out.println("현재 속도 : " + myCar.getSpeed());
if(!myCar.isStop()) {
myCar.setStop(true);
}
System.out.println("현재 속도 : " + myCar.getSpeed());
}
}
마지막에 if(!myCar.isStop()) 은 앞서 테스트에서 stop 필드의 기본값은 false였다.
그래서 myCar.isStop() 앞에 ! 를 넣어줘서 true로 바꿔줘야 한다.
!는 not 이라고 생각하고 보면 쉽다.
!true 는 not true로 바꿔보면 "true가 아닐때"이니까 false다.
즉, myCar.isStop(false) 를 ! 로 반대가 돼서 true가 된다.
이제 코드를 실행해보면,
처음은 -50 음수라서 setSpeed 메서드에서 걸러져서 0으로 나오고,
두 번째는 양수를 줬으니 제대로 표시된다.
마지막은 !으로 인해서 기본값인 false가 true로 됐기 때문에
setStop메서드의 if(stop == true)가 참이 되면서 speed = 0 이 할당됐다.
'study > JAVA' 카테고리의 다른 글
상속(Inheritance) - 클래스 상속 (0) | 2022.02.24 |
---|---|
어노테이션(Annotation) (0) | 2022.02.22 |
접근 제한자( Access Modifier) (0) | 2022.02.18 |
상수(static final) (0) | 2022.02.14 |
final 필드 (0) | 2022.02.14 |
댓글