Contents

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

단축키

Prev이전 문서

Next다음 문서

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

단축키

Prev이전 문서

Next다음 문서

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


3.5.2 private의 접근과 컴파일 에러

클래스를 이용해서 변수를 생성하고 메모리를 할당한 후 점(.)을 이용해서 값을 할당하거나 메서드를 호출하였다. 지금까지는 모든 멤버들은 점(.)을 찍고 값을 할당하거나 메서드를 호출하였다. 그것은 멤버 변수와 메서드를 선언할 때 public 접근 지정자를 사용했기 때문에 가능했던 것이다.

제일 먼저 접근 지정자의 종류에 대해서 알아보자. 다음은 접근 지정자의 종류를 보여주고 있다.

□ 접근 지정자(Access Identifier)의 종류
◇ private
◇ public
◇ protected

이 절에서는 private과 public에 대해서만 배울 것이며, 상속을 배우고 난 후 protected에 대해서 자세히 알아볼 것이다.

객체의 메모리를 생성한 후 해당 객체의 멤버에 접근할 수 있으면 public으로 접근설정이 되어 있는 것이다. 만약 접근설정이 private으로 되어 있으면 점(.)을 찍고 접근할 수 없다.

☞ 접근 제어의 문제
여기서 논의되는 접근 제어는 메모리가 생성된 객체를 이용해서 점(.)을 찍고 접근할 수 있느냐 없느냐의 문제이다. 멤버 변수나 메서드가 public으로 설정되어 있으면, 메모리를 보유한 객체에서 점(.)을 찍고 접근할 수 있다. 그러나 private으로 설정되어 있으면 점(.)을 찍고 접근할 수 없다.


□ private 멤버의 접근
◇ private 멤버에 직접 접근할 수 없다.
◇ private 멤버에 접근하기 위해서 public 메서드를 이용한다.

private으로 설정되어 있는 멤버에 직접 접근한다면 에러가 발생할 것이다. private 멤버에 직접 접근할 수 없기 때문에 public 메서드를 이용하게 된다. 먼저 private에 접근했을 때 에러가 발생하는 예제부터 살펴보자.

§ chap03\Person.java
 
/**
private 멤버 변수를 포함한 클래스
**/
public class Person {
    public int age; //public 멤버 변수 선언
    public float height; //public 멤버 변수 선언  
    private float weight; //private 멤버 변수 선언 
/***
c:\javasrc\chap03>javac Person.java
***/

Person 클래스는 3개의 멤버를 포함하고 있으며, 2개는 public 접근 제한으로, 나머지 하나는 private 접근 제한으로 설정되어 있다. 접근 제한자를 사용할 때는 데이터 타입 앞에 명시하면 된다. 다음으로 Person의 private 멤버에 접근했을 때 에러가 발생하는 경우를 테스트하는 예제를 알아보자.

다음의 예제는 에러가 나는 것을 확인하기 위한 예제이기 때문에 올바르게 동작하지 않는다.

§ chap03\PrivateAccessMain.java
 
/**
private에 직접 접근하기 때문에 에러가 발생하는 예
**/
public class PrivateAccessMain{
    public static void main(String[] args) {
        Person brother = new Person(); //객체 생성
        brother.age =100; //public 멤버 접근
        brother.height = 170.0F; //public 멤버 접근
        brother.weight = 67.0F; //private 멤버 접근 - 에러 
        System.out.println("age:" + brother.age); //public 멤버 접근
        System.out.println("height:" + brother.height); //public 멤버 접근
        System.out.println("weight:" + brother.weight); //private 멤버 접근 - 에러 
    
/***
c:\javasrc\chap03>javac PrivateAccessMain.java
PrivateAccessMain.java:9: weight has private access in Person
                brother.weight = 67.0F; //private 멤버 접근 - 에러
                       ^
PrivateAccessMain.java:12: weight has private access in Person
                System.out.println("weight:" + brother.weight); 
                //private 멤버접근 - 에러
                                                      ^
2 errors
***/

이 예제에서 우리는 다음과 같은 에러를 만나게 된다. 이것은 접근제어를 위반했기 때문에 발생하는 컴파일 차원의 에러이다.

□ 컴파일 에러 발생
◇ PrivateAccessMain.java:9: weight has private access in Person

여기서 주의 깊게 보아야 할 것은 점(.)으로 접근하는 순간이다. 언제 접근하고 있는가? 위에서 보는 바와 같이 객체의 메모리가 생성된 후에 접근하고 있다. 접근제어의 기본법칙은 메모리가 생성된 후의 접근을 말한다.

하나의 데이터 타입을 만들기 위해서 우리는 클래스를 디자인한다. 그리고 만들어진 클래스로 객체를 만들면 메모리가 생성된다. 그 다음 순간에야 비로소 접근할 수 있다는 것을 잊어서는 안 된다. 객체의 이름을 이용해서 private으로 지정된 멤버에 접근한다면 컴파일할 때 접근 에러가 발생한다.

□ 접근제어의 시기
◇ 메모리가 생성된 후 점(.)찍고 접근

□ 접근제어의 두 가지 측면
◇ new 연산자를 이용해서 메모리를 생성한 후의 접근제어   
◇ 상속관계에서의 접근제어

만들어진 클래스를 사용할 때와 클래스를 디자인하고(만들고) 있을 때는 반드시 구분해야 한다. 클래스를 사용한다는 측면에서 본다면 접근제어는 만들어진 데이터 타입을 사용할 때의 문제이다. 이것은 객체의 메모리를 생성한 후 점(.)찍고 사용할 수 있느냐 없느냐의 문제이다.

하지만 클래스를 디자인하고 있을 때는 약간 다르다. 클래스를 디자인할 때에는 클래스 내부에서 작업이 이루어지기 때문에 상위 클래스와 하위 클래스 사이의 접근제어를 의미한다. 결론적으로 클래스를 디자인할 때의 접근제어는 상속에서의 접근제어를 의미한다.

☞ 접근제어
클래스를 이용해서 객체를 생성한 후의 접근과 클래스 안쪽에서 상위 클래스의 멤버를 사용하기 위한 접근은 정확하게 구분하고 넘어가야 한다. 현재 여기서 다루는 접근제어는 만들어진 클래스를 사용할 때의 접근제어를 말한다.


private 멤버에 점(.)찍고 접근할 수 없다고만 했을 뿐 사실상의 접근제어는 설명하지 않았다. 다음과 같은 질문을 던져 보자.

□ 질문
◇ 어떻게 private 멤버에 접근을 할 수 있을까?

이 문제의 해답은 'public 메서드를 이용한다'이다. 어떻게 메서드를 이용해서 private 멤버 변수에 접근하며, 어떻게 private 멤버 변수의 값을 외부로 전달하는지에 대해서 배워 보자.

기본원리는 의외로 단순하다. 외부로부터 들어오는 데이터를 매개변수(Parameter)를 통해서 전달받고, 매개변수의 데이터를 내부의 멤버 변수에 전달해주는 방법을 사용한다. 밖으로 내보낼 때는 메서드의 리턴(Return)을 통해서 외부로 전달한다.

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
59 Java 3.5.3 private에 접근하는 방법 IT장인 2013.12.28 4865
» 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