[Java] 캡슐화와 은닉화

hyunoi·2024년 11월 24일

Java

목록 보기
13/20
post-thumbnail

캡슐화


객체 지향 프로그래밍에서 데이터(상태)와 기능(동작)을 하나의 단위로 묶는 것
객체가 특정한 목적을 수행하는데 필요한 변수와 메소드를 관련지어서 하나의 클래스로 묶어야 한다.

목적

  • 데이터 보호: 객체의 내부 상태가 외부에서 직접적으로 수정되지 않도록 해야 한다.
  • 기능 제공: 객체의 기능을 메소드를 통해서 외부에 전달하고, 객체가 어떤 동작을 하는지 명확하게 정의한다.

특징

  • 데이터와 메서드를 하나의 클래스로 묶어서 객체를 구성
  • 외부에서 객체를 직접 접근하지 않고, 메소드를 통해서 조작
class BankAccount {
    private double balance; // private 필드 (정보 은닉)

    // 생성자
    public BankAccount(double initialBalance) {
        this.balance = initialBalance;
    }

    // getter 메서드
    public double getBalance() {
        return balance;
    }

    // 메서드를 통해 상태 변경
    public void deposit(double amount) {
        if (amount > 0) {
            balance += amount; // 금액을 입금
        }
    }

    public void withdraw(double amount) {
        if (amount > 0 && amount <= balance) {
            balance -= amount; // 금액을 출금
        }
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        BankAccount account = new BankAccount(1000.0);
        account.deposit(500.0);
        account.withdraw(200.0);
        System.out.println("Current balance: " + account.getBalance());
    }
}
  • balance를 직접 접근하지 않고, deposit, withdraw 메소드를 통해서 접근하고 있다.

은닉화


객체 지향 프로그래밍에서 내부 구현을 숨기고 외부에 필요한 정보만 공개하는 원칙
객체의 내부 구조나 데이터를 외부에서 직접 접근하지 못하도록 하고, 오직 메소드를 통해서만 접근하도록 한다.

목적

  • 내부 구현 보호: 객체의 내부 상태와 동작을 감추어서 외부의 잘못된 접근을 막는다.
  • 유지보수 용이성: 내부 구현을 변경하더라도 외부에서 미치는 영향을 최소화한다.

특징

  • 변수는 private 접근 제어자를 사용하여 외부에서 접근하지 못하도록 한다.
  • 메소드는 public 접근 제어자를 사용하여 필드에 접근하거나 수정할 수 있도록 한다.
class Person {
    private String name;  // private 필드 (정보 은닉)
    private int age;      // private 필드 (정보 은닉)

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

    // setter 메서드
    public void setName(String name) {
        if (name != null && !name.isEmpty()) {
            this.name = name;
        }
    }

    // getter 메서드
    public int getAge() {
        return age;
    }

    // setter 메서드
    public void setAge(int age) {
        if (age > 0) {
            this.age = age;
        }
    }
}

// 메인 클래스
public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("John");
        person.setAge(25);

        System.out.println("Name: " + person.getName());
        System.out.println("Age: " + person.getAge());
    }
}
  • name, ageprivate로 설정하였다.

  • 외부에서 name, age 값을 변경하거나 조회하고 싶으면 getter, setter 메소드를 이용해야 한다.

무슨 차이야?


이렇게 보면 두 개가 무슨 차이인가 싶을 수 있다.
나도 그렇다...

캡슐화는 객체의 메소드와 변수를 하나의 단위로 묶는 것
은닉화는 중요한 것(변수, 메소드)를 안으로 감추는 것

은닉화는 캡슐화를 실현하기 위해서 하는 중요한 방법 중 하나이다.
즉, 캡슐화를 하기 위해서는 은닉화를 무조건 해야 한다!

따라서 둘의 차이점이라고 하기 보다는 이 둘은 서로 밀접하게 연관되어 있는 개념으로 이해하면 좋다.

0개의 댓글