자바 - 캡슐화: 초보자를 위한 가이드
안녕하세요, 자바 프로그래머를 꿈꾸는 여러분! 오늘은 자바의 오브젝트-지향 프로그래밍(OOP)의 기본 개념 중 하나인 캡슐화에 대해 다루겠습니다. 프로그래밍에 새로운 사람이라도 걱정 마세요; 저는 수년 동안 수업하면서 많은 학생들을 단계별로 안내한 것처럼 여러분을 안내하겠습니다. 그럼, 함께 이 흥미로운 여정에 떠나보겠습니다!
캡슐화란 무엇인가요?
자신의 소중한 물건이 들려 있는 보물 상자를 상상해 보세요. 그 상자를 누구나 열 수 있게 하고 싶지 않죠? 이것은 프로그래밍에서 캡슐화가 하는 일과 매우 유사합니다. 데이터(보물)를 보호 상자(클래스)에 넣고 특정 메서드(열쇠)를 통해서만 접근할 수 있게 하는 것입니다.
자바에서는 캡슐화가 데이터와 해당 데이터를 조작하는 메서드를 단일 유닛이나 오브젝트 내에 번들링하는 것으로 정의됩니다. 또한, 오브젝트의 일부 구성 요소에 대한 직접 접근을 제한하기 때문에 데이터 숨기기라고도 불립니다.
캡슐화의 중요성은 무엇인가요?
- 데이터 보호: 불법적인 접근을 차단합니다.
- 유연성: 내부 구현을 변경해도 코드의 다른 부분에 영향을 주지 않습니다.
- 재사용성: 캡슐화된 코드는 프로그램의 다른 부분이나 다른 프로그램에서 쉽게 재사용할 수 있습니다.
자바에서 캡슐화를 이루는 방법
자바에서 캡슐화를 이루기 위해서는 다음 단계를 따릅니다:
- 클래스의 변수를 private으로 선언합니다.
- 변수의 값을 수정하고 보기 위한 공개한 setter와 getter 메서드를 제공합니다.
이제 간단한 예제를 통해 이를 살펴보겠습니다.
자바 캡슐화 예제
public class Student {
// Private variables
private String name;
private int age;
// Public getter method for name
public String getName() {
return name;
}
// Public setter method for name
public void setName(String name) {
this.name = name;
}
// Public getter method for age
public int getAge() {
return age;
}
// Public setter method for age
public void setAge(int age) {
if (age > 0 && age < 120) { // 기본 검증
this.age = age;
} else {
System.out.println("유효하지 않은 나이!");
}
}
}
이 예제에서는 Student
클래스를 생성하고 두 개의 private 변수인 name
과 age
를 가집니다. 이 변수들은 클래스 외부에서 직접 접근할 수 없습니다. 대신, 공개 메서드(게터와 세터)를 사용하여 변수에 접근하고 수정합니다.
다음을 살펴보세요:
-
private String name;
과private int age;
은 우리의 변수를 private으로 선언합니다. -
public String getName()
과public int getAge()
은 값을 읽을 수 있는 게터 메서드입니다. -
public void setName(String name)
과public void setAge(int age)
는 값을 수정할 수 있는 세터 메서드입니다.
setAge
메서드에 기본 검증이 포함되어 있다는 것을 알 수 있습니다. 이것은 캡슐화의 이점 중 하나입니다 - 데이터가 어떻게 설정되고 특정 기준을 충족하는지를 제어할 수 있습니다.
캡슐화된 클래스 사용하기
이제 Student
클래스를 어떻게 사용할 수 있는지 살펴보겠습니다:
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("앨리스");
student.setAge(20);
System.out.println("학생 이름: " + student.getName());
System.out.println("학생 나이: " + student.getAge());
student.setAge(150); // "유효하지 않은 나이!"를 출력합니다.
}
}
이 예제에서는 Student
오브젝트를 생성하고 세터 메서드를 사용하여 이름과 나이를 설정한 후, 게터 메서드를 사용하여 값을 검색하고 출력합니다. 유효하지 않은 나이를 설정하려고 시도할 때, setAge
메서드의 검증을 통해 이를 방지합니다.
캡슐화의 이점
이제 캡슐화를 실제로 보았으니, 더 자세히 이의 이점에 대해 논의해보겠습니다:
- 데이터 숨기기: 오브젝트의 내부 표현을 외부 세계에서 숨깁니다.
- 유연성 증가: 내부 구현을 변경해도 클래스를 사용하는 코드에 영향을 주지 않습니다.
- 재사용성: 캡슐화된 코드는 쉽게 재사용할 수 있습니다.
- 테스트: 캡슐화된 코드는 단위 테스트하기 더 쉽습니다.
자바 캡슐화: 읽기 전용 클래스
가끔, 데이터를 읽을 수 있지만 수정할 수 없는 클래스를 만들고 싶을 때가 있습니다. 이를 읽기 전용 클래스라고 합니다. 다음은 예제입니다:
public class ReadOnlyStudent {
private final String name;
private final int age;
public ReadOnlyStudent(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
이 예제에서는 final
키워드를 사용하여 변수를 초기화 후 변경할 수 없도록 합니다. 세터 메서드는 제공하지 않고, 게터 메서드만 제공합니다.
자바 캡슐화: 쓰기 전용 클래스
반대로, 데이터를 쓸 수 있지만 읽을 수 없는 클래스를 만들고 싶을 때도 있습니다. 덜 일반적이지만, 다음은 예제입니다:
public class WriteOnlyLogger {
private StringBuilder log;
public WriteOnlyLogger() {
this.log = new StringBuilder();
}
public void addLog(String message) {
log.append(message).append("\n");
}
// log에 대한 getter 메서드는 제공하지 않음
}
이 클래스는 로그에 추가할 수 있지만, 로그를 직접 읽을 수는 없습니다.
결론
캡슐화는 자바와 오브젝트-지향 프로그래밍에서 강력한 개념입니다. 데이터에 대한 접근을 제어함으로써 우수하고 유지 가능한 코드를 작성할 수 있습니다. 기억해야 할 것은, 좋은 캡슐화는 잘 조직된 도구 상자와 같습니다 - 모든 것이 자리 있고, 필요할 때 언제든지 찾을 수 있습니다.
자바 여정을 계속하면서, 효과적이고 효율적인 프로그램을 설계하는 데 캡슐화가 중요한 역할을 한다는 것을 알게 될 것입니다. 계속 연습하고, 곧 이를 자연스럽게 사용할 수 있을 거예요!
코딩을 즐기세요, 미래의 자바 마스터들!
Credits: Image by storyset