검수요청.png검수요청.png

"접근제어자"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
(참고자료)
(캡슐화)
80번째 줄: 80번째 줄:
 
== 활용 ==  
 
== 활용 ==  
 
=== 캡슐화===
 
=== 캡슐화===
[[캡슐화]]는 접근제어자를 사용하여 객체의 데이터를 외부로 부터 보호하기 위해 사용하는 것이다. 멤버변수와 메소드를 묶어 개발자는 코드 재사용을 편하게 하려는 것과 사용자에게 필요한 기능만 제공하기 위함이 있다. 멤버변수 앞에 접근 제어자 private를 붙이고 멤버변수에 값을 넣고 꺼내 올 수 있는 메소드를 만들면된다. 아래 예제는 학교 클래스에서 학생 클래스의 멤버변수 값을 참조하고 싶은데 [[프라이빗]](private)으로 선언해 은닉화한 상황이기 때문에 직접적인 접근이 불가능하다. 그렇기 때문에 [[설정자]]인 setName 메소드와 [[접근자]]인 getName 메소드를 활용하여 간접적으로 접근하여 값을 설정하고 받아오는 과정을 나타낸다.<ref name="capsule2">PSJ2, <[https://mainpower4309.tistory.com/7 (자바/JAVA 개발)자바 은닉화(encapsulation): 캡슐화]>, <<개인 블로그>>, 2018-01-09</ref>  
+
[[캡슐화]]는 접근제어자를 사용하여 객체의 데이터를 외부로 부터 보호하기 위해 사용하는 것이다. 멤버변수와 메소드를 묶어 개발자는 코드 재사용을 편하게 하려는 것과 사용자에게 필요한 기능만 제공하기 위함이 있다. 멤버변수 앞에 접근 제어자 private를 붙이고 멤버변수에 값을 넣고 꺼내 올 수 있는 메소드를 만들면된다. 아래 예제는 학교 클래스에서 학생 클래스의 멤버변수 값을 참조하고 싶은데 [[프라이빗]](private)으로 선언해 은닉화한 상황이기 때문에 직접적인 접근이 불가능하다. 그렇기 때문에 [[설정자]]인 setName 메소드와 [[접근자]]인 getName 메소드를 활용하여 간접적으로 접근하여 값을 설정하고 받아오는 과정을 나타낸다.<ref name="capsule2">PSJ2, [https://mainpower4309.tistory.com/7 (자바/JAVA 개발)자바 은닉화(encapsulation): 캡슐화], 《티스토리》, 2018-01-09</ref>  
 
  <학생 클래스>
 
  <학생 클래스>
 
   public class student
 
   public class student

2020년 9월 9일 (수) 17:25 판

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

개요

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

특징

퍼블릭

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

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

프라이빗

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

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

프로텍티드

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

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

디폴트

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

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

[4][5]

활용

캡슐화

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

<학생 클래스>
 public class student
 {
   private String name;                    //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();                          //student 객체 생성
     stu.setName("아사달");                            //설정자로 은닉화된 변수에 값 지정
     System.out.println("이름 :" +stu.getName());      //접근자로 변수 값 받아와서 출력
   }
 }
<실행 결과>
 이름 : 아사달

[7]

싱글톤패턴[8]

싱글톤패턴(Singleton Pattern)에서 싱글톤은 하나의 애플리케이션 내에서 단 하나만 생성되는 객체를 의미하며 외부에서 new 생성자를 호출할 수 없도록 막기 위해 private static으로 생성한다. 인스턴스가 오직 하나만 생성되는 것을 보장하고 어디에서든 이 인스턴스에 접근할 수 있도록 하는 디자인패턴이다. 싱글턴은 하나의 인스턴스만을 생성하는 책임이 있으며 getinstance 메소드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행한다.[9]

<싱글톤 클래스>
 class Example                                    //싱글톤 클래스
 {
   private static Example example;                  //메모리에 올라오지만, 외부에서 접근 불가
   static{
     example = new Example();
     //메모리 로드
   }
   private Example()                              //외부에서 new로 객체를 생성하지 못하게 private
   {
      //생성자
   }
   public static Example getExample()
   {
     return exmple;
   }
 }
<메인 클래스>
 public class ExampleTest
 {
   public static void main(String[] args)
   {
     Example e1 = Example.getExample();                 
     Example e2 = Example.getExample();              //객체를 두번 생성한다.
     System.out.println(e1 == e2);               //만약 값이 true로 나온다면 같은 객체를 참조한 것이다.
   }
 }
<실행결과>
  true
      

각주

  1. Gyrfalcon, 〈JAVA 접근 제한자 (public, private, protected, defalult)〉, 《티스토리》, 2014-02-27
  2. KOU, 〈접근제한자, 접근제어자(public,private,protected,internal)이 뭔데>-Kotlin〉, 《티스토리》, 2020-06-04
  3. 3.0 3.1 3.2 3.3 AraGrooveit, <자바(Java) 접근 제한자 private/ protected/ public / default>, <<개인 블로그>>, 2015-11-10
  4. 규밍, 〈(java) 접근제한자 public, private, protected, default〉, 《티스토리》, 2019-05-21
  5. 임동혁, 〈임동혁의 자바 시크릿 완벽 가이드 JAVA Programming〉, 《다올미디어》, 2011-05-15
  6. PSJ2, 〈(자바/JAVA 개발)자바 은닉화(encapsulation): 캡슐화〉, 《티스토리》, 2018-01-09
  7. 제주도소년, 〈캡슐화(Encapsulation)〉, 《티스토리》, 2020-04-01
  8. kslee7746, <Java 접근제한자>, <<개인 블로그>>, 2017-04-27
  9. 정인상, 채흥석, <자바 객체지향 디자인 패턴: UML과 GoF 디자인 패턴 핵심 10가지로 배우는>, <<한빛 미디어>>, 2014-04-28

참고자료

같이 보기


  검수요청.png검수요청.png 이 접근제어자 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.