캡슐화 (Encapsulation)
- 연관된 목적을 가지는 변수와 함수를 하나의 클래스로 묶어 외부에서 쉽게 접근하지 못하도록 은닉하는 것이다.
캡슐화는 중요한 데이터를 쉽게 바꾸지 못하도록 할 때 사용한다.
- 캡슐화를 하는 가장 큰 이유는 정보 은닉에 있다. 캡슐화를 통해 외부에서 내부의 정보에 접근하거나 변경할 수 없게 직접적인 접근을 막고 객체가 제공하는 필드와 메소드를 통해서만 접근이 가능하다.
- 이렇게 접근을 제한함으로써 유지보수나 확장 시 오류의 범위를 최소화할 수 있고
객체 내의 정보 손상과 오용을 방지하고 데이터가 변경되어도 다른 객체에 영향을 주지 않아 독립성이 좋다.
- 캡슐화는 접근제어자를 통해 이루어진다. 접근제어자는 멤버변수 앞에 붙으며 로컬변수 앞에는 붙을 수 없다.
- private ( 공개X, 상속X )
- protected( 공개X, 상속O )
- public ( 공개O, 상속O )
class A{
private int drug = 0;
protected int vijagum = 1;
public int budongsan = 2;
void picnic(){
System.out.println(this.drug); //ok
System.out.println(this.vijagum); //ok
System.out.println(this.budongsan); //ok
//같은 클래스에 존재하므로 접근지정자 상관없이 얼마든지 접근 가능
}
}
class B extends A{ // 상속된 경우
void print(){
// System.out.println( this.drug ); << 에러 ( private 는 상속 x )
System.out.println(this.vijagum); //ok
System.out.println(this.budongsan); //ok
}
}
public class Main{
public static void main(String[] args){
// private int i = 0; << 에러
A t = new A();
System.out.println(t.budongsan);
System.out.println(t.vijagum); // C++ 등에서는 접근안됨, 하지만 java에서는 package 개념이
// 있어서 가능할 수도 있음.
// 같은 패키지에 속한 클래스는 protected 멤버에 접근가능.
// 다른 패키지에 속한 클래스는 protected 멤버에 접근 불가능.
// System.out.println(t.drug); : 외부에서 포인터로 직접 접근x
}
}
- private 로 선언된 변수에 접근하거나 변수의 값을 변경하려면 get, set 메서드를 클래스 내에 선언해야한다.