본문 바로가기
Study

[Java] 객체 지향 프로그래밍(Object-Oriented Programming, OOP) - 캡슐화 (3)

by jisayDeveloper 2023. 10. 16.
728x90
반응형
SMALL

저번 포스팅인 상속에 이어서 캡슐화에 대해서 포스팅 하겠습니다.

 

https://jisaydeveloper.tistory.com/26

 

[Java] 객체 지향 프로그래밍(Object-Oriented Programming, OOP) - 상속 (2)

추상화에 이어서 상속을 알아보도록 하겠습니다. 정의 객체 지향 프로그래밍(OOP)에서, 상속(inheritance)은 객체들 간의 관계를 구축하는 방법이다. 클래스로 객체가 정의되는 고전 상속에서, 클래

jisaydeveloper.tistory.com

정의

캡슐화(capsule化) 또는 인캡슐레이션(encapsulation)이란 객체 지향 프로그래밍(OOP)에서 객체의 데이터와 기능을 하나로 묶고 외부에 노출되지 않도록 숨김 처리하는 것을 말한다. 변수, 메소드, 클래스에 대해 접근 제어자를 사용함으로써 캡슐화를 할 수 있다.

출처 : 해시넷

정의에서 보셨다시피 캡슐화는 외부로부터 데이터를 보호하기 위해 외부에는 불필요하거나 내부적으로만 사용되는 부분을 감추기 위해 특정 속성이나 메서드를 사용자가 사용할 수 없도록 은닉화하는 것입니다.

 

그렇다면 캡슐화를 어떻게 하는 걸까요?

 

객체 지향 프로그래밍에선 크게 두가지 방법이 있습니다.

 

1. 접근제어자(Access Modifiers)

  • public : 접근 제어자 중 가장 넓은 범위를 가집니다.
    멤버 변수 또는 메서드가 public 으로 선언하면 다른 클래스와 패키지에서 모두 접근 가능합니다.
  • protected : 동일한 패키지 내의 클래스와 서브 클래스에서만 접근 가능합니다.
    서브 클래스에서는 부모 클래스의 protected 멤버에 접근 할 수 있습니다.
  • default : 별도의 접근 제어자를 명시하지 않았을 때의 기본 접근 수준입니다.
    동일한 패키지 내의 클래스에서만 접근할 수 있습니다.
  • private : 가장 제한적인 범위를 가집니다.
    해당 클래스에서만 접근 가능하며, 다른 클래스에서 접근할 수 없습니다.
    주로 정보 은닉과 캡슐화 구현을 위해 쓰입니다.

코드로 예를 들면

public class Example {
    public int publicVar; // 다른 클래스에서 접근 가능
    protected int protectedVar; // 동일 패키지 및 서브클래스에서 접근 가능
    int defaultVar; // 동일 패키지에서만 접근 가능 (default 접근 제어자)
    private int privateVar; // 해당 클래스에서만 접근 가능

    public void publicMethod() {
        // 다른 클래스에서 호출 가능
    }

    protected void protectedMethod() {
        // 동일 패키지 및 서브클래스에서 호출 가능
    }

    void defaultMethod() {
        // 동일 패키지에서 호출 가능 (default 접근 제어자)
    }

    private void privateMethod() {
        // 해당 클래스에서만 호출 가능
    }
}

이러한 접근 제어자를 적절하게 사용하여 클래스의 멤버 변수와 메서드를 캡슐화하고, 안전하게 제어할 수 있습니다.


2. Getter & Setter

 

캡슐화를 실현하는 또 다른 방법은 멤버 변수에 대한 접근자(Getter)와 설정자(Setter) 메서드를 제공하는 것입니. Getter 메서드는 멤버 변수의 값을 반환하고, Setter 메서드는 멤버 변수의 값을 설정합니다. 이를 통해 멤버 변수의 값을 직접 수정하는 것이 아니라 메서드를 통해 데이터를 조작할 수 있습니다. 이로써 데이터의 일관성과 무결성을 보다 쉽게 유지할 수 있습니다.

 

코드로 예를 들면

public class Person {
    private String name; // private으로 선언된 멤버 변수

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

    //getter
    public String getName() {
        return name;
    }
}

앞에 설명했듯이 private 으로 선언한 멤버 변수는 클래스 내에서만 사용할 수 있는데 setter와 getter를 만들어 주면서 다른 클래스에서도 getter, setter 메서드를 통해 데이터를 조작합니다.(getter, setter는 lombok이라는 Java 라이브러리가 있는데 lombok을 사용하면 getter,setter를 자동으로 만들어 줆으로써 반복되는 메서드 작성 코드를 줄여줍니다. 추후 lombok에 관해서도 포스팅 하겠습니다.)

 

캡슐화는 객체 지향 프로그래밍의 핵심 개념 중 하나로, 코드의 구조와 유지보수성을 향상시키는 데 큰 도움을 줍니다. 올바르게 구현하면 코드의 안정성과 가독성을 향상시키며, 객체의 상태를 관리하기 위한 효율적인 방법을 제공합니다. 이제 캡슐화에 대한 기본 개념을 이해하고, 앞으로의 프로그래밍 프로젝트에서 이를 적용할 준비가 되었을 것입니다. 이를 통해 더 나은 소프트웨어를 개발할 수 있기를 기대합니다.

728x90
반응형
LIST