[Java] 자바 Getter/Setter 메소드(Method) 알아보기[초간단]

2020-11-24


오늘은 자바라는 언어의 가장 큰 특징 객체지향 중 Getter/Setter에 대하여 알아보도록 하겠다. 우선 해당 메서드를 사용하는 이유는 필드 값에 부적절한 값이 대입되는 것을 막기 위해서이다. (물론 각 객체들의 캡슐이 깨지지 않게 하기 위함도 있다.) 글로만 봐서는 이해가 어려울 수 있으니 바로 코드를 통한 예제를 보면서 이해해 보도록 하자.


예를 들어 한 명의 게임 캐릭터가 있다. 해당 캐릭터의 힘 / 민첩 / 지능을 스탯을 배분해야 하며, 스탯은 0부터 시작하기 때문에 - 값은 들어갈 수 없다고 가정해보자.

 

이러한 경우 실수로 - 값을 대입할 경우, 차후 캐릭터에 문제가 생겨 버그가 발생할 수 있다. 때문에 스텟(필드)은 private로 직접적인 접근을 할 수 없도록 막고, getter/setter메서드를 통해서만 접근할 수 있도록 제한할 수 있다. 아래 코드를 보자.

package gettersetter;

public class stat {
	private int power;
	private int dex;
	private int intel;
	
	
	public int getPower() {
		return power;
	}
	public void setPower(int power) {
		if(power < 0) {
			this.power = 0;
		}else {
			this.power = power;
		}
	}
	//0 미만의 값이 들어갈 경우 버그가 생기지 않도록
	//해당 값을 0으로 초기화 시킴
	
	public int getDex() {
		return dex;
	}
	public void setDex(int dex) {
		if(dex < 0) {
			this.dex = 0;
		}else {
			this.dex = dex;
		}
	}
	//0 미만의 값이 들어갈 경우 버그가 생기지 않도록
	//해당 값을 0으로 초기화 시킴
	
	public int getIntel() {
		return intel;
	}
	public void setIntel(int intel) {
		if(intel < 0) {
			this.intel = 0;
		}else {
			this.intel = intel;
		}
	}
	//0 미만의 값이 들어갈 경우 버그가 생기지 않도록
	//해당 값을 0으로 초기화 시킴
	
}

 

위의 코드는 스탯 클래스이다. power(힘)/dex(민첩)/intel(지능) 은 private가 선언되어 다른 클래스에서는 접근을 할 수 없다. 때문에 각 필드별 getter/setter메소드를 선언해주어, 스탯을 배분할 수 있도록 하였다. 직접 코드로 작성하는 방법도 있겠지만 이클립스를 사용한다면, 메뉴창 도구를 사용해 손쉽게 생성할 수 있다.

(상단 메뉴에서 Source(선택) ▶Generate Getters and Setters(선택) ▶ 생성원하는 각 필드 선택 후 생성) 

 

그러면 이제 main 클래스로가서, 스탯을 배분하는 과정을 살펴보자.

package gettersetter;

public class main {

	public static void main(String[] args) {
		
		stat character = new stat();
		//캐릭터 객체 생성
		
		character.setPower(999);
		character.setDex(999);
		character.setIntel(999);
		//setter 메소드를 통해 스탯별 능력치 배분
		
		System.out.println("나의 힘능력치는 : " + character.getPower());
		System.out.println("나의 민첩능력치는 : " + character.getDex());
		System.out.println("나의 지능능력치는 : " + character.getIntel());

사용방법은 간단하다. 기존에 클래스를 사용하듯이 객체를 생성해주고, 필드 값에 직접 데이터를 입력하는 것이 아닌, setter메서드를 사용하여, 값을 초기화시켜주는 방식이다.

 

또한 데이터 호출시에는 마찬가지로 필드 값을 직접 호출하는 것이 아닌 getter 메서드를 통해 해당 필드 값을 가져오는 방식을 사용한다.


그러면 처음에 말했던 것처럼 - 값을 입력해주면, 어떻게 되는지 살펴보자.

package gettersetter;

public class main {

	public static void main(String[] args) {
		
		stat character = new stat();
		//캐릭터 객체 생성
				
		character.setPower(-1);
		character.setDex(-1);
		character.setIntel(-1);
		
		System.out.println("나의 힘능력치는 : " + character.getPower());
		System.out.println("나의 민첩능력치는 : " + character.getDex());
		System.out.println("나의 지능능력치는 : " + character.getIntel());

위의 코드와 같이 각 스탯별 -1이라는 음수 값을 입력했음에도 불구하고, Console 출력 값을 보면, 0으로 초기화되는 것을 확인할 수 있다.

 

이는 setter에서 버그가 발생하지 않도록 조건문을 작성해 주었기 때문이다. 아래 코드와 같이 power의 setter 함수를 보면, 입력된 값이 0보다 작을 경우 0으로 초기화시켜주는 것을 볼 수 있다.

위처럼 setter와 getter 메소드를 이용하면, 원치 않는 필드 값이 입력되는 불상사를 손쉽게 막을 수 있다.