코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java Encapsulation

자바 캡슐화 (Java Encapsulation): 개념 및 사용법

  • *캡슐화(Encapsulation)**는 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나로, 객체의 데이터를 보호하고, 데이터의 직접적인 접근을 제한하는 방법을 제공합니다. 이를 통해 객체의 내부 구현을 감추고, 외부에서는 제공된 메서드를 통해서만 객체와 상호작용할 수 있게 만듭니다. 캡슐화는 코드의 유지보수성보안성을 높이며, 객체의 상태를 일관되게 관리할 수 있는 이점을 제공합니다.

캡슐화란?

캡슐화는 **데이터(필드)**와 **메서드(동작)**를 하나의 단위로 묶고, 데이터에 대한 접근을 제한하는 방식입니다. 이를 통해 객체의 내부 데이터를 보호하고, 잘못된 접근이나 변경을 방지할 수 있습니다.

자바에서 캡슐화를 구현하는 주요 방법은 다음과 같습니다:

  1. 필드를 private으로 선언하여 외부에서 직접 접근하지 못하게 합니다.
  2. *공개 메서드(public)**를 통해 데이터에 접근하거나 변경할 수 있는 인터페이스(게터와 세터)를 제공합니다.

캡슐화의 목적

  • 데이터 보호: 객체의 내부 데이터를 직접 수정하는 것을 방지하여 무결성을 유지합니다.
  • 유지보수 용이성: 객체의 내부 구현을 숨기고, 외부와의 상호작용을 메서드를 통해서만 가능하게 하여, 내부 코드를 수정할 때 외부에 미치는 영향을 최소화합니다.
  • 코드 재사용성: 데이터와 관련된 메서드를 한 클래스에 묶어 필요할 때 재사용할 수 있습니다.

캡슐화의 구현 방법

  1. 필드를 private으로 설정합니다.
  2. gettersetter 메서드를 통해 간접적으로 필드에 접근하고 수정할 수 있게 합니다.

캡슐화 예제

class Person {
    // 필드를 private으로 설정하여 외부에서 직접 접근하지 못하게 함
    private String name;
    private int age;

    // Getter 메서드: private 필드에 접근하기 위해 제공
    public String getName() {
        return name;
    }

    // Setter 메서드: private 필드 값을 변경하기 위해 제공
    public void setName(String name) {
        this.name = name;
    }

    // Getter 메서드: 나이에 대한 접근 메서드
    public int getAge() {
        return age;
    }

    // Setter 메서드: 나이에 대한 유효성 검사를 추가
    public void setAge(int age) {
        if (age > 0) {  // 유효성 검사
            this.age = age;
        } else {
            System.out.println("Age must be greater than 0");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();

        // Setter 메서드를 사용하여 값을 설정
        person.setName("John");
        person.setAge(25);

        // Getter 메서드를 사용하여 값을 가져옴
        System.out.println("Name: " + person.getName()); // 출력: Name: John
        System.out.println("Age: " + person.getAge());   // 출력: Age: 25

        // 유효하지 않은 나이 설정
        person.setAge(-5);  // 출력: Age must be greater than 0
    }
}

결과:

Name: John
Age: 25
Age must be greater than 0

위 예제에서 Person 클래스는 nameage 필드를 private으로 선언하여 외부에서 직접 접근할 수 없도록 하였습니다. 대신 getName(), setName(), getAge(), setAge() 메서드를 통해 필드에 간접적으로 접근하고 수정할 수 있습니다. setAge() 메서드에서는 나이가 0보다 큰지 확인하는 유효성 검사를 추가하여 잘못된 값을 방지할 수 있습니다.

캡슐화의 장점

1. 데이터 보호 (Data Protection)

캡슐화는 객체의 필드를 private으로 선언하여 외부에서 직접 접근할 수 없게 보호합니다. 이로써 데이터의 무결성을 유지하고, 잘못된 데이터를 방지할 수 있습니다.

person.age = -10; // 캡슐화가 없다면 이렇게 잘못된 값이 설정될 수 있음

위와 같은 잘못된 데이터 수정은 캡슐화를 통해 막을 수 있습니다.

2. 유효성 검사 (Validation)

캡슐화를 사용하면 필드에 값을 설정할 때 유효성 검사를 할 수 있습니다. 이는 객체가 항상 유효한 상태를 유지하도록 보장합니다.

public void setAge(int age) {
    if (age > 0) {
        this.age = age;
    } else {
        System.out.println("Age must be greater than 0");
    }
}

3. 유지보수성 향상 (Improved Maintainability)

객체의 내부 구현이 변경되더라도, 외부에서는 메서드만을 통해 접근하기 때문에 외부 코드에 영향을 미치지 않습니다. 예를 들어, 내부적으로 데이터를 다른 방식으로 저장하거나 처리하더라도 외부에 제공하는 메서드만 동일하다면 외부 코드를 수정할 필요가 없습니다.

// 나중에 나이 저장 방식을 변경하더라도, setAge(), getAge() 메서드는 동일하게 유지 가능

4. 코드 재사용성 (Code Reusability)

데이터와 이를 조작하는 메서드를 하나의 클래스로 묶으면 코드의 재사용성이 높아집니다. 이를 통해 여러 객체에서 동일한 메서드와 필드를 공유할 수 있습니다.

캡슐화와 게터/세터 메서드

게터와 세터는 캡슐화된 데이터를 접근하고 수정하는 데 필요한 메서드입니다. 이러한 메서드를 제공함으로써 클래스 외부에서 객체의 데이터를 안전하게 접근할 수 있습니다.

  • Getter 메서드: 필드 값을 반환하는 역할을 합니다.
  • Setter 메서드: 필드 값을 설정하는 역할을 하며, 유효성 검사를 포함할 수 있습니다.

게터와 세터의 예

class Car {
    private String model;
    private int year;

    // Getter 메서드
    public String getModel() {
        return model;
    }

    // Setter 메서드
    public void setModel(String model) {
        this.model = model;
    }

    // Getter 메서드
    public int getYear() {
        return year;
    }

    // Setter 메서드 (유효성 검사 포함)
    public void setYear(int year) {
        if (year > 1885) {  // 자동차가 발명된 이후의 연도만 허용
            this.year = year;
        } else {
            System.out.println("Year must be greater than 1885");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Car car = new Car();

        // Setter 메서드를 사용하여 값 설정
        car.setModel("Tesla Model S");
        car.setYear(2022);

        // Getter 메서드를 사용하여 값 가져오기
        System.out.println("Model: " + car.getModel()); // 출력: Model: Tesla Model S
        System.out.println("Year: " + car.getYear());   // 출력: Year: 2022
    }
}

요약

캡슐화는 자바 객체 지향 프로그래밍(OOP)의 중요한 개념으로, 객체의 데이터를 보호하고, 객체가 제공하는 메서드를 통해서만 데이터를 조작할 수 있도록 제한합니다. 캡슐화는 객체의 내부 구현을 감추고, 외부에서는 제공된 인터페이스만을 통해 객체와 상호작용할 수 있게 하여 코드의 안전성과 유지보수성을 높이는 데 기여합니다.

캡슐화의 핵심 개념:

  1. 데이터 보호: private 필드를 사용하여 외부에서 직접 접근을 차단.
  2. 간접 접근: 게터(Getter)와 세터(Setter) 메서드를 통해 안전하게 데이터에 접근 및 수정.
  3. 유효성 검사: 값을 설정할 때 유효성을 검사하여 잘못된 값 설정 방지.
  4. 유지보수성 향상: 내부 구현이 변경되어도 외부에 영향을 주지 않음.

캡슐화를 잘 활용하면, 코드의 가독성, 유지보수성, 재사용성이 향상되고, 객체가 더 안전하게 관리됩니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com