╱╱╭╮╱╱╱╱╱╱╭━━━╮╱╱╱╭╮╱╭╮╱╱╱╱╱╱ ╱╱┃┃╱╱╱╱╱╱┃╭━╮┃╱╱╱┃┃╱┃┃╱╱╱╱╱╱ ╱╱┃┣━━┳━━╮┃┃╱┃┣━╮╱┃╰━╯┣━━┳━╮╱ ╭╮┃┃╭╮┃┃━┫┃╰━╯┃╭╮╮┃╭━╮┃╭╮┃╭╮╮ ┃╰╯┃╭╮┃┃━┫┃╭━╮┃┃┃┃┃┃╱┃┃╭╮┃┃┃┃ ╰━━┻╯╰┻━━╯╰╯╱╰┻╯╰╯╰╯╱╰┻╯╰┻╯╰╯

Java/Java 기초

[Java] 객체지향 언어 특징(캡슐화 Encapsulation)

재안안 2022. 4. 15. 15:00

클래스를 이해하는데 있어서 알아야하는 중요한 개념이 있다.

객체지향 언어의 특징이다.

객체지향 언어의 특징은 아래와 같다.

 

  • 추상화
  • 상속성
  • 다형성
  • 캡슐화

 

이번에는 캡슐화에 대해서 알아볼건데 캡슐화는 다른 특징들과 딱히 연관되는 개념은 아니다.

추상화-상속성-다형성이 자연스럽게 연결 된다면 캡슐화는 조금 따로 노는 느낌이다.

 

우선 캡슐화(Encapsulation)

구현내용(필드, 메소드)에 대한 외부 접근을 제한하는 것을 말한다.

 

아래와 같이 생각해보길 바란다.

 

 우리는 캡슐(알약) 내부에 무엇이 들어있는지 알 수 없다.

그런데 분명 캡슐(알약) 안에는 여러가지 성분들이 들어있는거 알고

캡슐의 용도 또한 알고 있다. 약먹으면 몸이 나아지는 것.

그런데 캡슐에는 무엇이 들어있는지 우리는 모른다.

알약 껍질에 의해 물리적으로 접근할 수 없고 물이랑 같이 삼키면 끝이다.

 

여기서 여러가지 성분들이 하나의 단위로 묶여서 알약을 구성하고

알약 껍질에 의해 외부 접근이 제한된다.

그런데 분명 캡슐의 용도는 알고 있다. 용도만 알아도 충분히 사용이 가능하다.

 

자바의 캡슐화는

알약 껍질처럼 외부 접근에 대한 차단이고 차단의 방법은 접근 제어자(Accress Modifier)를사용한다.

 

이제 캡슐화의 장점을 설명하겠다.

 

장점은 정보인닉이다.

 

객체를 알약처럼 생각해보자.

객체가 무엇인지 잘 모르는 상태라도 사용 방법결과를 아니까 계속 사용하는 것이다.

문제는 없다.

이는 자바에서 메인 클래스가 다른 클래스를 사용할 때와 같은 방법이다.

 

추가적으로 외부의 잘못된 접근을 사전에 차단함으로서 내부 객체를 더 안전하게 만든다.

 

접근 제한자를 통해 외부의 잘못된 접근을 정의한다.

 

public 접근 제한x
protected 동일 패키지 + 상속관계에 있는 클래스만 접근 가능
defualt 동일 패키지 내에서만 접근 가능
private 동일 클래스 내에서만 접근 가능

 

접근 제어자 생략시 default로 설정된다.

 

아래의 예제를 통해 설명하겠다.

 

접근 제어자

중요한 부분만 설명하겠다.

 

private를 통해 main 클래스에서 Predator의 필드에 접근하지 못하게 했다.

 

그런데 결국 setAge와 getAge를 통해 age에 대한 값에 접근을 할 수 있게되었다.

 

결과적으로 setter와 getter를 함께 쓰면 private 변수에 대한 값에 접근할 수 있다.

private의 실용성이 의심되겠지만 아래에서 설명하겠다.

 

만약 한쪽이라도 정의되지 않았다면?

 

다른 클래스 또는 패키지에서 private 변수에 대한 정상적인 접근을 할 수 없다.

setter가 없으면 변수 값을 변경하지 못하고

getter가 없으면 변수 참조조차 불가능하다.

 

또 다른 예시를 들어보겠다.

 

만약 메소드가 private을 달고 생성된다면?

이 메소드는 정말로 동일 클래스내에서만 접근이 가능한 것이다.

 

이렇게 private을 통하여 결국 보안성이 올라가 클래스 내부의 안정성이 올라간다.