클래스를 이해하는데 있어서 알아야하는 중요한 개념이 있다.
객체지향 언어의 특징이다.
객체지향 언어의 특징은 아래와 같다.
- 추상화
- 상속성
- 다형성
- 캡슐화
이번에는 캡슐화에 대해서 알아볼건데 캡슐화는 다른 특징들과 딱히 연관되는 개념은 아니다.
추상화-상속성-다형성이 자연스럽게 연결 된다면 캡슐화는 조금 따로 노는 느낌이다.
우선 캡슐화(Encapsulation)란
구현내용(필드, 메소드)에 대한 외부 접근을 제한하는 것을 말한다.
아래와 같이 생각해보길 바란다.
우리는 캡슐(알약) 내부에 무엇이 들어있는지 알 수 없다.
그런데 분명 캡슐(알약) 안에는 여러가지 성분들이 들어있는거 알고
캡슐의 용도 또한 알고 있다. 약먹으면 몸이 나아지는 것.
그런데 캡슐에는 무엇이 들어있는지 우리는 모른다.
알약 껍질에 의해 물리적으로 접근할 수 없고 물이랑 같이 삼키면 끝이다.
여기서 여러가지 성분들이 하나의 단위로 묶여서 알약을 구성하고
알약 껍질에 의해 외부 접근이 제한된다.
그런데 분명 캡슐의 용도는 알고 있다. 용도만 알아도 충분히 사용이 가능하다.
자바의 캡슐화는
알약 껍질처럼 외부 접근에 대한 차단이고 차단의 방법은 접근 제어자(Accress Modifier)를사용한다.
이제 캡슐화의 장점을 설명하겠다.
장점은 정보인닉이다.
객체를 알약처럼 생각해보자.
객체가 무엇인지 잘 모르는 상태라도 사용 방법과 결과를 아니까 계속 사용하는 것이다.
문제는 없다.
이는 자바에서 메인 클래스가 다른 클래스를 사용할 때와 같은 방법이다.
추가적으로 외부의 잘못된 접근을 사전에 차단함으로서 내부 객체를 더 안전하게 만든다.
접근 제한자를 통해 외부의 잘못된 접근을 정의한다.
public | 접근 제한x |
protected | 동일 패키지 + 상속관계에 있는 클래스만 접근 가능 |
defualt | 동일 패키지 내에서만 접근 가능 |
private | 동일 클래스 내에서만 접근 가능 |
접근 제어자 생략시 default로 설정된다.
아래의 예제를 통해 설명하겠다.
중요한 부분만 설명하겠다.
private를 통해 main 클래스에서 Predator의 필드에 접근하지 못하게 했다.
그런데 결국 setAge와 getAge를 통해 age에 대한 값에 접근을 할 수 있게되었다.
결과적으로 setter와 getter를 함께 쓰면 private 변수에 대한 값에 접근할 수 있다.
private의 실용성이 의심되겠지만 아래에서 설명하겠다.
만약 한쪽이라도 정의되지 않았다면?
다른 클래스 또는 패키지에서 private 변수에 대한 정상적인 접근을 할 수 없다.
setter가 없으면 변수 값을 변경하지 못하고
getter가 없으면 변수 참조조차 불가능하다.
또 다른 예시를 들어보겠다.
만약 메소드가 private을 달고 생성된다면?
이 메소드는 정말로 동일 클래스내에서만 접근이 가능한 것이다.
이렇게 private을 통하여 결국 보안성이 올라가 클래스 내부의 안정성이 올라간다.
'Java > Java 기초' 카테고리의 다른 글
[Java] 인터페이스 (interface) (0) | 2022.04.16 |
---|---|
[Java] 추상메소드, 추상 클래스 (Abstract Method, Abstract Class) (0) | 2022.04.15 |
[Java] 객체지향 언어 특징(다향성 Polymorphism) (0) | 2022.04.15 |
[Java] 객체지향 언어 특징(상속성 Inheritance) (0) | 2022.04.14 |
[Java] 객체지향 언어 특징 (추상화 Abstraction) (0) | 2022.04.13 |