오늘은 접근제어자에 대해서 정리해보려고 한다.
옛날에 코딩할 때는 중요성을 못 느끼고 무분별하게 사용만을 했는데, 접근제어자를 적절히 사용하면 위험요소들을 줄일 수 있다.
자세한 예를 들어 이해와 기억에 도움이 되도록 작성해 보려고한다.
접근제어자에는 public, protected, default, private 가 존재한다.
일단 아래와 같은 test 패키지에 변수들이 있다고 가정하겠다.
package test;
public class Am_Member {
public String pub_name = "pub_GG_BB";
protected String pro_name = "pro_GG_BB";
private String pri_name = "pri_GG_BB";
String name = "def_GG_BB";
}
1. public
첫번째로는 가장 많이 볼 수 있는 public 이다.
public은 말 그대로 어떤 클래스에서도 제한 없이 사용할 수 있는 접근제어자이다.
package main;
import test.Am_Member;
public class main {
public static void main(String[] args) {
Am_Member mem = new Am_Member();
System.out.println(mem.pub_name); // pub_GG_BB
}
}
그래서 이렇게 다른 패키지에서도 가져와서 사용할 수 있다.
변수 뿐만 아니라 메소드도 마찬가지이다.
2. protected
두번째로는 protected 이다.
protected는 같은 패키지내에 있거나 상속관계의 클래스에서만 사용할 수 있는 접근제어자이다.
같은 패키지에 있는 경우에는 위에 처럼 사용이 가능하지만, 만약 위에 처럼 패키지가 다른 경우에는 아래에 방법처럼 상속받아 사용을 해야한다.
package main;
import test.Am_Member;
public class main extends Am_Member{
public String name = pro_name;
public static void main(String[] args) {
main m = new main();
System.out.println(m.name); // pro_GG_BB
}
}
상속을 받으면 다음과 같이 클래스 내에서 사용이 가능하다.
그냥 안일하게 protected 변수를 가져와 main() 함수에서 사용하려 했지만 할 수가 없었다.
그 이유는 public static void main(String[] args) 함수에서는 비정적 필드, 메소드를 참조 할 수 없기 때문이다.
이는 객체지향언어이기 때문이며, 위와 같이 클래스를 선언해 불러오는 것이 맞다.
오랜만에 기초를 다져보니 더 도움이 되는 것 같다.
3. default
세 번째로는 default 이다.
default는 말그대로 기본 값이다.
우리가 평소에 선언하는
int i = 0;
String name = "GG_BB";
이런 것들이 바로 default가 붙는 변수가 되는 것이다.
default 접근 제한자는 protected 에서 상속만 뺀 것이다.
같은 패키지 내에서만 사용이 가능하다.
package test;
import test.Am_Member;
public class main{
public static void main(String[] args) {
Am_Member mem = new Am_Member();
System.out.println(mem.name); // def_GG_BB
}
}
위와 같이 default 접근제어자가 있는 변수를 사용가능하다.
4. private
마지막으로는 private 이다.
말그대로 비밀스러운 접근제어자이다.
private는 같은 클래스 내에서만 접근이 가능하다.
package test;
public class Am_Member {
public String pub_name = "pub_GG_BB";
protected String pro_name = "pro_GG_BB";
private String pri_name = "pri_GG_BB";
String name = "def_GG_BB";
public static void main(String[] args) {
Am_Member mem = new Am_Member();
System.out.println(mem.pri_name); // pri_GG_BB
}
}
위와 같이 선언한 클래스 내에 main 함수를 통해 사용해야 한다.
이 개념들은 매우 중요한 개념들이니 꼭 잊지 않고 잘 기억하면 좋을 것이다.
이렇게 모든 접근제어자를 설명했다.
기초적인 내용이기도 하고 활용하는 방법은 많으니 그것들을 공부하는데 도움이 되었으면 한다.
예를 들어, 전에 설명했던 static을 통해서 값들을 가져올 수도 있고, getter/setter를 통해 private 변수에 접근하는 방법들이 있다.
static을 통해 접근하는 것은 전 글을 읽어보는 것도 도움이 될 것 같고,
getter/setter에 대한 글은 다음에 정리해봐야겠다.
참고 -
'언어 > Java' 카테고리의 다른 글
[Java] - 자바란? (0) | 2022.03.20 |
---|---|
[Java] Overriding, Overloading (0) | 2022.03.20 |
[Java] Optional (0) | 2022.03.20 |
[Java] 클래스, 객체, 인스턴스 (0) | 2022.03.20 |
[Java] static 변수 (0) | 2022.03.19 |