자바

JAVA 자바 Getter 와 Setter

알통몬_ 2017. 3. 12. 19:27
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

Getter 와 Setter 메서드

 일반적으로 객체 지향 프로그래밍에서 객체의 데이터는 객체 외부에서 직접적으로 접근하는 것을 막습니다.

 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문입니다.

예를 들어 자동차의 속도는 음수가 될 수 없는데 외부에서 음수로 변경하면 무결성이 깨집니다. 

이러한 문제점 해결을 위해 메서드를 통해 데이터를 변경하는 방법을 선호합니다. 

데이터는 외부에서 접근할 수 없도록 막고 메서드는 공개해서 

외부에서 메서드를 통해 데이터에 접근하도록 유도하는 것입니다. 

메서드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문. 

이런 역할을 하는 메서드가 Setter입니다. 


ex)

 void setSpeed(double speed) {

    if(speed<0) {

      this.speed = 0;

     return;    

     }

    else {

     this.speed = speed;

     }

 }


외부에서 객체의 데이터를 읽을  때도 메서드를 사용하는 것이 좋습니다. 

객체 외부에서 객체의 필드값을 사용하기에 부적절한 경우도 있습니다. 

이런 경우에 메서드로 필드값을 가공한 후 외부로 전달하면 됩니다. 

이 메서드가 Getter 메서드입니다.

ex)

 double getSpeed() {

    double km = speed *1.6; 필드값인 마일을 km 단위로 환산 후 외부로 리턴

    return km;

  }


클래스를 선언할 때 가능하다면 필드를 private 로 선언해서 외부로부터 보호하고, 

필드에 대한 Setter와 Getter 메서드를 작성해서 필드값을 안전하게 변경/사용하는 것이 좋습니다. 


아래 코드는 Setter 와 Getter 메서드를 선언하는 방법을 보여주는 코드입니다.


private 타입 fieldName;


//Getter

public 리턴타입 getFieldName(){

    return fieldName;

 }


//Setter

public void setFieldName(타입 fieldName) {

   this.fieldName = fieldName;

 }


필드 타입이 boolean 이라면 Getter 는 get으로 시작하는 것이 아니라 is 로 시작하는 것이 관례입니다.


private boolean stop;


//Getter

public boolean isStop() {

   return stop;

 }


//Setter

public void setStop(boolean stop) {

    this.stop = stop;

 }


만약 외부에서 필드값을 읽을 수만 있고 변경하지 못하도록(읽기 전용)하려면 

Getter 메서드만 선언해도 되고, 아니면 Setter 메서드를 private 접근 제한을 갖도록 선언해도 좋습니다.

이클립스는 선언된 필드에 대해 자동적으로 Getter와 Setter 메서드를 생성시키는 기능이 있습니다.

필드를 선언한 후 메뉴에서 Source -> Generate Getters and Setters 를 선택하면 

선언된 필드에 대한 Getter 와 Setter 를 자동 생성시킬 수 있습니다.


Getter, Setter 사용 예제)

예제1)

package getter_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;

return;

} else {

this.speed = speed;

}

}


public boolean isStop() {

return stop;

}

public void setStop(boolean stop) {

this.stop = stop;

this.speed = 0;

}

}


예제2)

package getter_setter;


public class CarExample {

public static void main(String[] args) {

Car myCar = new Car();

//잘못된 속도 변경

myCar.setSpeed(-50);

System.out.println("현재 속도: " + myCar.getSpeed());

//올바른 속도 변경

myCar.setSpeed(60);

//멈춤

if(!myCar.isStop()) {

myCar.setStop(true);

}

System.out.println("현재 속도: " + myCar.getSpeed());

}

}

반응형