Contents

조회 수 2534 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄


3.5.5 private 멤버 필드를 사용하는 이유

private 멤버 변수를 사용하는 이유에 대해서 보다 쉬운 말로 설명해보자. 사실 이 부분은 필자가 처음 객체지향 언어를 공부할 때 책을 아무리 보아도 느낌이 잘 오지 않던 부분이다. 거의 대부분의 책에서도 설명이 모호하다. 이 부분에서는 여러분의 느낌만을 바랄 뿐이다. 느낌을 얻어 보자.

제일 먼저 외부의 데이터-사과가 있다고 가정하자. 사과를 private 멤버 변수인 우리의 위(胃)속으로 넣으려고 한다. 그냥은 안 된다. 사과를 위 속으로 그냥 집어넣다간 큰일난다. 입을 크게 벌리고, 그리고 목구멍을 최대로 하고, 그리고 나서 밀어 넣으면, 이런 일은 있으면 안 된다.

□ 가정
◇ 사과를 private 위라는 공간에 넣는다고 가정

□ 위험한 방법
◇ 사과를 위에 직접 할당하는 방법

private의 공간에는 public 메서드를 통해서 데이터를 걸러서 집어 넣어야 한다. 메서드를 통해서 넣어 보자. 사과라는 데이터를 '먹다()'라는 public 메서드를 통해서 잘게 부수고, 침을 바르고, 갈아서 목구멍을 통해서 사뿐히 삼켜야, private 위(胃)라는 공간으로 들어 갈 것이다.

□ 올바른 방법
◇ 사과를 먹다()라는 메서드를 통해서 분해해서 할당하는 방법

그런데 생각하기는 힘들지만 사과를 다시 받아내려고 한다. 사과를 다시 받아낼 수 있을까? 당연히 이것도 '소화()'라는 public 메서드를 통해서 찌꺼기만을 밑으로 내보낼 것이다. 다음은 이러한 과정을 클래스로 디자인한 것이다.

▒ private 멤버의 역할을 증명하는 클래스
 
class Human{
   private 소화기관 위;
   public void 먹다(음식 x){
      //x를 가공해서 위에 할당한다.   
   }
   public 찌꺼기 소화(){
      //위에 있는 내용물을 찌꺼기로 리턴한다. 
   }
}

정리를 해보자. public 메서드의 역할은 가공하지 않은 특정 데이터를 매개변수 형식으로 받아 낸다. 그리고 내부의 받아낸 데이터를 가공할 것이다. 그리고 적절히 가공되었다면 필요한 데이터만을 private 멤버 변수에 담을 것이다.

역(逆)으로 데이터를 내보낼 때에도 내부에서 사용하던 데이터를 다시 사용자가 원하는 형식으로 가공해서 내보낼 수 있는 것이다.

데이터를 넣고 빼는 사람은 내부에 무슨 일이 일어나는지 몰라도 된다. public 메서드에 합당한 데이터만 넣어 주면 되기 때문이다. 그리고 데이터를 받아낼 때에도 내부가 어떻게 되어 있든 상관하지 않는다. 오직! 자신이 원하는 값만을 얻어내면 되기 때문이다.

□ private 멤버 변수의 사용
◇ 자료를 보호하기 위해서
◇ 내부적으로만 사용하기 위해서

이제까지 설명한 것을 예제로 한번 풀어 보자. 예제의 스토리는 다음과 같다.

외부에서 들어오는 4개의 정수를 받아서 합과 개수를 멤버 변수에 저장해둔다. 반대로 내보낼 때는 멤버 변수를 이용해서 합을 개수로 나누어서('합/개수') 값을 내보자.

§ chap03\MeanCalc.java
 
/**
은폐화(Encapsulation)를 테스트하는 클래스
**/
public class MeanCalc {
    private int sum; //합을 저장하기 위한 private 멤버 
    private int num; //값의 개수를 저장하기 위한 private 멤버 
    //외부로 부터 들어온 값을 가공하는 public 멤버 메서드
    public void setValue(int w, int x, int y, int z, int n){
        sum = w + x + y + z; 
        num = n; 
    }
    //내부의 값을 가공해서 내보내는 public 멤버 메서드
    public int getMean(){
        return sum / num; 
    }
/***
c:\javasrc\chap03>javac MeanCalc.java
***/

MeanCalc는 외부에서 값을 할당하면 평균값을 자동으로 얻을 수 있는 역할을 담당하는 클래스이다. setValue()의 매개변수로 데이터를 할당 받아서 다음과 같은 계산에 의해서 private 멤버에 값을 할당하게 된다.

□ 가공해서 private 멤버에 값할당
◇ sum = w + x + y + z;
◇ num = n;

그리고 외부에서는 평균값을 원하기 때문에 private 멤버를 다음과 같이 가공한 후 getMean() 메서드의 결과로 내보내게 된다.

□ private 멤버의 값들을 가공해서 내보내기
◇ return sum / n;

즉 MeanCalc 클래스를 사용하는 사용자 입장에서는 값을 할당해도 어떠한 방식으로 내부에 저장되는지 몰라도 되며, 값을 얻어 갈 때에도 내부에서 어떻게 계산되는지 몰라도 원하는 값을 얻을 수 있는 것이다. MeanCalc 클래스를 테스트하는 예를 작성해보자.

§ chap03\MeanCalcMain.java
 
/**
MeanCalc를 테스트하는 예
**/
public class MeanCalcMain {
    public static void main(String[] args) {
        MeanCalc m = new MeanCalc(); //객체 생성 
        m.setValue(3, 5, 120, 40, 4); //가공해서 private 멤버에 값할당 
        int s = m.getMean(); //private 멤버의 가공된 값 얻기 
        System.out.println("평균=" + s); //데이터 출력
    
/***
c:\javasrc\chap03>javac MeanCalcMain.java
c:\javasrc\chap03>java MeanCalcMain
평균=42
***/

다음과 같이 MeanCalc 클래스의 객체를 선언한 후 값을 할당하고 평균값을 받아내고 있다.

▒ MeanCalc 클래스 사용
 
MeanCalc m = new MeanCalc(); //객체 생성
m.setValue(3, 5, 120, 40, 4); //private 멤버에 가공해서 값 할당
int s = m.getMean(); //private 멤버의 가공된 값 얻기

햄버거 가게에 가서 여러분이 매개변수로 돈만 넘겨주면 햄버거를 받아낼 수 있다. 여러분은 그 햄버거가 어떻게 만들어지는지 몰라도 된다. 단지 여러분이 원하는 것만 얻으면 되는 것이다. 돈이 햄버거로 바뀌는 과정은 패스트푸드 가게 내부에서 알아서 할 것이다. 이 단순한 원리가 바로 데이터의 은폐화(Encapsulation) 기술이다.

☞ 여기서 잠~깐
햄버거 가게에 돈을 넣을 때의 값복사에 대해서 생각해보자. 햄버거 가게에 돈이 값복사의 방식으로 전달되기 위해서는 햄버거 가게 내에 돈의 메모리가 존재해야 한다. 돈에 해당하는 빈 종이가 있어야 하는 것이다. 돈이 입력되면 돈을 값복사해야 할 것이다. 돈을 값복사하기 위해서는 돈의 그림을 빈 종이에 복사해야 할 것이다. 이것이 값복사이다. 실제의 돈을 넘겨주는 것이 아니라 돈의 그림을 복사해주는 것이다. 즉 값만을 복사해서 넘겨주는 것이다.


여러 면에서 private은 아주 획기적인 것이다. 기존에는 데이터를 정제하는 과정을 사용자가 직접 프로그램으로 제어를 해서 만들었는데, 이제는 하나의 클래스로 새로운 데이터 타입을 만들어 두면 언제라도 그것을 사용할 수 있는 것이다.

List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
68 Java 3.6.7 결론 IT장인 2013.12.28 949
67 Java 3.6.6 MotorCycle m = new MotorCycle() IT장인 2013.12.28 1439
66 Java 3.6.5 참조 변수의 타입 IT장인 2013.12.28 1122
65 Java 3.6.4 참조 변수끼리의 할당 IT장인 2013.12.28 1104
64 Java 3.6.3 참조 변수의 특징 IT장인 2013.12.28 1634
63 Java 3.6.2 참조값의 원리 IT장인 2013.12.28 1227
62 Java 3.6.1 객체의 메모리 생성 IT장인 2013.12.28 535
» Java 3.5.5 private 멤버 필드를 사용하는 이유 IT장인 2013.12.28 2534
60 Java 3.5.4 private의 사용 이유 IT장인 2013.12.28 525
59 Java 3.5.3 private에 접근하는 방법 IT장인 2013.12.28 4870
58 Java 3.5.2 private의 접근과 컴파일 에러 IT장인 2013.12.28 1357
57 Java 3.5.1 접근제어란? IT장인 2013.12.28 727
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6