- [Java] 25. getter/setter 메서드2024년 04월 17일
- Song hyun
- 작성자
- 2024.04.17.:45
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반응형'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 다음글이전글이전 글이 없습니다.댓글