본문 바로가기

Java 기본 문법 - 참조 서적 [이것이 자바다 - 한빛미디어]/4. 객체지향 프로그래밍

11. Java 자바 - Getter와 Setter 메소드

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

 

객체 데이터를 외부에서 읽고 변경 시 객체의 무결성이 깨질 수 있기 때문이다.

ex) 자동차 속도는 음수 불가, 하지만 외부에서 음수로 설정하면 객체 무결성이 깨진다.

 

따라서 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호한다.

 

데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서

 

외부에서 메소드를 통해 데이터에 접근하도록 유도한다.

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

 

이러한 역할을 하는 메소드 Setter!

 

ex) 자동차 속도를 setSpeed( ) 메소드로 변경할 경우 아래와 같이 검증 코드를 작성할 수 있다.

 

void setSpeed(double speed) {   //Setter
    if(speed < 0) {
        this.speed = 0;     // 매개값이 음수라면, 필드에 0으로 저장하고 메소드 실행 종료
        return;
    } else {
        this.speed = speed;
    }
}

 

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

 

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

이런 경우 메소드로 필드값을 가공 후, 외부로 전달한다.

 

이런 역할을 하는 메소드 Getter!

 

ex) 자동차 속도를 마일에서 Km 단위로 환산해서 외부로 리턴하는 getSpeed( ) 메소드

 

double getSpeed() {
    double km = speed * 1.6;  // 필드 값인 마일(speed)를 km 단위로 환산 후 외부로 리턴
    return km;
}

 

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

 

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

 

 

Setter / Getter 메소드 선언 방식

(검증 코드 / 변환 코드는 필요에 따라 추가한다.)

 

private 타입 fieldName;    // 필드 접근 제한자 : private

//Getter
public 리턴타입 getFieldName() {
    return fieldName;
}

//Setter
public void setFieldName(타입 fieldName) {
    this.fieldName = fieldName;
}

 

Getter : getFieldName( )

 - 접근 제한자 : public

 - 리턴 타입 : 필드의 리턴 타입

 - 메소드 이름 : get + 필드 이름 (첫문자는 대문자)

 - 리턴값 : 필드값

 

Setter : setFieldName(타입 fieldName)

 - 접근 제한자 : public

 - 리턴 타입 : void

 - 메소드 이름 : set + 필드 이름 (첫문자는 대문자)

 - 매개 변수 타입 : 필드 타입

 

만약 필드 타입이 boolean일 경우, Getter는 get으로 시작하지 않고 is 로 시작하는 것이 관례이다.

 

ex) stop 필드의 Getter / Setter

 

private boolean stop;   // 필드 접근 제한자 : private

//Getter
public boolean isStop() {
    return stop;
}

//Setter
public void setStop(boolean stop) {
    this.stop = stop;
}

 

Getter : isStop( )

 - 접근 제한자 : public

 - 리턴 타입 : 필드 타입

 - 메소드 이름 : is + 필드이름 (첫문자는 대문자)

 - 리턴값 : 필드값

 

Setter : setStop(boolean stop)

 - 접근 제한자 : public

 - 리턴 타입 : void

 - 메소드 이름 : is + 필드이름 (첫문자는 대문자)

 - 매개 변수 타입 : 필드 타입

 

 

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

Getter 메소드만 선언하거나, Setter 메소드를 private 접근 제한을 갖도록 선언한다.

 


 

* 이클립스에서 클래스에 선언된 필드에 대해 자동적으로 Getter / Setter 메소드를 생성하기

 

필드를 선언한 후, 메뉴에서

[Source → Generate Getter and Setters] 를 선택하면, 자동으로 생성할 수 있는 대화상자가 열린다.

 


 

ex) Car 클래스의 speed, stop 필드에 대한 Getter / Setter

 

Car.java : Getter / Setter 메소드 선언

public class Car {
    //필드
    private int speed;
    private boolean stop;
    
    //생성자
    
    //메소드
    public int getSpeed() {  // Getter
        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;
    }
}

 

CarExample.java

public class CarExample {
    public static void main(String[] args) {
        Car myCar = new Car();   // 객체 생성
        
        //잘못된 속도 변경
        myCar.setSpeed(-50);
        
        System.out.println("현재 속도 : "+ myCar.getSpeed());  // 0 출력
        
        //올바른 속도 변경
        myCar.setSpeed(60);
        
        //멈춤
        if(!myCar.isStop()) {
            myCar.setStop(true);
        }
        
        System.out.println("현재 속도 : "+ myCar.getSpeed());  // 0 출력
    }
}        

 

speed 필드값을 음수로 변경하려 하면, Setter인 setSpeed 에서 매개값 검사 후 0 으로 변경하기 때문에

0 이 출력된다.

 

stop 필드의 Getter 인 isStop() 리턴값이 false 일 경우,

Setter 인 setStop(true) 를 호출해서 stop 필드를 true로, speed 필드를 0 으로 변경한다.