Study/Java

캡슐화(Encapsulation)

sowon02 2025. 7. 6. 21:43

1. 자바는 객체지향 프로그래밍(OOP) 언어

자바(Java)는 객체지향 프로그래밍(OOP, Object-Oriented Programming) 언어로, 프로그램을 데이터와 기능(메서드)을 묶어 관리하고, 유지보수와 확장성을 높이기 위해 만들어졌다.

OOP의 핵심 4가지 개념은:

  • 캡슐화(Encapsulation)
  • 상속(Inheritance)
  • 다형성(Polymorphism)
  • 추상화(Abstraction)

이번 글에서는 이 중 캡슐화(Encapsulation)를 정리함


2. 캡슐화(Encapsulation)란? 

캡슐화

캡슐화는 데이터(속성)과 그 데이터를 처리하는 메서드(기능)를 하나로 묶고 외부로부터 내부 상태를 숨기는 것.

즉, 데이터와 메서드를 하나의 '캡슐(클래스)'에 담아 필요하지 않은 정보는 외부에서 접근하지 못하게 제한하여, 잘못된 접근이나 변경으로부터 객체를 보호하는 개념 

 


- vs 데이터 은닉(Data Hiding)

많이 헷갈리는 부분인데, 데이터 은닉은 캡슐화의 한 방법, 수단임

 

  • 데이터 은닉: 객체 내부 데이터를 외부에서 직접 접근하지 못하도록 숨기는 것.
  • 캡슐화: 데이터를 메서드와 함께 클래스 안에 묶어 관리하고, 내부 구현을 숨기며 외부에는 필요한 기능만 제공하는 것.

"캡슐화를 실현하기 위한 방법으로 데이터 은닉을 사용한다"

라고 이해하면 된다

 

 

- 왜 캡슐화를 사용할까 ? 

 

  • 데이터 보호: 잘못된 값으로 변경되는 것을 막기 위해
  • 코드 변경 용이성: 내부 구현을 감추고 인터페이스만 공개해, 내부 구조를 바꿔도 외부에 영향이 적음
  • 유지보수성 향상: 객체의 책임이 명확해짐
  • 유효성 검증 기능 : 값을 설정할 때 조건을 걸어 잘못된 값이 저장되지 않도록 방지할 수 있

자바에서 캡슐화 구현 방법

1. 멤버 변수는 private로 선언 : 외부에서 직접 접근 못하도록 숨기기 위함

2. 외부 접근은 public 메서드로 제어 : 주로 getter와 setter 메서드를 통해 값을 읽거나 씀

 

예제코드 ) 자바 캡슐화

다음은 Person 클래스를 통해 캡슐화를 적용한 자바 예제이다. 


public class Person{
    private String name; // 1. 멤버 변수는 private로 선언
    private int age;
 
    public String getName() { // 2. 데이터 읽기 : name 값을 읽기 위한 getter
        return name;
    }

    public void setName(String name){ // 2. 데이터 쓰기 : name 값을 쓰기 위한 setter
        this.name = name;
    }

    public int getAge(){
        return age;
    }

   
    public void setAge(int age){
        if(age>0){
            this.age = age;
        }
    }
}

 

이렇게 하면 외부에서 person.name = "sowon"처럼 직접 접근하는게 아니라 person.setName("sowon")으로만 값을 바꿀 수 있고, setAge처럼 잘못된 값이 들어오는 것도 방어할 수 있음 !! 


정리

1. 캡슐화는 객체지향 프로그래밍의 핵심으로, 데이터와 메서드를 하나로 묶고 외부에 필요한 기능만 제공하며 나머지는 숨기는 것
2. 데이터 은닉은 캡슐화를 실현하기 위한 방법으로,

    멤버 변수를 private으로 숨기고 getter, setter로 접근을 제어하여 데이터를 보호

3. 캡슐화를 통해 코드의 안정성, 유지보수성, 데이터 보호, 유효성 검증 등을 향상시킬 수 있다

 

끝 ㅎㅎ

 

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

정적 멤버와 static  (0) 2025.07.08
인스턴스 멤버와 this  (0) 2025.07.08
접근제어자  (0) 2025.07.08
상속(Inheritance)와 다형성(Polymorphism)  (0) 2025.07.07
JAVA 기본 개념(배열, 연산자, 조건문, 반복문)  (0) 2025.07.06