[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);
}
}
'Java > 기본 개념 및 클래스' 카테고리의 다른 글
[Java] 27. Java로 스타크래프트 모델링하기 (0) | 2024.04.18 |
---|---|
[Java] 26. 참조 변수 this, this의 3가지 용법 (0) | 2024.04.18 |
[Java] 24. 접근 제어 지시자와 정보 은닉 (0) | 2024.04.17 |
[Java] 23. 개념 응용하기: 함수와 메서드를 이용한 응용문제 (0) | 2024.04.16 |
[Java] 22. 객체 지향 패러다임 (0) | 2024.04.16 |