접근제어자와 캡슐화, 그리고 getter, setter메서드

  학원수업을 듣다보면 하루에도 수십번 난관에 봉착하며 혼자 되내인다. 처음엔 고뇌에 빠져 멘탈이 살짝 흐릿해지다가, 컴퓨터 공부한지 이제 2개월인데 잘하는게 이상하지. 차분히 내가 해야할 공부를 해야지 한다....


  정신이...ㅋㅋ




  암튼 오늘 collection부분을 수업하기전에 선생님께서 인터페이스와 관련되 문제를 몇개 내주셔서 풀고있던 중 여지껏 너무 헤깔렸던 개념에 대해 먼가 길을 찾고자 자바의 정석을 펼쳤다.


1. 접근제어자(access modifier)

  음... 자바의 정석을 보면 객체지향 전까지 프로그래밍 언어에 공통적으로 가장 중요한 문법들을 배운다. 그땐 변수 앞에 왜 public이 붙는지... 조건문과 반복문, 그리고 여러가지 챕터를 배우기 바빠서 사실 궁굼해 하지 않았던 부분들이 객체지향파트에 들어오면서 여러가지를 공부하도록 했다. 


  간단히 표로 정리해보면

 접근제어자

같은 클래스 

같은 패키지 

자손클래스 

전체 

public 

O

protected

 

(default)

 

 

private

 

 

 


  제어자는 제어자가 붙은 자신에게 타인(객체)이 접근하는데 있어서 각각 다른 제한조건을 둔다. 

public은 전체가 접근해서 사용하거나 참조할 수 있고, 그 반대로 private의 경우에는 같은 클래스 내에서만 이용하거나 참조할 수 있다. 


접근 범위 : public > protected > (default) > private


2. 캡슐화

  근데 위와 같은 접근제어자를 왜 사용하는가 궁굼해 할 수도 있다. 그건 바로 클래스의 내부에 선언된 데이터를 보호하기 위해 멤버에 접근제어자를 붙여서 사용하는 것이다. 객체지향개념에서 중요한 부분으로 외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여, 외부에 노출시키지 않음으로서 코드의 복잡성을 줄일 수 있다. 

  정석에서 설명되있는 부분을 참고하면, 만일 메서드하나를 변경하고자 할때, 해당 메서드의 접근제어자가 public 이냐 private이냐 비교하며 설명하고 있다. 

  만일 public 이라면, 메서드를 변경한 후에 오류가 없는지 테스트해야 하는 범위가 비교적 넓다.(다른 접근제어자에 비해)
하지만 메서드에 붙은 접근제어자가 private라면, 어떨까? public보다 접근의 범위가 훨씬 제한적이기 때문에, 클해스 하나만 살펴보면 되는 것이다. 이처럼 접근 제어자 하나가 때로는 상당한 차이를 만들 수 있다. 


3. getter와 setter메서드

  수업내용을 생각해보면, 인터페이스를 어떠한 클래스가 구현했을때, 그 안에 선언된 변수를 보면, 오늘 본건 전부다 private였다. 객체지향개념을 보여주기라도하듯, 그래서 문제를 풀면서 get과 set을 많이 사용해야 했는데 헤깔려서 본질적으로 오늘 이시간에 이 글을 쓰고있다...

개념을 정리하면, 

  get으로 시작하는 메서드는 단순히 멤버변수의 값을 반환한다.

그리고 set으로 시작하는 메서드는 매개변수에 지정된 값을 검사하여 조건에 맞는 값일 때만 멤버변수의 값을 변경한다. 


  보통 멤버변수의 값을 읽는 메서드의 이름을 'get멤버변수이름'( ex) getTime, getHour, getId, getAddress...) 이라 하고, 

멤버변수의 값을 변경하는 메서드의 이름을 'set멤버변수이름' ( ex) get과 같은 방식으로 생각!)으로 한다.


package javajeungseok;

public class Time {
	private int hour;
	private int minute;
	private int second;

	Time(int hour, int minute, int second) {
		setHour(hour);
		setMinute(minute);
		setSecond(second);
	}

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		if (hour < 0 || hour > 23) {
			return;
		}
		this.hour = hour;
	}

	public int getMinute() {
		return minute;
	}

	public void setMinute(int minute) {
		if (minute < 0 || minute > 59) {
			return;
		}
		this.minute = minute;
	}

	public int getSecond() {
		return second;
	}

	public void setSecond(int second) {
		if (second < 0 || second > 59) {
			return;
		}
		this.second = second;
	}

	@Override
	public String toString() {
		return "시간=" + hour + ", 분=" + minute + ", 초=" + second + "입니다.";
	}

}


package javajeungseok;

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time(12, 35, 30);
		System.out.println(t);
		
		t.setHour(t.getHour()+1);
		System.out.println(t);
	}

}













<자바의정석 p350에 있는 예제.>


- Time클래스의 모든 멤버변수가 private이기 때문에 get과 set으로 멤버변수에 접근한다. 이들을 다루기위해서 public메서드를 선언했고, 그 메서드를 통해서만 변수에 접근이 가능하다. 

댓글

Designed by JB FACTORY