캡슐화(Encapsulation)
캡슐화는 객체 지향 프로그래밍의 중요한 특징 중 하나다. 속성과 기능을 하나로 묶어 외부에 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것을 말한다. 캡슐화를 통해 데이터의 직접적인 변경을 방지하거나 제한할 수 있다.
ㅇ 속성
객체에는 속성이 존재한다. 캡슐화에서 가장 필수로 숨겨야 하는 것은 속성이다. 객체 내부의 데이터를 외부에서 접근이 가능하게 한다면 클래스 안에서 데이터를 다루는 모든 로직을 무시하고 데이터를 변경할 수 있기 때문에 캡슐화가 깨질 수 있다. 개발자가 의도하는데로 프로그램이 동작하지 않을 수 있다.
예를 들어 우리가 Tv를 개발하고 있다는 가정을 해보자 Tv의 채널은 5번을 넘어가게 되면 폭발한다. 그렇다면 Tv의 채널을 5번이 넘어가지 않게 설계를 해야한다.
Tv를 설계한 클래스이다. 채널을 올리는 메서드에는 채널이 5가 되면 채널이 넘어가지 않게 코딩했다.
메서드를 이용하여 채널을 이동하면 절때로 5를 넘지 않을 것이다. 하지만 클래스의 필드에 접근제한자가 지정되어 있지 않아 인스턴스를 생성하면 필드에 직접 접근이 가능해진다.
접근제한자를 지정하지 않았기 때문에 tv 클래스의 channel에 직접 접근하여 값을 변경하였다. Tv가 폭발할 것이다.
이런 경우를 방지하기 위해 객체의 데이터(속성)는 객체가 제공하는 메서드(기능)을 통해서만 접근해야한다.
접근제한자를 사용해서 필드에 직접적으로 접근할 수 없게 하였다. 접근 제어자를 통해 캡슐화를 안전하게 완성할 수 있다.
ㅇ 기능
기능 중에서도 외부에서 사용하지 않는 내부에서만 사용하는 기능들이 있다. 사용자 입장에서 사용하는 기능들만 외부에 노출하고 내부에서 사용하는 기능들은 숨기는게 좋은 캡슐화이다. tv의 채널을 이동하는 기능이 사용자에게는 단순히 채널을 이동하는 기능이지만, 내부에서는 복잡한 구조로 이동을 할 수 있기 때문에 기능을 다 노출시키면 사용자 입장에서는 너무 많은 것을 알아야 할 수 있기 때문이다.
데이터는 모두 숨기고, 꼭 필요한 기능만 노출하는 것이 올바른 캡슐화다.
은행계좌를 설계한다는 예를 들어 알아보면, bank 클래스로 인스턴스를 생성한다면
숨김: money(속성), valid(기능)
노출: deposit(기능)
valid 기능은 외부에 노출되지 않는 내부에서만 사용하는 기능인 것 이다. 사용자 입장에서 만약 valid가 노출되어 있다면 입금 전에 'valid의 검증 기능을 통해 정상적인 금액인지 확인을 해야하나?' 라는 생각을 가질 수 있다. 정상적인 금액이 아니여도 입금 기능을 사용하는데는 전혀 문제가 되지 않는데 말이다.(정상적이지 않다면 입금이 되지 않기 때문)
캡슐화를 통해서 데이터를 안전하게 보호하고 클래스를 사용하는 개발자와 사용자의 복잡도를 낮출 수 있다.
'Java' 카테고리의 다른 글
JAVA Array(배열) (2) | 2024.10.02 |
---|---|
JAVA 변수 (1) | 2024.09.19 |
JAVA 메모리 구조 (0) | 2024.09.19 |
Java 인터페이스와 추상 클래스의 차이점 (0) | 2024.02.28 |
Java 컴파일 과정을 알아보기 (1) | 2024.02.25 |