앞서 살펴본 것처럼, 클래스는 데이터와 그 데이터를 사용하는 메소드로 이루어져있다.
정보 은닉은 클래스 외부에서 클래스 내부의 데이터로의 직접 접근을 막는 것이다.
클래스의 메소드에서만 해당 클래스의 데이터에 접근할 수 있게 한다.
정보 은닉이 왜 필요할까?
정보 은닉을 통해서 코드의 안정성을 더해줄 수 있다.
만약 정보 은닉이 없다면, 클래스의 데이터에 직접 접근하여 논리적으로 올바르지 않은 값을 저장해도 이를 막을 수가 없다.
즉, 정보 은닉은 논리적 오류를 문법적 오류, 컴파일 에러로 이어지게끔 할 수 있다.
그렇다면 정보 은닉은 어떻게 할까?
class Circle {
private double rad = 0;
...
이처럼, 변수 선언시에 private 선언을 추가해주면 된다.
이제 외부에서 이 변수로의 접근은 불가해진다.
내부의 메소드에서만 접근이 가능해진다.
private 선언된 변수를 초기화하거나 가져올 수 있는 클래스의 메소드 "getter"와 "setter"를 만들어줄 수 있고, 이 메소드들은 내부와 외부의 통로 역할을 하게 된다.
public > protected > default > private
public : 모든 접근을 허용, Getter, Setter
protected : default보다 한 군데 더 접근 허용
default : private보다 한 군데 더 접근 허용
"선언되어 있지 않다"는 뜻
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보다 허용된 점이다.
패키지 선언을 하지 않으면 디폴트 패키지로 선언이 되고, 모두 같은 패키지로 묶이게 된다.
자바의 문법적인 부분이라기 보다는 소프트웨어 공학적인 측면에 해당된다.
캡슐화란 클래스에서 필요한 메소드와 클래스를 적절히 잘 담는 것을 말한다.
하나의 클래스에서 필요한 메소드를 다른 클래스에서 가지고 있거나 하면 코드의 복잡도는 매우 증가하게 되므로 하나의 클래스는 자신의 역할을 충분히 이행할 수 있도록 메소드 등을 가지고 있어야 한다.
클래스가 필요로 하는 정보들은 클래스들이 활용되는 환경 등에 따라 달라지기 때문에 캡슐화에는 정답이 존재하지 않다.
캡슐화를 통해 하나의 클래스 안에 필요한 모든 메소드들을 담는 것 보다는 여러 클래스를 만들고 하나의 클래스 안에서 그 클래스들을 가지는 관계가 더 일반적이다.