의견.png

접근제어자

해시넷
greenwood26 (토론 | 기여)님의 2020년 8월 13일 (목) 10:13 판 (같이 보기)
이동: 둘러보기, 검색

접근제어자란 자바 클래스에서 멤버들이 노출되는 것을 막기 위해 접근을 제한해주는 것을 말한다.[1]

개요

접근제어자는 객체지향언어(Object-oriented Programming)의 3대요소 중 하나로 말 그대로 접근을 제어하기 위해 사용하는 것이다. 모두가 접근 가능한 변수나 메소드는 제약 조건 없이 쉽게 데이터가 변경이 가능하기 때문에 데이터를 안정하게 변경하기 위해 접근을 할 수 있는 대상을 지정해 줄 때 사용한다.[2]

특징[3]

퍼블릭

퍼블릭(public)은 모든 접근을 허용한다. 외부의 모든 클래스 및 생성자, 메소드, 필드로부터 접근을 완전히 허용하고, 다른 개발자들에게 라이브러리처럼 공유하려고 할때 사용한다.[4] 아래의 예제에서 멤버변수 a와 method_public 메소드는 모든 클래스에서 사용할 수 있는 경우이다. 추가적으로 생성자는 반드시 public으로 선언해 주어야 하는데 public으로 선언해야만 클래스 외부에서 제한없이 호출할 수 있기 때문이다.

class Public1
{
  public int a;
  public void method_public()
  {
    i=100;
  }
}

프라이빗

프라이빗(private)은 현재 객체 내에서만 접근을 허용한다. 무조건 클래스 내부에서만 사용이 가능하기 때문에 동일 패키지에서는 private을 제외한 전부 접근 가능하다.[4] 멤버변수나 메소드 앞에 private을 붙이는 이유는 이후에 변경할 가능성이 있기 때문이다. private 멤버변수나 메소드는 나중에 내용을 변경해도 다른 클래스들에게는 아무 영향이 없기 때문에 편리하다. 아래의 예제는 멤버변수 b와 method_private는 내부에서 정의된 method_private 메소드에서만 사용이 가능하다.

class Private1
{
  private int b;
  private void method_private()
  {
    d=200;
  }
}

프로텍티드

프로텍티드(protected)는 같은 패키지에 있는 객체와 상속관계의 객체들만 허용한다. 클래스 선언자체가 불가능하며 같은 패키지에 속해있는 클래스에서 생성자와 메소드, 필드(객체)만 호출 할 수 있고, 다른 패키지에 있는 생성자, 메소드, 필드는 호출하지 못하지만 상속관계에 있는 클래스라면 예외로 호출이 가능하다.[4] 한마디로 상속받은 서브클래스들에게는 public으로 작용하고 아닌 서브클래스들에게는 private처럼 작동한다. 보통 프라이빗으로 선언하고 싶지만, private으로 선언하면 확장하는데 어려움이 있는 경우에 사용한다. 아래에 예제에서 Protected1 클래스에서 멤버변수 c와 메소드 method_protected는 Protected1 클래스와 Protected1 클래스를 상속받은 서브클래스에서만 사용할 수 있다.

class Protected1
{
  protected int c;
  protected void method_protected()
  {
    c=300;
  }
}

디폴트(default)

디폴트(default)는 같은 패키지(폴더)에 있는 객체들만 접근을 허용한다. 'friendly'라고도 부르며 다른 접근제어자를 선언하지 않았다면 기본적으로 선언되는 제어자이다. 다른 패키와의 클래스 선언과 생성자/메소드/필드의 호출이 불가능해지며 동일 패키지안에서는 모든 것이 허용된다.[4] 자바에서는 아무런 접근제어자를 표시하지 않은 경우에 같은 패키지 내에서만 public 처럼 작동된다.

접근 여부[5]
종류 동일 클래스 하위 클래스 동일 패키지 외부 패키지(클래스)
private O X X X
(default) O X O X
protected O O O X
public O O O O

활용

캡슐화[6]

캡슐화는 접근제어자를 사용하여 객체의 데이터를 외부로 부터 보호하기 위해 사용하는 것이다. 멤버변수와 메소드를 묶어 개발자는 코드 재사용을 편하게 하려는 것과 사용자에게 필요한 기능만 제공하기 위함이 있다. 멤버변수 앞에 접근 제어자 private를 붙이고 멤버변수에 값을 넣고 꺼내 올 수 있는 메소드를 만들면된다. 아래 예제는 학교 클래스에서 학생 클래스의 멤버변수 값을 참조하고 싶은데 프라이빗(private)으로 선언해 은닉화한 상황이기 때문에 직접적인 접근이 불가능하다. 그렇기 때문에 설정자인 setName 메소드와 접근자인 getName 메소드를 활용하여 간접적으로 접근하여 값을 설정하고 받아오는 과정을 나타낸다.[7]

<학생 클래스>
 public class student
 {
   private String name;
   public void setName(String name)
   {
     this.name = name;
   }
   public String getName()
   {
     return name;
   }
 }
<학교 클래스(메인)>
 public class School 
 {
   public static void main(String[] args)
   {
     student stu = new student();
     stu.setName("아사달");
     System.out.println("이름 :" +stu.getName());
   }
 }
<실행 결과>
 이름 : 아사달


각주

  1. Gyrfalcon, <JAVA 접근 제한자 (public, private, protected, defalult)>, <<개인 블로그>>, 2014-02-27
  2. KOU, <접근제한자, 접근제어자...>, <<개인 블로그>>, 2020-06-04
  3. * 임동혁, <임동혁의 자바 시크릿 완벽 가이드 JAVA Programming>, <<다올미디어>>, 2011-05-15
  4. 4.0 4.1 4.2 4.3 AraGrooveit, <자바(Java) 접근 제한자 private/ protected/ public / default>, <<개인 블로그>>, 2015-11-10
  5. 규밍, <[java 접근제한자 public, private, protected, default]>, <<개인 블로그>>, 2019-05-21
  6. 제주도소년, <캡슐화(Encapsulation)>, <<개인 블로그>>, 2020-04-01
  7. PSJ2, <(자바/JAVA 개발)자바 은닉화(encapsulation): 캡슐화>, <<개인 블로그>>, 2018-01-09

참고자료

같이 보기


  의견.png 이 접근제어자 문서는 프로그래밍에 관한 토막글입니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 이 문서의 내용을 채워주세요.