profile image

L o a d i n g . . .

article thumbnail image
Published 2022. 7. 8. 06:08

객체지향 프로그래밍에서는 객체의 필드(멤버변수)를 객체 외부에서 직접적으로 접근하는 것을 막는다. 이유는 외부에서 마음대로 변경 시 객체의 무결성이 깨질 수 있기 때문

ex) 음수가 될 수없는 자동차의 속력이 외부에서 음수로 변경될 경우

 

myCar.speed = -100;

이런 문제점을 방지하기 위해 객체 지향 프로그래밍에서는 메소드를 통한 필드변경방법을 선호한다.

필드는 외부에서 접근할 수 없도록 막고, 메소드는 공개하여 외부에서 메소드를 통해 필드에 접근을 유도.

메소드는 매개값을 검증해서 유효한 값만 객체의 필드로 저장할 수 있기 때문이다

이 역할을 하는 메소드가

setter

public void setSpeed(double speed) {
		this.speed = speed;
}
	
    ↓

	public void setSpeed(double speed) {
		if (speed < 0) {
			this.speed = 0;
			return;
		} else {
			this.speed = speed;
		}
	}

Source - Generate Getters and Setters 메뉴에서 자동 생성한 setter 메소드 변경

매개값이 음수일 경우 speed 필드에 0으로 저장하고 메소드 실행 종료.

접근제한자: public

리턴타입: void

메소드이름: set+필드이름

매개변수타입: 필드타입

 

외부의 값을 저장할 때 뿐 아닌 외부에서 객체의 데이터를 읽을때에도 필드  값을 직접 읽기보다 메소드를 사용하는 것이 좋다. 이런경우엔 메소드로 필드값을 가공 후 외부로 전달하면 된다

이때 사용하는 메소드가

Getter

	public double getSpeed() {
		return speed;
	}
    
   		 ↓
         
    	public double getSpeed() {
		double km = speed * 1.6;
		return km;
	}

 

 필드값인 마일을 km 단위로 환산 후 외부로 리턴.

클래스를 선언할 때 가능하면 필드를 private로 선언해서 외부로부터 보호하고 getter/setter 메소드를 작성해 필드값을 안전하게 변경/사용하는것이 좋다

 

접근제한자: public

리턴타입: 필드타입

메소드이름: get+필드이름

리턴값: 필드값

 

 

 

 

 

다만 만약 필드 타입이 boolean일 경우에는 getter 는 get 대신 is로 시작한다

 

private boolean stop;

public boolean is stop() {
	return stop;
}

 

 

 

 

 

예제

package a220708;

public class Car {
	private double speed;
	private boolean stop;

	public double getSpeed() {
		double km = speed * 1.6;
		return km;
	}
	
	public void setSpeed(double 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;
	}
}
package a220708;

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

잘못된 속도변경시 setter메서드에서 매개값을 검사하기때문에 개터의 리턴값이 0으로 나온다.

STOP시 stop필드의 getter(isStop())리턴값이 false일 경우, 자동차를 멈추기위해 Setter(setStop(true))를 호출해서 stop 필드를 true로, speed를 0으로 변경한다

 

 

 

 

참고 :

- 혼자 공부하는 자바(신용권), 한빛미디어

 

반응형

'개발 > JAVA' 카테고리의 다른 글

[Java] 타입 변환과 다형성  (0) 2022.07.11
[Java] 상속  (0) 2022.07.11
[Java] 인스턴스 멤버와 정적 멤버  (0) 2022.07.07
[Java] 메소드  (0) 2022.07.06
[Java] 생성자(constructor)  (0) 2022.07.05
복사했습니다!