brunch

You can make anything
by writing

C.S.Lewis

import 문과 캡슐화

* 이 내용은 철저히 초심자를 위해 알기 쉽게 설명하는 것을 목적으로 하고 있습니다.

* 더 정확하고 자세한 개념은 다른 고수님들의 글들을 참고하시길 바랍니다.

* 그리고 이 글에서는 코드 최소한으로 다루고 있습니다.


클래스는 특정한 변수와 메서드 등을 담고 있는 분류라고 했습니다.

그리고 그런 클래스를 담고 있는 폴더의 역할을 하는 것이 패키지라고 했고요.

실질적으로 클래스는  java 파일로 저장이 되고, 이 java 파일을 저장하고 있는 폴더가 바로 패키지입니다.


우리는 윈도에서 탐색기를 주로 사용하다 보니 자바의 패키지 시스템보다는 파일 시스템에 더 익숙하죠?

그래서 파일 시스템을 기준으로 재미있는 이야기를 해 볼까 합니다.


일반적으로는 다른 파일이나 폴더에 있는 내용을 현재 파일로 불러올 수 없습니다.


예를 들면 현재 메모장에서 무언가를 작성하다가 다른 텍스트 파일의 내용을 불러올 수 없는 것처럼 말이죠.

당연히 다른 폴더에 저장된 텍스트 파일의 내용도 불러올 수 없습니다.

서로 다른 파일끼리 소통이 이루어질 수 없다는 건 어찌 보면 당연한 상식 인지도 모르겠군요.


이야기를 이렇게 길게 하느냐!

바로 자바에서는 가능하다는 점을 자랑하기 위해서입니다.

자바는 클래스와 패키지를 파일과 폴더의 개념이 아닌 분류의 개념으로 보기 때문에 분류와 분류의 경계는 넘기 힘들지 않다는 것이죠.


우리가 앞에서 배운 객체화는 다른 클래스(파일)의 내용을 복사해 와서 마음대로 활용할 수 있었죠?

이렇게 자바에서는 클래스(파일) 간의 교류는 그냥 할 수 있습니다.

하지만 서로 다른 패키지(폴더)에 있는 클래스끼리의 교류에는 몇 가지 조건이 필요합니다.


첫 번째, import 문이 필요 합니다.

위 그림에서 Main 클래스에서 Puppy 클래스의 무언가를 사용하고 싶다면 import 문 없이도 불러다 사용할 수 있지만, People 클래스에서는 import 문을 사용해야 합니다.


두 번째, 다른 패키지에서 사용할 클래스나 멤버는 public 접근 제한 자가 필요 합니다.

위 그림에서 보면 Puppy라는 클래스, 생성자, 그리고 goal이라는 멤버 필드(변수) 모두 public 이 있습니다.

그러므로 다른 패키지의 클래스에서 불러서 사용할 수 있습니다.

하지만 name 은 그럴 수가 없습니다. 만약 name 역시도 다른 패키지의 클래스에서 사용할 수 있게 하려면 public 접근제한자를 붙여 주면 됩니다.


접근 제한자

접근 제한자? 말 그대로 접근을 제한하는 역할을 수행합니다.

반대로 말하자면 어디까지 접근할 수 있게 해 줄 것인지 결정해 주는 녀석입니다.

일단 protected라는 녀석은 상속을 배우기 전이니 머릿속에 잠시 지워두겠습니다.

private 은 클래스 밖을 벗어나지 못하고 default는 패키지를 벗어나지 못하며 public 은 패키지를 마음대로 넘나들 수 있는 징표라고 생각하면 좋을 것 같습니다.


Puppy 클래스에서 세 멤버 필드를 보겠습니다.

age는 private 이므로 Puppy 클래스 밖에서는 사용할 수 없습니다.

goal 은 default 이므로 같은 패키지 안에 있으면 다른 클래스에서도 사용할 수 있습니다.

default라는 키워드가 없다고요? 생략이 가능하며 보통은 생략하고 사용합니다.

name 은 public 이므로 다른 패키지의 클래스에서도 얼마든지 사용이 가능합니다.


이렇게 특정 멤버의 접근을 제한하는 것을 OOP의 4대 특성 중 하나인 캡슐화(Encapsulation)라고 부릅니다.

소스를 캡슐 안에 넣고 보호하듯이 관리한다는 뜻입니다.


캡슐화

아니, OOP의 특성은 다른 소스를 잘 가져다 쓰게 하기 위함인데, 사용하는 영역을 제한하다니요?

뭔가 모순적이지 않나요?

캡슐화는 소스 코드의 보호가 목적이기에 그렇게 생각할 수도 있겠습니다.

하지만 이 캡슐화가 적용된 실생활 예시를 본다면 아마 여러분의 생각이 바뀔지도 모르겠네요.


PC의 예를 들어보겠습니다.

우리는 게임이나 기타 유용한 작업을 위해 PC를 사용하고 있습니다.


하지만 PC는 우리가 사용 시에 필요한 전원 버튼이나 USB 포트, 모니터 단자 등은 외부 사용자가 이용하기 쉽게 공개해 놓았습니다. public이라고 볼 수 있죠?

하지만 CPU 나 메인보드, 그래픽 카드 등은 외부에서 쉽사리 접근할 수 없도록  케이스로 막아 두었습니다. 이건 private이라고 볼 수도 있겠네요.


중요한 것은 왜냐는 것입니다.

만약 우리가 PC 사용 중에 실수로 CPU 나 그래픽 카드를 건드리거나 이물질 같은 것들을 흘린다면 어떻게 될까요? 상상만 해도 끔찍하죠?

그런 사용자들의 실수로 인해 PC 가 망가지지 않도록 케이스를 통해 캡슐화해 주는 것입니다.

물론 사용자들에게 필요한 부분은 외부로 노출시켜 주는 것이고요.


캡슐화는 소스를 사용하는 사용자의 실수가 가져다 쓰는 소스의 주요 부분이 망가지는 것을 방지하기 위해 걸어주는 케이스 같은 역할이라고 생각할 수 있습니다.

 


OOP 4대 특성의 첫 번째 특성인 캡슐화에 대해 배워봤습니다. 어때요? 어렵지 않죠?

앞으로 배우게 될 나머지 특성들도 이렇게 실생활로 대입해 보자면 전혀 어려운 개념들이 아닙니다.

나머지 개념들도 최대한 쉽게 계속해서 알아보도록 하겠습니다.

매거진의 이전글 final 키워드
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari