[Java] Chapter 09. 정보 은닉과 캡슐화

📌09-1. 정보 은닉

앞서 살펴본 것처럼, 클래스는 데이터와 그 데이터를 사용하는 메소드로 이루어져있다.

정보 은닉은 클래스 외부에서 클래스 내부의 데이터로의 직접 접근을 막는 것이다.
클래스의 메소드에서만 해당 클래스의 데이터에 접근할 수 있게 한다.

정보 은닉이 왜 필요할까?

정보 은닉을 통해서 코드의 안정성을 더해줄 수 있다.

만약 정보 은닉이 없다면, 클래스의 데이터에 직접 접근하여 논리적으로 올바르지 않은 값을 저장해도 이를 막을 수가 없다.

즉, 정보 은닉은 논리적 오류를 문법적 오류, 컴파일 에러로 이어지게끔 할 수 있다.

그렇다면 정보 은닉은 어떻게 할까?

class Circle {
    private double rad = 0;
    ...

이처럼, 변수 선언시에 private 선언을 추가해주면 된다.

이제 외부에서 이 변수로의 접근은 불가해진다.
내부의 메소드에서만 접근이 가능해진다.

private 선언된 변수를 초기화하거나 가져올 수 있는 클래스의 메소드 "getter"와 "setter"를 만들어줄 수 있고, 이 메소드들은 내부와 외부의 통로 역할을 하게 된다.


📌09-2. 접근 수준 지시자


public > protected > default > private


  1. public : 모든 접근을 허용, Getter, Setter

  2. protected : default보다 한 군데 더 접근 허용

  3. default : private보다 한 군데 더 접근 허용
    "선언되어 있지 않다"는 뜻

  4. private

  • 클래스 정의 대상 : public, default

  • 인스턴스 변수와 메소드 대상 : public, protected, default, private

✅클래스 정의 대상

  • public : 어디서든 인스턴스 생성이 가능하다.

  • default : 동일 패키지로 묶인 클래스 내에서만 인스턴스 생성을 허용한다.

자바 파일 내에 public class가 있는 경우, 해당 파일 이름은 그 클래스 이름으로 만들어야 한다.
public class를 외부에 노출시키기 위함이다.

이러한 이유로 1개의 소스 파일에는 1개의 public class만 존재해야 한다.

✅인스턴스 멤버 대상

class AAA {
    public int num1;
    protected int num2;
    private int num3;
    int num4;
    
    public void md1() {...}
    protected void md2() {...}
    private void md3() {...}
    void md4() {...}
  • public : 어디서든 접근 가능

  • default : 동일 패키지로 묶인 클래스 내에서만 접근 가능

위의 내용이 private보다 허용된 점이다.

패키지 선언을 하지 않으면 디폴트 패키지로 선언이 되고, 모두 같은 패키지로 묶이게 된다.

  • protected : 서로 다른 패키지에 존재하더라도 상속이 되어 있다면 접근 가능

📌09-3. 캡슐화

자바의 문법적인 부분이라기 보다는 소프트웨어 공학적인 측면에 해당된다.

캡슐화란 클래스에서 필요한 메소드와 클래스를 적절히 잘 담는 것을 말한다.

하나의 클래스에서 필요한 메소드를 다른 클래스에서 가지고 있거나 하면 코드의 복잡도는 매우 증가하게 되므로 하나의 클래스는 자신의 역할을 충분히 이행할 수 있도록 메소드 등을 가지고 있어야 한다.

클래스가 필요로 하는 정보들은 클래스들이 활용되는 환경 등에 따라 달라지기 때문에 캡슐화에는 정답이 존재하지 않다.

캡슐화를 통해 하나의 클래스 안에 필요한 모든 메소드들을 담는 것 보다는 여러 클래스를 만들고 하나의 클래스 안에서 그 클래스들을 가지는 관계가 더 일반적이다.


🔗강의 및 자료 출처

네이버 카페 || 윤성우의 프로그래밍 스터디그룹

좋은 웹페이지 즐겨찾기