프로그래밍 언어/JAVA

자바 private,public,default,protected접근자 차이

원원 2017. 11. 22. 16:35

자바 public,protected,private,default접근자의 차이에대해 알아보겠습니다.

처음부터 public의 접근권한은 어떻고.. 이론적으로 먼저 배우는 것보다 실제로 자기가 해보는 것이 기억에 잘 남는것 같아서 먼저 접근자로 실험을 해보고 마지막에 표로 정리하겠습니다.




클래스 정의할 때 사용하는 접근자 : public, default


public : 다른 패키지에서도 객체 생성 가능

default : 동일 패키지 내에서만 객체 생성 가능


Money.java

1
2
3
4
5
6
7
8
9
package won;
 
public class Money {
 
    public static void main(String[] args) {
        new on.sw(); //오류
    }
 
}
cs

처음 자바파일을 만들면 위와 같은 형태로 되있습니다. 이때 2번째줄 class앞에 public이란 접근자를 볼 수 있는데 이 접근자가 있다면 Money클래스는 어디서든 객체를 생성당할수있습니다. 6번째 줄에서 sw객체를 만들고 있는데 sw객체는 default접근자이고 패키지가 다르므로 객체를 생성하지 못합니다.


sw.java

1
2
3
4
5
6
7
8
9
10
package on;
 
 
class sw {
 
    public static void main(String[] args) {
        new won.Money();
    }
 
}
cs

class앞에 아무것도 없으면 default입니다.  이때 7번째 줄에서 Money의 객체를 만들고 있습니다. Money는 public이므로 객체를 생성 할 수 있습니다.


이 외에도 public는 파일 하나당 한번만 쓸 수 있습니다.


Money.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package won;
 
public class Money {
 
    public static void main(String[] args) {
        
    }
 
}
 
class QW{
    
}
 
class ER{
    
}
cs

QW클래스와 ER클래스의 접근자는 default입니다. public을 사용한다면 오류가 납니다. 한 파일에서 public은 클래스명.java인 클래스에만 public을 써야합니다. 여기서는 파일이름이 Money.java이므로 Money클래스에만 public을 사용 할 수 있습니다.


Money.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package won;
 
class Money {
 
    public static void main(String[] args) {
 
    }
 
}
 
public class QW {
 
}
 
class ER {
 
}
cs

QW클래스에 public이 붙어있이므로 오류가 납니다.

(오류내용 : The public type QW must be defined in its own file)




인스턴스 변수와 함수를 정의할 때 사용하는 접근자 : public,protected,private,default


public : 다른 패키지에서도 접근 가능

default : 동일 패키지 내에서만 접근 가능

protected : 상속 받은 클래스에서 접근 가능

private : 자기 클래스에서만 접근 가능(정보은닉)



- public , default


sw.java

1
2
3
4
5
6
7
8
9
10
11
package on;
 
public class sw {
 
    public static void main(String[] args) {
        won.Money m = new won.Money();
        m.wowon();
        m.aaaa(); //오류
    }
 
}
cs


Money.java

1
2
3
4
5
6
7
8
9
10
11
package won;
 
public class Money {
    public void wowon() {
        System.out.println("안녕");
    }
 
    void aaaa() {
        System.out.println("녕안");
    }
}
cs


Money클래스의 wowon함수는 public이므로 다른 패키지에서 접근 가능하고 aaaa함수는 default이므로 동일 패키지에서만 접근 가능합니다.

sw클래스에서 Money객체를 만들고 wowon함수와 aaaa함수를 호출하는데 wowon함수는 호출이 되고 aaaa는 함수 호출이 안됩니다.(default)


-protected


Money.java

1
2
3
4
5
package won;
 
public class Money {
    protected int myMoney;
}
cs

sw.java

1
2
3
4
5
6
7
8
9
10
package on;
 
public class sw extends won.Money {
 
    void set() {
        myMoney = 1000;
 
    }
}
 
cs
Money클래스에서 myMoney를 protected로 선언했으므로 Money클래스를 상속한 클래스에서 myMoney에게 접근이 가능합니다.



-private

private접근자는 자신의 클래스에서만 접근이 가능합니다. 정보은닉이라고도 불리며 객체 변수를 숨기는 기능을 합니다.


sw.java

1
2
3
4
5
6
7
8
9
10
11
12
package on;
 
public class sw {
 
    public static void main(String[] args) {
        won.Money m = new won.Money();
        m.MyMoney = 100000//오류
        m.setMoney(10000);
        m.seeMoney();
    }
 
}
cs

Money.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package won;
 
public class Money {
 
    private int myMoney;
 
    public void setMoney(int m) {
        myMoney = m;
    }
 
    public void seeMoney() {
        System.out.println("돈 : " + myMoney);
    }
}
cs


sw클래스에서 Money객체를 만들고 myMoney변수에 접근해서 값을 변경하려하면 오류가 납니다.(private)

myMoney의 값을 변경하려면 Money클래스에서 함수를 만들어서 변경하면 됩니다. (setMoney 함수)




표 보는법

ex)protected접근자를 사용할때 클래스내부에 없고 패캐지에 없어도 상속받은 클래스면 접근가능

    private접근자는 클래스내부에 있을 때만 사용가능