java/객체지향

17. 캡슐화(encapsulation)

VanillaSky7 2023. 1. 19. 21:48

캡슐화(encapsulation)?


캡슐화(encapsulation)는 클래스 내부의 멤버(변수, 메서드)들을 하나로 패키징화(묶는다)하는 것을 의미합니다.

 

앞서 우리가 다룬 접근 제어자에서 그 사용 이유를 요약해보면 외부로부터 값을 보호하고, 외부로부터 값을 드러낼 필요없이 내부적으로

 

사용할 때라고 하였습니다. 이는 사실 정보은닉이라는 개념과 관련이 있습니다. (정보은닉은 검색을 통해 간단한 확인 권장합니다!)

 

이 캡슐화와 정보은닉을 통해 객체로써 정해진 로직으로 사용될 수 있도록 하고 응집력과 독립성을 높혀 유지보수를 용이하게 합니다!

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.vanilla.javaStudy;
 
class Number2 {
    private int a;
    private int b;
    private int c;
    
    public void setNumber(int a) {
        if(a < 0 || a > 50)
            return;
        
        this.a = a;
    }
    
    public int getNumber() {
        return a;
    }
}
 
public class EncapsulationExam {
 
    public static void main(String[] args) {
        
        Number2 num = new Number2();
        // num.a = 49; // 다른 클래스에서 private인 변수 a에 직접 접근했으므로 에러!
        num.setNumber(49);
        System.out.println(num.getNumber());
 
    }
}
cs

 

위 예제를 통해 살펴보겠습니다. 우리는 Number2라는 클래스를 만들었고, 24행에서 이에 대한 인스턴스를 생성했습니다.

 

그런데 25행에서 해당 객체 멤버 변수 a에 직접 접근하려고 하면 에러가 발생합니다. 그 이유는 접근 제어자 private 때문에

 

허용 범위인 해당 클래스를 벗어났기 때문이라는 것 기억나실 겁니다. 하지만 자세히 살펴보면 이것은 올바른 방법으로

 

객체를 사용할 수 있도록 유도해줍니다. 그 이유는 9행을 살펴보시게 되면 만약 a 값으로 0보다 작게 되거나 50보다 크게 될

 

경우 if문을 통해 해당 메서드를 종료하게 합니다. 즉 setNumber() 메서드를 통해 if문을 거쳐 0보다는 크고 50보다는 작도록

 

a값이 사용될 수 있도록 합니다. 

 

이는 사용자가 해당 클래스 및 객체를 정해진 로직으로써 사용할 수 있도록 유도해준다는 것을 알 수 있습니다.

 

또 접근 제어자가 private이라는 얘기는 허용 범위가 해당 클래스만을 의미한다는 얘기고, 그 얘기는 해당 클래스에서 어떻게

 

동작하는지만 손보면 된다는 장점을 가질 수 있게 됩니다! 지금은 매우 단순한 예제 코드이지만 훗날 코드가 복잡해짐에 따라서

 

이러한 장점들은 중요해질 것이라 생각합니다!