2018-2-27 TIL Access-level Modifier

접근 수준 지시자(Access-level Modifier)

접근수준지시자를 선언하는 경우는 다음의 두가지 경우이다. 클래스의 정의, 클래스의 인스턴스 변수와 메소드
  • 클래스 정의 대상 : public, default
  • 인스턴스 변수와 메소드 대상 : public, protected, private, default

  • 클래스가 public으로 선언이 되면, 위치에 상관없이 어디서든 해당 클래스의 인스턴스를 생성할 수 있다.
    public class AAA { // declare public class
      ...
    }
    
  • 클래스가 default로 선언이 되면, 동일 패키지 내에서만 인스턴스 생성이 가능하다.
    class ZZZ { // declare default class
      ...
    }
    
  • 하나의 소스파일에 하나의 클래스만 public으로 선언한다.
  • 소스파일의 이름과 public으로 선언된 클래스의 이름을 일치시킨다.
인스턴스 멤버 대상의 public, protected, private, default선언
class AAA {
	public int num;
    // 인스턴스 변수의 public선언
    protected int num2;
    // 인스턴스 변수의 protected선언
    private int num3;
    // 인스턴스 변수의 private선언
    int num4;
    // 인스턴스 변수의 default선언

    public void md1(){...}
    // 인스턴스 메소드의 public 선언
    protected void md2(){...}
    // 인스턴스 메소드의 protected선언
    private void md3(){...}
    // 인스턴스 메소드의 private선언
    void md4(){...}
    // 인스턴스 메소드의 default선언
}
인스턴스 멤버의 public과 default가 가지는 의미
  • public : 어디서든 접근가능하다.
  • default : 동일 패키지내에서만 접근 가능하다.
인스턴스 멤버의 private선언이 갖는 의미
class Duck {
	private int numLeg = 2;
    // 클래스 내부에서만 접근 가능

    public void md1(){
    	System.out.println(numLeg); //접근가능
        md2(); //호출가능
    }

    private void md2(){
    	System.out.println(numLeg); // 접근가능
    }

    void md3(){
    	System.out.println(numLeg); // 접근가능
        md2(); // 호출가능
    }

}
  • private로 선언된 변수 numLeg는 동일 클래스에 정의된 메소드에서만 접근이 가능하다. 마찬가지로 private로 선언된 메소드 md2도 Duck클래스에 정의된 메소드에서만 호출이 가능하다.

접근제어자 허용범위
  • public > protected > default > private

캡슐화

  • 캡슐화는 클래스안에 무엇을 넣을까에 대한 이론이다.
객체지향의 관점에서 캡슐은 클래스에 해당이 된다.
  • 하나의 목적을 이루기 위해 관련 있는 모든 것을 하나의 클래스에 담는것
package yoon;

class SinusCap {
    void sniTake(){
        System.out.println("콧물이 싹~ 납니다. ");
    }

    void sneTake(){
        System.out.println("재채기가 멎습니다.");
    }

    void snuTake(){
        System.out.println("코가 뻥 뚫립니다.");
    }

    void take(){
        sniTake();
        sneTake();
        snuTake();
    }
}

class ColdPatient {
    void takeSinus(SinusCap cap){
        cap.take();
    }
}

public class OneClassEncapsulation {
    public static void main (String [] args){
        ColdPatient suf = new ColdPatient();
        suf.takeSinus(new SinusCap());
    }
}
//result
콧물이 싹~ 납니다.
재채기가 멎습니다.
코가 뻥 뚫립니다.
  • 캡슐화는 절대로 클래스를 크게 만들라는 뜻이 아니다. 캡슐화에서 말하고자하는 것은 크기가 아닌 내용이다.
Written on February 27, 2018