본문 바로가기

프로그래밍/기타

# 플밍지기와 함께하는 객체 지향 # - 2

# 플밍지기와 함께하는 객체 지향 #


 2. 캡슐화


  자~ 오래~가.. 아니고... 짧은 시간만.. 많이 기다리시지....도 않으셨겟쬬? -.-;

앤 뭔데.. 이런 시덥지도 않은 글을 올리는 걸까? 의구심이 드시는 분들.. -.-; 걍.. 그러려니..

이해해주세요.. 아셨죠? ^^


  어쨌든.. 이번에는 위에 제목에도 있구. 지난번 강의에도 말했듯이..

캡슐화에 대해서 할 차례입니다.. 참 지난번에 머했을까요? 네..맞습니다..

객체지향 방법론에 대해서.. 했던 기억이... 나죠? (안나면 제일 아래에 가서.. 아랫글 클릭!)


  자 그럼 캡슐화는 멀까요? 지난번에 살짜쿵 언급을 했었는데..기억나세요?

객체지향 방법론에서 문제해결 방법에서 말이예여~ 기억 안 나실까봐.. 다시 함 보죠~

   

1. 추상화(abstraction) :  큰 문제에서중요하지 않은 것을 제외하고 중요하고 필수적인것만 다룸

2. 캡슐화(encapsulation) : 세부적인 구현 방법을 숨시고 간단한 인터페이스만 드러냄

3. 모듈성(modularity) : 작은 단위로 개발 -> 개체 독립성

4. 계층성(hierarchy) : 객체로 나눌 때, 공통된 성향을 가진 것을 상위,

                                구체적인 것이 하위로 계층을 이루게 됨.


이 4가지입니다.


  자. 이제 기억이 나시는지.. 캡슐화.. 영어로는 인캡슐레이션이라고 부른다지요. ^^;

세부적인 구현 방법을 숨기고.. 간단한 인터페이스만을 드러낸다는 것이라네요..


  자.. 그럼 이제.. 저게 무슨 말인지... 하나씩 살펴볼까요? ^^

여러분 아마도.. 한 번이라도 이 쪽 부분을 보셨다면.. 이런 말도 들어보셨겠죠?

은닉... 그리고.. 머.. 드러내지 않는 것이 미덕이라나. 어쩐다나. (맞는지 모르겠군요.. )

뭐.. 이런 것들을 하기 위해서. 캡슐화한다고 하나? 어. 말이 제꾸.. 이상하네요.. -.-;


  아구.. 지난번에.. 이어서 핸폰이란 넘을 가지고 함 알아보기로 해요..

핸폰에는 여러 가지 것들이 있죠.. 뭐.. 삼송전자꺼, 알쥐전자, 모러룰라, 스코이 etc...

이런 것들이 있답니다... 처음에 가령.. 삼송전자폰의 애뉘콜을 썼습니다..아~

잘 쓰다가.. 잃어 버렸네요.. 그래서 이번엔.. 모러룰라의 스타땍을 샀습니다.. 아..

열쉼히.. 잘 썼습니다. 근데 번호 이동성 하면서.. 폰을 꽁짜로 준다고 현혹되어서..

알쥐전자에서 나온 폰으로 바꿔버렸습니다..

그리고... 이번엔. 스코이~ 폰까지.. 아~ 열심히 핸폰을 사대는군요..

  쩝.. 그런데.. 핸펀을 살 때마다 이렇게 회사가 다 달랐는데.. 잘 쓰네요.. 별 어려움 없이요..

더욱이 이동통신회사 까지 바뀌었음에도 불구하고.. 아무생각이.. 똑같이 잘 썼습니다..

얼티팩두 써보구,  메이트도 쓰구요....  왜냐면 사용법이 다르지가 않았거덩요..

  자. 이번엔.. 근데 제가 핸펀공장에 취직을 했씁니다..  아.. 삼송전자에서 열쉼히 핸폰을

만들었죠.. 그리고 알쥐에 스카웃되어서.. 알쥐에서도 만들었습니다.. 아니.. 근데 이게 웬일

삼송때처럼 만들라고 봤더뉘만.. 안에 들어가는 것들이 다르네요.. -.-;; 전혀 모르겠습니다.

그래서 삼송에서 끝발 날렸떤 실력이.. 다 죽어서. 첨부터 열심히 배웠지요.. 게다가 삼송에서

는 아스케이텔러껌쪽 핸폰이었는데.. 이번엔 카티에프네여.. -.-;; 핸펀이.. 전혀 다르네요..

ㅎㅎ 다시 만드는 법을 배워야했음돠. 참.. 이상하네요.. 사용할 땐 몰랐는데...

핸폰은 사용할 때랑 만들때랑.. 그 때 그 때 달라요~ .. 어.. 희안하네....


  자.. 무슨 쓰잘떼기 없는 얘길 자꾸하냐구요? 방금 말씀 드린 것이.. 이번 시간에 말씀드리려고

했던.. 내용입니다. 바로 캡슐화죵.. 위에서 말했듯이. 우리가 일반적으로 핸폰을 쓸때..

이곳 저곳 이동 통신을 사용할 때 별다른 어려움없이 바뀌어도 쓸수가 있습니다..

왜냐면 우리가 사용해야 하는 방법.. 즉사용법이.. 비슷하기 때문이죠. ^^; 다쉬 말해서..

인터페이스가.동일합니다.. 하지만.. 내부적인 사정을 들어가보면.. 각 핸폰마다. 그리고

사용되는.. 통신사에 따라서. 내부적인 기계적인 부분들은 다릅니다. 하지만.. 우리는

그 딴 것들은 몰라도.. 사용할 수가 있는거죠.. 바로. 핸폰 내부적으로 들어가는 것들은..

동일한 껍데기로 씌워서.. 사용자에게 제공하는거죠.. 다쉬 말해서...

어려운 부분, 알 필요가 없는 부분, 건드려서는 안되는 부분등을... 캡슐에다가 따~악..

한번 싸줘서.. 우리에게는 필요한 부분.. 그리고 사용하기 쉽게.. 인터페이스를 제공하는 것입니다.

이걸 캡슐화라고 한답니다...


  여기서.. 우리가 알 필요가 없는 부분... 혹은 건드려서는 안되는 부분을 숨기는 것을..

은닉이라고 부른다지요..  왜냐면 잘못 건드리면.. 큰일나거든요..


  자.. 그럼 이제.. 어뜨케 사용되는지 몇가지만 살짜쿵 알아보지요..

우리가 변수나.. 혹은 뭐.. 이것저것을 선언할 때..접근지정자라는 것을 사용합니다..

그게 머냐구요?... 음 public, private, protected 이런거 있잖아요. ^^ 뭔지 알겠죠?

그런걸 접근 지정자라고 부른답니다.. 그걸 이용해서.. 캡슐화를 구현? 할 수가 있는 것이지요.

  사용해보셔서 아시겠지만... 접근지정자라는 넘은.. 그 접근지정자를 이용해서. 해당 멤버나

메서드등을 어디까지 노출시킬 것인지를 정하게 되는 것이죠..  아까 말한.. 숨겨야할 부분들은..

private나.. protected 등을 이용해서... 숨기구요...  드러내도 좋은 부분등은.. public ,protected등을

이용해서... 적절하게 드러내지요. ^^ 해당 접근지정자가 어디까지 접근 가능하게 하는지는.

숙제입니다... ^^;; 직접 찾아보세요~ ^^ 참고로 그것 이외에. default라는것도 있씁니다..

암컷도 안쓰면.. default로 잡히게 되죠. ^^  

  그리고 참고로 말씀드리면.. 음 멤버변수는 private 인 경우가 많구요... 메서드는..

public인 경우가 많답니다. 물론 클래스 내부에서만 쓰이면 메서드도.. private쪽으로

쓰이겠지만요.. private로 선언된.. 멤버변수를 public인 메서드로 접근하는거죠..

대표적인 것이.. 이런 것이 있겠죠..

  

  private ID;

  public int getID() {   return ID; }

  public void setID(int id) { ID = id; }

 

참고로 이러한 메서드를.. getter , setter이라고 부른다니다... 그래서. 메서드 이름이 앞에

get, set이 붙는거지요... (뭐.. 실제 이름은 accessor(액세서:get), mutator(뮤테이터:set))

  이렇게 이용함으로써, 캡슐화가 가져오는 장점을 얻을 수 있는 것이지요..

  접근해서는 안되는 멤버에 함부로 접근하는 것을 막아주고, 실제적인 몰라도 되는.. 부분들을

안으로 숨겨주고, 우리에게는 필요한 부분만 드러내는 것이지요..(getID, setID처럼..)

  그럼 멤버변수에 함부로 접근하는 것을 막아주는 것이 무슨 도움을 줄까요? 가령.. 아래와 같은

메서드를 살펴봅시다..


  private int phoneNum1;

  public boolean setPN1(int pn)

{

    if(pn == 010 || pn == 011 || pn == 016 || pn == 017 || pn == 018 || pn == 019)

    {

           phoneNum1 = pn;

           return true;

     }

    else

    { 

          System.out.println("문자를 보낼 알맞은 핸드폰 번호가 아닙니다.");

          return false;

    }

 }

  

  이 부분은 가상으로 만든 문자를 보내기 위한 핸드폰 번호 변수에 접근하는 것입니다.

보시다시피, 사용자가 번호를 입력하고, 그 번호로 보내려고 할 때, 번호를 setPN1에 넣어서

저장을 합니다. 하지만 문자를 보낼 때 번호를 잘못입력했습니다.. 그럼 돈만 날리잖아요.

  문자는 허공으로 날라가고.. 그러면.. 30원이 날라갑니다.. 대략.그림문자, 사진을 보내는데.

그러면.. 돈이 더 날라갑니다.. 그 돈 다 어디서 나오니까... 땅 파도 안나오는 돈... 돈.. 돈..

  내돈.. 내돈.. 내돈. 내돈~~~  그래서 접근을 함부로 못하게 하는거죠.. 그러면 잘못입력하면

  제가.. 내돈 내돈 내돈.. 할 필요 없이..

 핸폰에서.. '안 보내.. 안 보내 안 보내.. 핸폰 번호가 틀렸잖아 임마~"

  이러는 거죠? ㅇㅋ?  

근데 이게 실제로 있냐구요?

 제 핸폰 옛날 폰이라서.. 010을 핸폰번호로 인식을 못해서.. 문자가 안날라가니다. 젠당..

업그레이드가 필요한거죠... 근데 귀찮아서 안합답니다.. 누가.. ktf 공기계 좀 있음 주세요. -.-;

주실분은 꼬리말로.. 살짜쿵 남겨주시면.. 감사합니다....

  어쩄든.. 강의는 이어져야죠... ㅎㅎ


  그럼.. 캡슐화의 최대의 장점을 살펴볼까요? 다시 위의 얘기로 살짜쿵 돌아가죠..

핸폰에서.. 문자를 보낼때.. 저런식으로..번호 넣는걸.  캡슐화하지 않고.. 기냥..

  문자 보내는 부분에서 구현을 했습니다.. 뭐.. 거기에서 검사를 해도 될테니까요..

근데.. 번호이동성이란 넘이 생기면서.. 010이란 넘이 생겼단 말입니다..

그럼.. 새로 가입한 친구에게 010인 친구에게 말입니다.. 문자를 보내는데..

그게 안 보내집니다.. -.-;; 핸폰이 아니라고 하면서.  

 오~ 이런! 그럼 새로나온 010이란 번호는 누구란 말이지?  -.- 대략 업그레이드가

  필요하다고 합니다.. 자.. 이제 저 프로그램을 고쳐줘야겠군요..

  그럼 문자 메시지 보내는 부분에서 010을 핸폰으로 인식하게 해줍니다..

오.. 그런데.. 사진메일도 있군요.. 오.. 그림메일... 음악메일..  종류도 참 다양하네요..

  고치는데.. 한참걸리네요.. 게다가. 까먹고 빼먹기라도 한다면.. -.-;;

그러면 핸폰 산 사람들이 이렇게 말하죠..

'너네 뭐하는거야? 소비자 우롱하는거야? 그런거야? 010은 집전화야? 그런거야? "

  자.. 그런데.. 다행이도.. 각 문자, 메일을 보내는 부분에 번호를 입력하는 부분을

캡슐화 해놨습니다.. 아.. 다행이군요... 캡슐화 된. 그 부분만 손보면.. 유~후~

 끝이네요..  자... 캡슐화란 놈.. 알고보면.. 정말 쓸 만한 녀석이지요?

  

  자... 오늘의 강의는 대략.. 이 정도로.. ^^ 끝냅니다.. 마지막으로.. 한가지만..

더 말할께요.. (끝이라면서.. ㅎㅎ)


  객체지향 프로그래밍에서.. 데이터를 숨기는 것은 미덕이랍니다..

  그래서.. 클래스란 개념이 나왔구요.. 거기서... 접근 지정자로.... 접근의 제한성을

두어서.. 숨기게 되었죠.. 하지만.. 그 클래스 내부에서는 여전히 바로 바로..

접근이 된답니다... 그래서.. 인터페이스란 넘을 만들죠.. 이 넘 안에는.. 메서드밖엔

없네요.. 데이터로 바로 접근은 듁어도..못하고.. 인터페이스에.. 있는. 메서드로만..

접근을 할 수밖에 없네요.. 오.. 이제.. 데이터를 안전하게.. 보관할 수 있겠죠?

  함부로 접근을 할 수가 없으니까요..  인터페이스란 넘이. 나온 이유중에 하나가..

이런 이유도 있다고 하네요.. 전 예전에.. 이 내용보구.. 아~ 기깔나구나! 이랬어요

  안그런거야? 이게 안 이래? 췟.. 느끼는건..그 때 그 때 달라요...


                                     Pride Of PlmingZIGI™