본문 바로가기

Web Development/Java

[Java] 캡슐화, TDA 원칙

자바의 정석 기초편 강의를 수강하던 중.. 캡슐화의 개념이 잘 이해가 안갔다. 캡슐화는 객체지향프로그래밍의 중요한 특성중 하나다.

자바의 정석 강의자료에 따르면,

 

캡슐화

- 접근제어자를 이용해서 멤버변수들은 private으로 해서 내부에 감추고 메서드들은 public으로 해서 외부에 노출시킴으로써

  같은 클래스에 정의된 멤버들끼리는 서로 자유롭게 접근하고

  외부에서는 메서드를 통해서만 멤버변수에 접근할 수 있는 구조로 만드는 것.

- 외부에서는 객체의 노출된 public 메서드만을 호출할 수만 있을 뿐 실제 내부가 어떻게 되어 있는지 알 수 없음.

 

나의 의문은 이걸 왜 캡슐화라고 부르냐는 것. 그래서 캡슐화의 개념을 좀 더 찾아봤다.

 

캡슐화: 데이터와 메서드를 하나의 단위로 묶어 외부에서 직접 접근하지 못하도록 보호하는 개념

 

캡슐화의 의의는

(1) 관련있는 변수와 메서드들을 한 클래스 안에 묶는 것

(2) 이를 캡슐로 감싸 외부에서 직접 접근할 수 없도록 보호하는 것

에 있는 것으로 보인다.

 

캡슐화를 할 때에는 TDA라는 규칙을 따라야 한다.

 

TDA(Tell, Don't Ask) 규칙

이 규칙이 몇몇 설명에서 '데이터를 꺼내와서 처리하는게 아니라 객체에게 데이터를 처리할 행위를 요청하는 것' 정도로 설명되어있어서 잘 이해가 가지 않았는데, 쉽게 말하자면 객체에게 데이터를 요구(ask)하지 말고 객체에게 직접 일을 시키라(tell)는 것이다.

 

예를 들어 Time이라는 클래스가 있다고 가정하자. 

 

	private int hour; // 0-23
	private int minute;
	private int second;

 

Time 클래스는 이렇게 세 개의 인스턴스 변수를 가진다. 여기서 hour라는 변수는 0 ~ 23 까지의 값만을 가질 수 있다.

 

		Time t = new Time();
		t.hour = 100;

 

그런데 만약 유저가 이런식으로 직접 시간을 설정할 수 있다면 문제가 생긴다. 그래서 hour 변수는 private으로 유저가 직접 접근할 수 없도록 하고 대신 클래스 내에 메서드를 정의한다.

 

class Time {
	private int hour; // 0-23
	private int minute;
	private int second;

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

	public int getHour() {
		return this.hour;
	}
}

public class TimeTest {

	public static void main(String[] args) {
		Time t = new Time();
		t.setHour(21);
		System.out.println(t.getHour());
		t.setHour(29);
		System.out.println(t.getHour());
	}

}

 

이렇게 정의하면 setHour() 메서드를 통해 0 ~ 23 사이의 값이 인수로 들어올 때만 hour 변수의 값을 변경하고, 그 외의 경우에는 return문을 만나 아무 일도 일어나지 않게 된다.

이런식으로 객체에 t.hour 변수를 요청해서 직접 값을 처리하는 방식이 아니라 객체 내에 메서드를 정의하여 객체가 알아서 값을 처리하게 하고 사용자에게 자세한 과정은 보여주지 않는 것이 캡슐화의 핵심 규칙이다.

 

참고자료

-자바의 정석 기초편 강의자료

-https://seungtaek-overflow.tistory.com/16

'Web Development > Java' 카테고리의 다른 글

[Java] 객체지향개념5  (0) 2024.01.17
[Java] 객체지향개념4  (1) 2024.01.16
[Java] 객체지향개념3  (1) 2024.01.09
[Java] 객체지향개념2  (1) 2024.01.09
[Java] 객체지향개념1  (1) 2024.01.09