본문 바로가기
Java/기본 개념 및 클래스

[Java] 25. getter/setter 메서드

글: Song hyun 2024. 4. 17.
728x90
반응형

[Java] 25. getter/setter 메서드

 

인스턴스화 된 객체의 변수를 외부에서 직접 조작시, 

값이 덮어쓰여지거나 예상치 못한 결과(오류)가 발생할 수 있다.

 

이런 위험을 방지하기 위해,

객체 지향 패러다임에서는 객체를 직접 초기화하는 것이 아닌

주로 특정 기능/메서드를 통해 조작한다. 

 

getter/setter 메서드는 그런 기능/메서드의 대표적인 예라고 할 수 있다.

 

 

 

1. getter/setter 메서드

(1) getter: 외부에서 객체의 값을 읽을 때 사용된다. (get)

객체의 상태변수를 return 한다.

 

(2) setter: 외부에서 객체의 값을 초기화할 때 사용된다. (set)

멤버 변수에 접근해서, 객체의 상태값을 변하게 한다. 리턴 타입은 void이다.

 

 

 

 

2. 왜 getter/setter 메서드를 사용할까?

-변수에 직접 접근해 초기화하는 것과, 기능(메서드)를 사용해 값을 초기화하는 것에는 큰 차이가 있다.

-getter/setter 메서드를 사용하면, 메서드 내부에 방어적 코드를 구현할 수 있다. (private 사용)

이를 통해 범주 이외의 값이 입력되는 것을 사전에 막을 수 있다. (=정보 은닉!)

-getter/setter 메서드를 사용하면 클래스와 메서드 간의 관계를 사용해, 객체 지향 패러다임에 가깝게 코드를 구현할 수 있다.

 

 

 

3. getter/setter 메서드 구현하기

(1) getter/setter 메서드를 구현할 때는 보통 get(변수)형식으로 이름을 짓는다.

(2) 카멜 노테이션(첫 단어는 소문자로, 두번째 단어부터 첫 글자를 대문자로 표기하는 방식)을 차용한다. 

 

(3) getter 메서드 구현하기: 변수의 값을 읽어오기

-public 리턴자료형 get변수명(){

    return this.변수명}

 

(4) setter 메서드 구현하기: 변수의 값을 초기화하기

-public void set변수명(자료형 변수명){

    *변수에 따라, 중요한 변수라면 방어적 코드를 작성하자.

    클래스 변수명=변수명;}

 

-----------------

 

아래의 코드를 살펴보자.

Hero 라는 클래스 파일 내부에 name, hp, power,defense 등의 변수를 선언했다. 

그리고 외부의 접근을 막기 위해 변수들의 접근 제어자를 private으로 지정했다. 

다른 파일에서 변수들에 접근하고, 초기화할 수 있도록 getter/setter 메서드를 선언한 것을 볼 수 있다.

 

주의해야할 것은 setter 메서드이다.

체력, 공격력, 방어력을 의미하는 변수 hp,power,defense의 경우 정수형으로 선언되었음을 볼 수 있는데,

사용자가 0 이하의 값을 입력하면 곤란할 것이다.

 

if문을 사용하여, 사용자가 0 미만의 값을 입력하면 값이 입력되지 않고, 안내 메세지를 출력하게 했다.

else의 경우에만 값이 초기화되니, setter 메서드를 사용하면 안전히 값을 입력받을 수 있다는 것을 알 수 있다! 

 

 


 

연습문제 1.

(1) Hero 클래스를 만들어라.

-클래스 내부에 변수와 getter/setter 메서드를 선언하라.

(2) HeroTest 파일을 만들고, getter/setter 메서드를 호출, 출력해라.

 

풀이 과정

(1) Hero 클래스를 생성한다. 클래스 내부에 이름, 체력, 공격력, 방어력 등의 변수들을 선언한다.

 

(2) 선언한 변수들의 접근 제어자를 private으로 지정한다.

 

(3) getter/setter 메서드를 클래스 내부에 선언한다.

-접근 제어자 private은 해당 변수/함수/메서드가 해당 클래스 내에서만 열리게 하기 때문에,

다른 파일에서는 해당 변수에 접근/수정이 불가능하다.

이는 getter/setter 메서드를 작성하는 하나의 이유이기도 하다!

*체력, 공격력, 방어력 등의 변수(int형 변수)는 음수가 되면 안 된다.

따라서 변수를 초기화하는 getter 메서드 내에, if문을 사용하여 방어적 코드를 작성하는 것이 좋다.

 

(4) Herotest 파일을 생성한다. 

-Hero hero1=new Hero();를 통해 새로운 객체를 선언한다.

-getter/setter 메서드를 통해 hero1이라는 객체의 변수에 접근하거나, 수정할 수 있다.

 

 

차례대로 Hero 클래스, TestHero 파일이다.

package basic.ch10;

public class Hero {
	private String name;
	private int hp;
	private int power;
	private double defense;
	private boolean isDie;

	// getter 메서드
	public String getName() {
		return this.name;
	}

	public int getHp() {
		return this.hp;
	}

	public int getPower() {
		return this.power;
	}

	public double getDefense() {
		return this.defense;
	}

	// setter 메서드
	public void setName(String setName) {
		name = setName;
	}

	public void sethp(int setHp) {
		if (setHp < 0) {
			System.out.println("잘못된 입력입니다.");
		} else {
			hp = setHp;
		}
	}

	public void setPower(int setPower) {
		if (setPower < 0) {
			System.out.println("잘못된 입력입니다.");
		} else {
			power = setPower;
		}
	}

	public void setDefense(int setDefense) {
		if (setDefense < 0) {
			System.out.println("잘못된 입력입니다.");
		} else {
			defense = setDefense;
		}
	}

}
package basic.ch10;

public class TestHero {
	public static void main(String[] args) {
		Hero hero1 = new Hero();
		hero1.setName("아이언맨");
		hero1.sethp(100);
		hero1.setDefense(-100);

		double a = hero1.getDefense();
		System.out.println(a);
	}

}
728x90
반응형