캡슐화(Encapsulation)란?
캡슐화는 객체 지향 프로그래밍(OOP)의 네 가지 핵심 개념 중 하나입니다. 나머지 세 가지는 상속(Inheritance), 다형성(Polymorphism), 그리고 추상화(Abstraction)입니다.
자바에서 캡슐화는 데이터(변수)와 그 데이터를 처리하는 코드(메서드)를 하나의 단위로 묶는 메커니즘을 의미합니다. 캡슐화가 적용되면 클래스의 변수는 외부 클래스로부터 숨겨지며, 오직 해당 클래스 내부의 메서드를 통해서만 접근할 수 있습니다. 이러한 특성 때문에 캡슐화는 '데이터 은닉(Data Hiding)'이라고도 불립니다.
자바에서 캡슐화를 구현하려면 다음 두 가지 원칙을 따릅니다.
- 클래스의 변수를
private으로 선언하여 외부에서의 직접 접근을 차단합니다. - 변수 값을 조회하고 수정할 수 있도록
public게터(getter)와 세터(setter) 메서드를 제공합니다.
캡슐화 예제 코드
public class Student {
// private 변수 선언
private String name;
private int age;
// getter 메서드
public String getName() {
return name;
}
// setter 메서드
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}위 예제처럼 변수를 private으로 보호하고 공개된 메서드를 통해서만 접근을 허용하면, 잘못된 값이 할당되는 것을 방지하고 데이터의 무결성을 지킬 수 있습니다.
추상화(Abstraction)란?
추상화는 구체적인 사건보다 개념에 집중해 다루는 성질을 말합니다. 일상 속 예로 이메일을 들 수 있습니다. 이메일을 보낼 때 메일 서버가 어떤 프로토콜을 사용하는지, 전송 과정에서 내부적으로 어떤 일이 벌어지는지 등의 복잡한 세부 사항은 사용자에게 숨겨져 있습니다. 따라서 사용자는 메일 내용을 작성하고, 받는 사람의 주소를 입력한 뒤 전송 버튼만 클릭하면 됩니다.
객체 지향 프로그래밍에서도 마찬가지입니다. 추상화란 구현 세부 사항을 사용자로부터 숨기고 필요한 기능만 제공하는 과정입니다. 즉, 사용자는 객체가 '어떻게' 동작하는지가 아니라 '무엇을' 하는지만 알면 되는 것입니다.
자바에서는 추상 클래스(Abstract Class)와 인터페이스(Interface)를 통해 추상화를 구현할 수 있습니다.
- 추상 클래스: 하나 이상의 추상 메서드(구현부가 없는 메서드)를 포함할 수 있는 클래스로,
abstract키워드로 선언합니다. - 인터페이스: 구현 없이 메서드의 시그니처만 정의하며, 이를 구현하는 클래스가 반드시 해당 메서드를 구현하도록 강제합니다.
마무리: 캡슐화와 추상화의 차이
캡슐화와 추상화는 모두 '정보를 숨긴다'는 공통점이 있지만 목적이 조금 다릅니다. 캡슐화는 데이터와 메서드를 하나로 묶어 데이터 무결성을 지키는 데 초점을 맞추고, 추상화는 불필요한 구현 세부 사항을 감춰 사용자에게 단순한 인터페이스를 제공하는 데 초점을 둡니다. 두 개념을 함께 활용하면 유지보수성과 확장성이 뛰어난 자바 코드를 작성할 수 있습니다.