곰돌이 놀이터
[기본] 접근제어자( Access Modifier ) 란? 본문
접근제어자( Access Modifier ) 란?
접근을 제한하는 이유는 객체가 가진 고유의 멤버 변수값들이 외부에서 잘못 변경되는 것을 막기 위해서이다.
사전에 멤버 변수와 함수들의 성격을 규정하고 차단함으로써 의도치 않은 실수를 줄이기 위한 의도가 깔려 있으며,
접근 제어자의 종류는 총4가지가 있는데 public 과 private 를 가장 많이 사용한다.
public > protected > default > private 순으로 보다 많은 접근을 허용한다
1) public : 접근 제한이 전혀 없다.
2) protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근 가능
3) default : 같은 패키지 내에서만 접근 가능
4) private : 같은 클래스 내에서만 접근 가능
제어자 |
같은 클래스 |
같은 패키지 |
자손 클래스 |
전체 |
public |
|
|
|
|
protected |
|
|
|
|
default |
|
|
|
|
private |
|
|
|
|
대상 |
사용 가능한 접근 제어자 |
클래스 |
public, ( default ) |
메서드 |
public, protected, ( default ), private |
멤버변수 |
|
지역변수 |
없음 |
■ public
접근제어자가 public으로 설정되었다면 public 접근제어자가 붙은 변수, 메소드는 어떤 클래스에서라도 접근이 가능하다.
package jump2java.house; public class HousePark { protected String lastname = "park"; public String info = "this is public message."; }
위 예제의 HousePark의 info 변수는 public 접근제어자가 붙어 있으므로 어떤 클래스에서던지 접근이 가능하다.
■ protected
접근제어자가 protected로 설정되었다면 protected가 붙은 변수, 메소드는 동일 패키지내의 클래스 또는 해당 클래스를 상속받은 외부 패키지의 클래스에서 접근이 가능하다.
다음의 예를 보자.
HousePark.java
package jump2java.house; public class HousePark { protected String lastname = "park"; }
EungYongPark.java
package jump2java.house.person; import house.HousePark; public class EungYongPark extends HousePark { public static void main(String[] args) { EungYongPark eyp = new EungYongPark(); System.out.println(eyp.lastname); } }
HousePark클래스를 상속받은 EungYongPark이라는 클래스의 패키지는 jump2java.house.person으로 HousePark의 패키지인 jump2java.house와 다르지만 HousePark의 lastname 변수가 protected로 설정되었기 때문에 eyp.lastname과 같은 접근이 가능하다.
만약 lastname의 접근제어자가 protected 가 아닌 default 접근제어자였다면 eyp.lastname 문장은 컴파일 에러를 유발 할 것이다.
■ default
접근제어자를 별도로 설정하지 않는다면 접근제어자가 없는 변수, 메소드는 default 접근제어자가 되어 해당 패키지 내에서만 접근이 가능하다.
다음의 예제를 보자.
HouseKim.java
package jump2java.house; public class HouseKim { String lastname = "kim"; }
HousePark.java
package jump2java.house; public class HousePark { String lastname = "park"; public static void main(String[] args) { HouseKim kim = new HouseKim(); System.out.println(kim.lastname); } }
HouseKim과 HousePark의 패키지는 jump2java.house로 동일하다. HouseKim의 lastname 변수는 접근제어자가 default이므로 HousePark 클래스에서 main 메소드에서 사용한 것과 같이 kim.lastname 으로 HouseKim의 lastname 변수에 접근이 가능하다.
■ private
접근제어자가 private으로 설정되었다면 private 이 붙은 변수, 메소드는 해당 클래스에서만 접근이 가능하다.
public class AccessModifier { private String secret; private String getSecret() { return this.secret; } }
위 예제의 secret 변수와 getSecret 메소드는 오직 AccessModifier 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.
■ 접근 제어자를 이용한 캡슐화
접근 제어자를 사용하는 이유는 클래스의 내부에 선언된 데이터를 보호하기 위해서이다.
데이터가 유효한 값을 유지하도록 또는 비밀번호와 같은 데이터를 외부에서 함부로 변경하지 못하도록 하기 위해서는 외부로부터의 접근을 제한하는 것이 필요하다
이것을 데이터 감추기라고 하며 객체지향개념에선 캡슐화(encapsulation)이라 한다.
■ 끝으로
이상 총 4개의 접근제어자에 대해서 알아보았다. 예제는 변수만을 대상으로 설명했지만 메소드도 마찬가지의 접근제어 규칙을 따른다.
※ 클래스내의 클래스를 inner 클래스라고 부르는데 이러한 inner클래스에도 역시 접근제어자를 붙여서 접근을 제어할 수 있다.
접근제어자를 모두 public으로 설정해도 프로그램은 잘 동작할 것이다. 하지만 접근제어자를 이용하면 프로그래머의 코딩 실수를 방지할 수 있고 기타 위험요소를 제거할 수 있는 등의 많은 장점이 있다.
참고
https://wikidocs.net/232
http://mainia.tistory.com/5574
'기본 개발 지식' 카테고리의 다른 글
[기본] 플랫폼, 프레임워크, 라이브러리의, API 의 이해 (0) | 2018.07.26 |
---|---|
[기본] 매개변수( Parameter )와 전달인자( Argument )의 차이 (0) | 2018.07.25 |
[기본] 세션과 쿠키의 차이( with 캐시 ) (0) | 2018.07.19 |
[기본] GET 방식과 POST 방식의 차이 (0) | 2018.07.19 |
[기본] HTTP 란? (0) | 2018.07.18 |