Access modifier

똘이주인·2021년 5월 12일
0

접근 제어자(access modifier)

접근 제어자는 클래스의 멤버(변수와 메소드)들의 접근 권한을 지정한다.

사용이유

  • 외부에 불필요한 부분을 노출시키는 것을 방지함으로써 데이터를 보호하기 위해
  • 내부적으로만 사용되는 부분을 감추기 위해
  • 외부에서 접근할 필요가 없는 멤버들을 private로 만들어 복잡성을 줄일 수 있다.

public

클래스 또는 객체의 외부 인터페이스를 제공할 경우 사용

클래스명과 소스파일명이 같아야함.

다른 패키지에서도 내 클래스의 변수나 메서드를 사용 할 수 있도록 하기 위해서는 public 접근 제어자를 사용하면 된다.

public 접근 제어자의 공개 범위는 같은 프로젝트 내이다.

접근 제한이 없으며 같은 프로젝트 내에 어디서든 사용 가능

// 누구나 접근 허용
public class Everywhere{
		public String var = "모두 허용";//public 필드
		public String getVar(){        //public 메소드
				return this.var;
		}
}

protected

상속관계에서 사용

부모 클래스에 대해서는 public 멤버처럼 취급되며,

외부에서는 private 멤버처럼 취급 된다.

자기 자신과 자기를 상속하는 자식 클래스에게만 변수/메서드를 공개한다.

  • 클래스의 protected 멤버에 접근할 수 있는 영역

    1. 이 멤버를 선언한 클래스의 멤버
    2. 이 멤버를 선언한 클래스가 속한 패키지의 멤버
    3. 이 멤버를 선언한 클래스를 상속받은 자식 클래스(child class)의 멤버
  • 사용예제

    protected로 지정한 멤버는 해당 형식과 이를 기반으로 파생한 형식에서는 접근할 수 있고 그 외의 형식에서는 접근할 수 없게 한다.

    예를 들어 음악가가 연주를 하면 연주 스킬이 향상하게 구현하고자 한다. 그리고 음악가를 파생한 피아니스트에서 레슨을 받으면 마찬가지로 연주 스킬을 향상하게 구현한다고 가정

    이 때 음악가 클래스 연주 스킬의 접근 지정을 private으로 정하면 파생한 피아니스트 클래스에서도 접근할 수 없어서 레슨을 받으면 연주 스킬을 향상시키는 부분을 구현할 수 없다.

    그리고 음악가 클래스 연주 스킬의 접근 지정을 public으로 정하면 다른 곳에서도 접근할 수 있어서 정보 은닉할 수 없어 신뢰성이 떨어질 수 있다.

    이럴 때 protected로 접근 지정하면 만족하는 결과를 얻을 수 있다. 물론 연주 스킬의 변화 범위가 존재할 수 있기에 연주 스킬에 관한 멤버 필드를 private로 정하고 연주 스킬에 관한 설정자 메서드를 protected로 정하면 보다 나은 결과를 얻을 수 있다.

    public class Musician {
        int skill;
        static final int MAX_SKILL = 100;
        static final int MIN_SKILL = 0;
        public Musician(){
            setSkill(MIN_SKILL);
        }
        protected void setSkill(int value) {
            if(value>MAX_SKILL){
                value = MAX_SKILL;
            }
            if(value<MIN_SKILL){
                value = MIN_SKILL;
            }
            skill = value;
        }
        public void play(int tcnt){
            System.out.println(tcnt + "시간 연주하다.");
            setSkill(skill+tcnt);
        }
        public int getSkill(){
            return skill;
        }
    }
    
    //----------------------------------------------------------------------------------
    
    public class Pianist extends Musician{
        public void lesson(int tcnt){
            System.out.println(tcnt + "시간 레슨받다.");
            setSkill(getSkill()+tcnt);
        }
    }
    
    //----------------------------------------------------------------------------------
    
    public class Program {
        public static void main(String[] args){
            Pianist pianist = new Pianist();
            System.out.println("연주 스킬:"+ pianist.getSkill());
            pianist.play(3);
            System.out.println("연주 스킬:"+ pianist.getSkill());
            pianist.lesson(4);
            System.out.println("연주 스킬:"+ pianist.getSkill()); 
        }
    }
    
    /* 실행결과
    	연주 스킬:0
    	3시간 연주하다.
    	연주 스킬:3
    	4시간 레슨받다.
    	연주 스킬:7
    */

같은 패키지 내 다른 패키지에서 상속받아 자식 클래스에서 접근 가능

// 같은 패키지 접근 허용
package test;

public class SamePackage {
    protected String sameVar = "다른 패키지에 속하는 자식 클래스까지 허용"; // protected 필드
}

//다른 패키지에 속하는 자식 클래스도 접근 허용
package test.other;
import test.SameClass; // test 패키지의 SameClass 클래스를 불러들여 포함시킴.

public class ChildClass extends SameClass {
    public static void main(String[] args) {
        SameClass = new SameClass();
        System.out.println(sp.sameVar); // 다른 패키지에 속하는 자식 클래스까지 허용
    }
}

default

protected 접근제어자와는 달리 하위 클래스에서는 접근할수 없음

! 접근제어자 지시자가 없을 경우 기본값으로 사용된다.

default를 위한 접근 제어자는 따로 존재하지 않으며, 접근 제어자가 지정되지 않으면 자동적으로 default 접근 제어를 가지게 된다.

default 접근 제어자의 공개범위는 같은 패키지 내이다.

같은 패키지 내에서만 접근 가능

// 같은 패키지 접근 허용
package test;

public class SamePackage {
    String sameVar = "같은 패키지는 허용"; // default 필드
}

// 같은 클래스 접근 허용
package test;

public class SameClass {
    String var = "다른 패키지는 접근 불가"; // default 필드
    public static void main(String[] args) {
        SamePackage sp = new SamePackage();
        System.out.println(sp.sameVar);     // 같은 패키지는 허용
    }
}

private

주로 클래스가 제공하는 기능을 내부적으로 구현할때 사용

private은 제어자가 붙은 변수와 메서드는 해당 클래스 내에서만 접근이 가능하다.

즉, private 접근 제어자의 공개 범위는 같은 클래스내이다.

같은 클래스 내에서만 접근 가능

//같은 클래스만 접근 허용
public class SameClass {
    private String var = "같은 클래스만 허용"; // private 필드
    private String getVar() {                  // private 메소드
        return this.var;
    }
}

접근 제어자의 접근 범위(public > protected > default > private)

표로 표현하면 아래와 같다.

0개의 댓글