Contents

Java
2013.12.28 09:36

3.5.3 private에 접근하는 방법

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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


3.5.3 private에 접근하는 방법

private으로 설정되어 있는 멤버 필드에 점(.)찍고 접근할 때 컴파일도 되지 않는 황당한 에러를 경험하였다. 이 때 '어떻게 접근할 수 있을까?'가 이 절의 주제이다.

□ private 멤버에 접근하는 방법
◇ public 멤버 메서드의 매개변수(Parameter)를 통해서 private 멤버에 값을 할당
◇ public 멤버 메서드의 리턴(Return)을 통해서 private 멤버의 값 내보내기
◇ 이 때 매개변수와 리턴값이 할당되는 원리는 값복사의 기법을 이용한다.

해결책은 public 메서드를 통해서 외부에서 들어오는 데이터를 받아내고, 또 다른 public 메서드를 통해서 외부로 값을 내보내는 방법이다. 즉 메서드의 매개변수(Parameter)와 리턴(Return)을 이용하는 것이다. 이 때 메서드는 public 접근으로 설정되어 있어야 한다. 우선, private 멤버에 접근하는 예제를 살펴보자.

§ chap03\TopSecret.java
 
/**
public 메서드를 이용한 private 멤버 변수의 접근
**/
public class TopSecret{
    private int secret; //private 멤버 변수 선언 
    //private 멤버에 값 할당하기
    public void setSecret(int x){ //private에 접근하는 public 멤버 메서드 
        secret = x; 
    }
    //private 멤버의 값을 외부로 내보내기
    public int getSecret(){ //private에 접근하는 public 멤버 메서드
        return secret; 
    }
/***
c:\javasrc\chap03>javac TopSecret.java
***/

TopSecret 클래스는 private 멤버 변수를 선언하고, private 멤버 변수를 사용하는 2개의 멤버 메서드를 구현하고 있다.

□ TopSecret의 private 멤버 변수
◇ private int secret;

□ TopSecret의 public 멤버 메서드
◇ public void setSecret(int x){...}
◇ public int getSecret(){...}

setSecret() 멤버 메서드는 데이터 타입이 void형이다. 이것은 setSecret() 메서드가 일만하고 리턴을 하지 않기 때문에 void형으로 선언된 것이다. 그리고 하나의 매개변수를 외부로부터 받을 것이다. 그것은 setSecret()의 매개변수 x에 들어간다.

다음으로 getSecret() 메서드는 매개변수가 없다. 매개변수를 주지 않아도 일을 하지만, 이 메서드는 내부에서 뭔가를 리턴하고 있다.

☞ 메서드의 이름
메서드의 이름은 필자의 마음대로 주었는데, 처음 배울 때는 주고 싶은 이름을 주면 된다. 나중에는 좋은 이름을 주기 바란다. 그리고 약간 배우고 나면 일정한 규칙에 의해서 이름을 준다. 보통의 경우 값을 할당하는 메서드는 setXxx(), 값을 리턴하는 메서드는 getXxx()라고 붙여준다. set과 get이라는 단어와 멤버 변수의 이름을 합쳐서 사용하며, 새로운 단어가 시작되면 대문자로 시작하게 된다.


내부의 멤버끼리는 private과 public을 구분하지 않기 때문에 멤버 메서드 내에서 private 멤버를 사용하고 있다. 그리고 메서드의 매개변수와 리턴이라는 특수한 기능을 이용해서 private에 접근하고 있다.

다음은 외부에서 들어오는 값을 매개변수로 받아서 private 멤버 변수에 할당하는 원리를 보여주고 있다.

▒ 매개변수의 값을 멤버 변수로 값복사
 
public void setSecret(int x){
         secret = x;    
 }

그리고 private 멤버의 값을 리턴이라는 것을 통해서 외부로 튕겨내고 있다.

▒ return을 이용해서 외부로 값을 노출
 
public int getSecret(){
         return secret;
 }

물론 이것의 원리는 앞에서 배운 값복사의 원리에 의해서 동작한다. 그리고 public 메서드가 private에 접근할 수 있는 유일한 방법이라는 것도 기억해두기 바란다. TopSecret 클래스를 테스트하는 예를 만들어 보자.

§ chap03\TopSecretMain.java
 
/**
TopSecret 클래스를 테스트하는 예
**/
public class TopSecretMain {
    public static void main(String[] args) {
        TopSecret t = new TopSecret(); 
        t.setSecret(1000); //private 멤버 변수에 값을 할당하는 메서드 
        int s = t.getSecret(); //private 멤버 변수의 값을 얻어오는 메서드 
  
        System.out.println("s의 값은: " + s); //s의 값 출력
        System.out.println("t.getSecret(): " + t.getSecret()); //t.getSecret()의 값 출력 
    
/***
c:\javasrc\chap03>javac TopSecretMain.java
c:\javasrc\chap03>java TopSecretMain
s의 값은: 1000
t.getSecret(): 1000
***/

private 멤버 변수에 점(.)찍고 직접 접근한다면 컴파일도 되지 않는다. 당연한 에러이다. 그래서 public 메서드를 통해서 접근하는 것이다. 객체를 생성한 후 private 멤버에 접근할 수 없기 때문에 public 메서드를 이용해서 private 멤버 변수에 값을 할당하는 것이다.

▒ public 메서드를 통해서 private 멤버 변수에 값을 할당
 
TopSecret t = new TopSecret();
t.setSecret(1000);

그리고 private 멤버의 값을 받아내기 위해서 다시 public 메서드를 이용하고 있다.

▒ public 메서드를 통해서 private 멤버의 값을 얻어내기
 
int s = t.getSecret();

private 멤버 필드에 직접 접근을 할 수 없기 때문에 외부로부터 들어오는 데이터를 매개변수(Parameter)를 통해서 내부의 멤버 변수에 전달해주었다. 외부로 내보낼 때는 메서드의 리턴(Return)을 통해서 전달하였다. 이렇게 한다면 private 멤버 변수의 접근은 아주 우아하게 해결된다.

그런데 이 부분에서 다음과 같은 질문이 나올 수 있을 것이다.

□ 질문 I
◇ 어떻게 public 멤버 메서드는 private 멤버 변수를 직접 사용할 수 있을까?

이것에 대한 단순한 대답이 있다. 일단 클래스 내의 멤버끼리는 private인지 public인지를 따지지 않는다. 그리고 멤버끼리는 공유가 가능하다. 그래서, 이런 말을 한 적이 있다. 'private과 public의 접근제어는 점(.)찍고 난 후의 접근 문제이다'라는 말 기억하는가? 즉 private과 public은 객체를 이용해서 점(.)찍고 접근할 때의 문제이지, 내부의 멤버끼리 사용할 때의 문제가 아니다.

□ 해답
◇ 클래스 내부의 멤버끼리는 private과 public을 따지지 않는다.
◇ 멤버끼리는 공유가 가능하다.

그리고 다음과 같은 질문도 생각해 볼 수 있다.

□ 질문 II
◇ private에 접근하는 방법이 public 메서드밖에 없을까?

답은 없다. 이 방법밖에는 존재하지 않는다. private은 public 메서드가 아니면 어떠한 경우에도 접근이 불가능하다.

□ private 멤버 변수의 접근
◇ private 멤버 필드에 직접 접근을 할 수 없기 때문에 외부로부터 들어오는 데이터를 매개변수(Parameter)를 통해서 내부의 멤버 변수에 전달하고, 외부로 내보낼 때는 메서드의 리턴(Return)을 통해서 전달한다.
◇ private에 접근할 수 있는 방법은 public 메서드밖에는 존재하지 않는다.
◇ 오직! public 메서드만이 private에 접근할 수 있다.

C++를 배우신 분들이라면 friend와 같은 private의 벽을 허무는 것이 있지 않느냐라고 반문하겠지만, 자바에서는 프렌드(friend)가 없다. private에 접근하는 방법은 오직 public 메서드 뿐이다.

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