아쿠의 개발 일지

[Java] 캡슐화 (Encapsulation) 본문

Programming/Java

[Java] 캡슐화 (Encapsulation)

디아쿠 2024. 7. 6. 16:45

객체 지향 프로그래밍의 가장 중요한 개념이다.

캡슐화는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말 한다.

속성과 기능을 하나로 묶고, 외부에는 꼭 필요한 기능만 노출하고 나머지는 모두 내부로 숨기는 것이다.

 

캡슐화를 안전하게 완성 시킬 수 있는 장치는 " 접근 제어자 " 이다.

 

1. 데이터를 숨겨라

 

객체에는 속성과 기능이 있다. 가장 필수로 숨겨야 하는 것은 속성이다.

객체 내부에 데이터를 외부에서 함부로 접근하게 하면 클래스 내의 로직을 무시하고 데이터를 바꿀 수 있다.

이로 인해서 캡슐화가 깨진다.

 

Ex ) 음악 플레이어

사용 할 때 전원부나, 볼륨 상태의 데이터를 직접 수정할 일이 있을까?

모든 사람들이 플에이어의 전원을 켜고, 끄거나 볼륨을 조절하는 버튼을 누른다.

그 내부 안에 있는 데이터 값을 직접 수정하지를 않는다.

전원 버튼을 눌렀을 때 실제 전원을 받아서 켜는 것은 음악플레이어의 일이다.

볼륨을 높였을 때 내부에 있는 볼륨 장치들을 움직이고 수치를 조절하는 것도 음악 플레이어의 일이다.

쉽게 얘기해서 우리는 음악  플레이어가 제공하는 기능을 사용하는 것이다.

 

그렇기 때문에 객체는 데이터의 객체가 제공하는 기능인 메소드를 통해서만 접근해야 한다.

데이터들은 private으로 막고, 기능(Method)을 열어두는 것이다.

데이터는 가급적 다 숨기는 게 좋다.

 

2. 기능을 숨겨라 (방금까진 열어두라매요)

물론 전부 다 숨기라는 얘긴 아니다. (그럼 뭘 하겠어요)

가급적이면 필요한 기능만 Open 하라는 뜻이다...

객체의 기능 중에서 외부에서 사용하지 않고, 내부에서만 사용하는 기능이 있다.

우리가 자동차 운전 할 때 엔진 조절, 배기 기능까지 알 필요가 없지 않냐,,, 우리는 엑셀과 핸들 정도의 기능만 알면 된다.

사용자에게 모든 기능을 알려준다면, 너무 많은 기능을 알아야 하니까

사용자 입장에서 꼭 필요한 기능만 외부에 노출하자.

외부에서 꼭 필요한 것만 public로 열고 나머진 다 private으로 숨기자.

 

데이터는 모두 숨기고, 기능은 꼭 필요한 것만 노출하는 것이 좋은 캡슐화이다.

 

package org.example.javabasicaqu.access.a;

public class BankAccount {

    private int balance;

    public BankAccount() {
        balance = 0;
    }

    // public 메서드 : deposit

    public void deposit(int amount){
        if (isAmountValid(amount)){
            balance += amount;
        } else {
            System.out.println("유효하지 않은 금액입니다.");
        }


    }

    // public 메서드 : withdraw
    public void withdraw(int amount) {
        if (isAmountValid(amount) && balance - amount >= 0){
            balance -= amount;
        } else {
            System.out.println("유효하지 않은 금액이거나 잔액이 부족합니다.");
        }
    }

    // public 메서드 : getBalance
    public int getBalance() {
        return balance;
    }



    private boolean isAmountValid(int amount){
        // 금액이 0보다 커야함
        return amount > 0;
    }


}

 

다음을 보면 balance을 private으로 막았고

기능을 보면 안에서만 써도 되는 isAmountValid는 private으로 막았다.

 

public class BankAccountMain {
    public static void main(String[] args) {
        BankAccount account = new BankAccount();
        account.deposit(10000);
        account.withdraw(3000);
        System.out.println("현재 잔액 = " + account.getBalance());
    }
}

 

Main 클래스를 만들어서 테스트를 해 보면

 

10,000 원 입금 7,000원 출금이 잘 나오고 있다.

 

인프런 김영한 선생님의 강의를 공부하며 작성한 게시글입니다 ,,, 꾸벅 (_ _)

728x90

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

[JPA] N+1 문제 해결  (1) 2024.07.10
[SpringBoot] Entity간의 관계 설정  (3) 2024.06.23
[SpringBoot] RestController  (0) 2024.06.23
[Method] method overloading 기본(2)  (0) 2024.06.22
[Method] method Overloading 기본  (0) 2024.06.22