Java의 접근제어자

김수환·2023년 9월 30일
0

접근 제어자?

정보 은닉(data hiding):

사용자가 굳이 알 필요가 없는 정보는 사용자로부터 숨겨야 한다는 개념
객체에 대한 구체적인 정보를 노출시키지 않도록 하는 기법

  • 객체의 구체적인 타입 은닉 (업캐스팅)
  • 객체의 필드 및 메소드 은닉 (캡슐화)
  • 구현 은닉 (인터페이스 & 추상 클래스)

이 중 캡슐화를 이뤄내기 위해 사용하는 것이 접근제어자 이다.

접근제어자

객체지향언어에서 클래스, 메서드, 변수 등의 멤버에 대한 접근 권한을 지정하는 키워드

Java에서 제공하는 접근제어자

  • private
  • default
  • protected
  • public

private

접근 제어자가 private으로 설정되었다면 private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능하다.

public class Example {
    private String malz;
    private String getMalz() {
        return this.malz;
    }
}

변수 malz와 함수 getMalz() 오직 Example 클래스에서만 접근이 가능하고 다른 클래스에서는 접근이 불가능하다.

default

접근 제어자를 별도로 설정하지 않는다면 변수나 메서드는 default 접근 제어자가 자동으로 설정되고 동일한 패키지 안에서만 접근이 가능하다.

SubSub/Malz.java

package SubSub;

public class Malz {
    String nickName = "malz";  // nickName은 default 접근제어자로 설정된다.
    ...
}

SubSub/Rio.java

package SubSub;  // 패키지가 동일하다.

public class Rio {
    public static void main(String[] args) {
        Malz malz = new Malz();
        System.out.println(malz.nickName);  // Malz 클래스의 nickName 변수를 사용할 수 있다.
    }
}
malz

MalzRio의 패키지는 subsub으로 동일하다. 따라서 Rio클래스에서 default 접근 제어자로 설정된 MalznickName 변수에 접근이 가능하다.

Protected

접근 제어자가 protected로 설정되었다면 protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근이 가능하다.

subsub/member.java

package subsub;  

public class Member {
    protected String teamName = "subsub";
    protected String part = "server";
}

subsub/member/malz.java

package subsub.member;  // 패키지가 서로 다르다.

import subsub.Member;

public class Malz extends Member {  // member상속
    public static void main(String[] args) {
       	Malz malz = new Malz();
        System.out.println(malz.teamName);  // 상속한 클래스의 protected 변수는 접근이 가능하다.
    }
}
subsub

member 클래스를 상속한 Malz 클래스의 패키지는 subsub.member로, Member 클래스의 패키지인 subsub과 다르지만 MemberteamName 변수가 protected이기때문에 malz.teamName 과 같은 접근이 가능하다

public

접근 제어자가 public으로 설정되었다면 public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근이 가능하다.

package subsub;

public class malz {
    protected String lastName = "Kim";
    public String nickName = "malz";
}

malznickName 변수는 public 접근 제어자가 붙어 있으므로 어떤 클래스라도 접근이 가능하다. 그래서 다음과 같이 작성할 수 있다.

import subsub.malz;

public class Sample {
    public static void main(String[] args) {
        Malz malz = new Malz();
        System.out.println(housePark.nickName);
        // System.out.println(housePark.lastName); 컴파일 에러
    }
}
malz
profile
hello human

0개의 댓글

관련 채용 정보