[OOP] 캡슐화 Encapsulation

2025. 1. 5. 21:43·Java/OOP

 

OOP의 큰 특징은 크게 4가지이다.

 

 

그중 캡슐화에 대해 자세히 알아보자.

 


 

캡슐화 (Encapsulation)

 

  캡슐화는 자바 OOP의 핵심 개념 중 하나이다. 프로그래밍 패러다임중 하나이며  캡슐화는 데이터를 보호하는 원칙이다.

  데이터를 외부로부터 숨기고 데이터를 조작하는 기능(메서드)은 무결성을 유지한다.

  캡슐화를 통해 데이터를 직접 접근하고 변경을 방지하거나 제한할 수 있다.

  캡슐화는 속성과 기능을 하나로 묶고, 외부에서 꼭 필요한 데이터만 노출시키고 나머지는 내부에 감추는 목적이다.

 

 

캡슐화의 특징

1. 데이터 은닉

  클래스 필드(멤버변수)의 접근제어자를 private로 설정하여 외부로부터 접근 못하게 한다.

 

2. 정보 은폐

  클래스 내부의 세부 구현을 알필요가 없어진다. 제공된 메서드만 사용하며, 내부 클래스 구조를 크게 신경 쓸 필요가 없어진다.

 

3. 유지보수

  클래스 내부가 변경되어도 외부에 영향을 최소화할 수 있다.

 

 

 


 

 

캡슐화가 왜 필요할까?

 

  예를들어보자, 어떤 선배 개발자가 옛날에 만든 뮤직앱이 있었다.  이 뮤직앱에는 볼륨이 100을 초과하면 시스템 상 오류로 인해 100을 넘기면 안 된다.

 

  선배 개발자는 볼륨을 담당하는 데이터 volume 멤버변수를 defalut 접근자로 지정한 후 프로그래밍을 했다.

public class MusicApp {
    public static void main(String[] args) {
        MusicAppData mad = new MusicAppData(80);

        mad.up();
        mad.getVolumeValue();

        mad.up();
        mad.getVolumeValue();

        //여기서부터 조절 불가
        mad.up();

    }
}

class MusicAppData {
    int volume = 0;

    //볼륨 초기값 설정
    MusicAppData(int volume) {
        this.volume = volume;
    }

    void up() {
        if (91 <= volume) {
            System.out.println("볼륨 최대 조절 불가!");
            return;
        }
        volume += 10;
    }

    void down() {
        if (volume <= 9) {
            System.out.println("볼륨이 최저입니다. 더 줄일 수 없어요.");
            return;
        }
        volume -= 10;
    }

    void getVolumeValue() {
        System.out.println("현재 볼륨: " + volume);
    }
}

 

 

  뮤직앱은 정상적으로 동작했다. 사용자들은 볼륨을 100을 초과하지 못하게 막았다. 그렇게 뮤직앱은 승승장구하며 발전했다. 

  시간이 지나 뮤직앱은 대규모 업데이트를 할 계획이었다. 업데이트를 맡게 된 신입 개발자는 볼륨 조절 기능을 담당했다.

  신입 개발자는 볼륨을 100을 초과하면 안 되는 이유를 모른다. 하지만 볼륨이 150까지 설정하고 싶었던 신입 개발자는 인스턴스로 필드에 직접 접근한다. mad.volume = 150 이런 식으로 접근 제어자가 없던 volume은 150으로 수정되어 프로그램이 다운되는 형상을 겪게 된다.

 

 

public class MusicApp {
    public static void main(String[] args) {
        MusicAppData mad = new MusicAppData(90);
        mad.up();
        mad.getVolumeValue();

        mad.up();
        mad.getVolumeValue();

        mad.volume = 150;
        mad.getVolumeValue();

    }
}

 

 

 

 

 

 


 

 

위 예제처럼 접근 제어자가 기본값이면 다른 클래스에서 직접 수정이 가능하므로 사용자가 접근할 수 있게 된다.  데이터에 직접 접근하므로 데이터 은닉과 은폐가 안된다.

 

접근 제어자 "private"로 데이터를 감춘다. 즉, 외부에 꼭 제공해야 하는 데이터를 제외한 나머지 데이터는 private로 감춘다.

 

 

private를 사용한 뮤직앱

더보기
class MusicAppData {
    private int volume = 0;

    //볼륨 초기값 설정
    MusicAppData(int volume) {
        this.volume = volume;
    }

    void up() {
        if (91 <= volume) {
            System.out.println("볼륨 최대 조절 불가!");
            return;
        }
        volume += 10;
    }

    void down() {
        if (volume <= 9) {
            System.out.println("볼륨이 최저입니다. 더 줄일 수 없어요.");
            return;
        }
        volume -= 10;
    }

    void up(int loopValue){
        if(loopValue<=0){
            return;
        }else{
            for(int i=0; i<loopValue; i++){
                up();
            }
        }
    }

    void getVolumeValue() {
        System.out.println("현재 볼륨: " + volume);
    }
}

 

 

 

정리하면 가급적 데이터는 전부 감춘다. 기능은 꼭 필요한 기능만 노출시킨다.

 

 


 

 

private로 캡슐화를 하면 유지보수와 코드를 이해하는데 큰 어려움이 없어진다.

 

 

 

 

결론

  캡슐화를 통해 데이터의 보안이 증가하고 MusicAppData클래스를 사용하는 개발자 입장에서는 기능만 잘 알면 문제없이 사용할 수 있어서 복잡도가 줄어든다.

'Java > OOP' 카테고리의 다른 글

[OOP] 다형성에 대해서  (0) 2025.03.24
[Java] 변수(지역, 인스턴스, 클래스)  (0) 2024.12.01
절차 지향 프로그래밍VS객체 지향 프로그래밍  (1) 2024.11.20
[Java] Argument로 참조값을 보내면?  (0) 2024.11.16
[Java] 기본형vs참조형  (4) 2024.11.15
'Java/OOP' 카테고리의 다른 글
  • [OOP] 다형성에 대해서
  • [Java] 변수(지역, 인스턴스, 클래스)
  • 절차 지향 프로그래밍VS객체 지향 프로그래밍
  • [Java] Argument로 참조값을 보내면?
oneH
oneH
  • oneH
    Hello WeonHyeok!
    oneH
  • 전체
    오늘
    어제
    • 분류 전체보기 (52) N
      • CSS (1)
      • Javascript (5)
        • JS자료구조,알고리즘 (1)
      • Java (14) N
        • OOP (9)
      • JSP (1)
      • Computer Network (2)
      • 이론 컴퓨터 (2)
      • Project (0)
      • Algorithm&Data Structure (12)
      • 데이터베이스 (3)
      • Spring,SpringBoot (1)
      • Git & GitHub (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    object
    combinators
    컴퓨터네트워크
    math
    이진검색
    Algorithm
    큐
    SQL
    스택
    자바
    OSI7계층
    컴파일
    JS
    선택자
    컴퓨터 네트워크
    Selector
    프로토콜
    Stack
    JavaScript
    OOP
    티스토리챌린지
    덱
    컴퓨터구조
    선형 큐
    폰노이만 아키텍쳐
    Java
    오블완
    MySQL
    Git
    링크드 리스트
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
oneH
[OOP] 캡슐화 Encapsulation

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.