middlefitting

[OOP] 캡슐화란 무엇일까 본문

JAVA

[OOP] 캡슐화란 무엇일까

middlefitting 2023. 2. 17. 23:09

캡슐화는 OOP의 4대원칙 중 하나로 원칙인 만큼 매우 중요합니다.

 

클래스는 서로 관련이 있는 변수와 함수를 하나의 객체로 모아주는 역할을 수행하는데요,

 

캡슐화는 이러한 클래스의 멤버를 외부에서 쉽게 접근하지 못하게 정보를 은닉하는 것을 말합니다.

 

 

 

 

정보를 은닉하면 뭐가 좋을까

 

우선 캡슐화를 하지 않고 객체의 인스턴스 변수를 외부에서 접근하는 것은 객체지향스럽지 않습니다.

 

4대 원칙에 어긋나니까 당연한 말이지만 어떤 부분에서 그럴지 생각을 해보자면

 

왜냐하면 객체는 클래스에 있는 메소드로서 자신의 작업을 수행하게 되는데,

 

클래스에 정의되지 않은 동작으로 객체를 사용하게 되는 것이기 때문입니다.

 

 

더불어 그러한 의도되지 않은 동작은 오류의 범위를 크게 만들 것임은 분명합니다.

 

그래서 클래스의 정보를 은닉함으로써 객체를 정의된 동작(메소드)로만 사용하게 일종의 강제성을 부여야하여 합니다.

 

 

 

정보를 은닉하는 법

 

정보를 은닉하기 위해서는 접근 제어자의 개념을 알아야 합니다.

 

자바의 접근 제어자는 이렇게 4가지가 존재합니다.

 

접근 제어자 범위 사용 불가 위치
private 같은 클래스  
(default) 같은 패키지 클래스 접근 제어자
protected 같은 패키지, 자손 클래스 접근 제어자
public 어디서나 가능  

 

이러한 접근제어자를 통해 클래스, 멤버를 어디서 접근이 가능하게 할 것인지 유연하게 결정할 수 있습니다.

 

더불어 접근제어자는 좁을수록 에러가 발생한 위치를 찾기가 쉬우므로 좁을수록 좋습니다.

 

캡슐화의 예시로는 대표적으로 getter, setter 패턴이 있습니다.

 

이는 클래스의 인스턴스 변수의 정보를 getter 메소드로만 가져올 수 있고, setter 메소드로만 변경할 수 있는 패턴입니다.

 

그리고 인스턴스 변수는 외부에서 접근이 불가능하게 private 접근 제어자를 사용합니다.

 

코드의 예시는 다음과 같습니다.

public class Student {
    String 	name;
    int 	age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

 

이렇게 캡슐화에 대해 알아보았습니다.

 

이렇게 캡슐화를 통해 객체를 원하는 동작만 수행되도록 만들 수 있고, 외부에 불필요한 정보를 숨길 수 있습니다.

 

 

 

 

참고 자료

자바의 정석 - 남궁성