본문 바로가기
study/JAVA

Getter와 Setter

by Elfen Lied 2022. 2. 18.
반응형

클래스를 선언할 때 필드는 일반적으로 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

댓글