[3단원]캡슐화: 정보 은닉

객체 멤버의 접근 제어자에 대한 이해

자바의 접근 제어자

  1. private
    1. 클래스 내부에서만 접근가능
  1. default
    1. 같은 패키지 내에서만 접근가능
  1. protected
    1. 같은 패키지 또는 서브 클래스에서 접근가능
  1. public
    1. 어디서든 접근 가능

객체 멤버와 정적 멤버

  • 객체 멤버
    • 객체가 생성될 때마다 각 객체의 내부에 존재
  • 정적 멤버
    • 클래스 단위로 하나만 존재함.

문제

package org.example.연습장.encapsulation01;

public class ClassA {
    private int pri;
    int def;
    protected int pro;
    public int pub;
    
    void runSomething() {
    
    }
    
    static void runStaticThing() {
    
    }
    
}
Class A 의객체멤버
privatedefaultprotectedpublic
패키지01ClassArunSomething()OOOO
패키지01ClassArunStaticThingOOOO
패키지01ClassBrunSomething()XOOO
패키지01ClassBrunStaticThingOOOO
Class AA
패키지01ClassAArunSomething()XOOO
패키지01ClassAArunStaticThingOO
패키지02ClassABrunSomething()XXOO
패키지02ClassABrunStaticThingOOOO
패키지02ClassCrunSomething()XXXO
패키지02ClassCrunStaticThingOOOO
  • ClassAA 와 ClassAB 는 A를 상속받았다.

제어자를 잘 사용하면 높은 응집도와 낮은 결합도를 유지할 수 있기에..

잘 적용해서 써야하겠다.

근데 거의 대부분의 상황에서 private 을 사용할 수 밖에 없을거같다는 개인적인 생각이다.

정적 멤버와 그 사용법

  1. 일관된 접근법이 필요하다
    • 정적 멤버에 접근하는 경우 클래스명.정적멤버 형식을 사용해야한다.
    • 객체를 생성한 후 객체참조변수명.정적멤버 형식으로 접근하는 것도 가능은 하겠지만
    • 해당 방식은 권장되지 않는다고 한다.
  1. T메모리상에서의 접근
    • 위 그림을 보자.
    • 만약 객체참조변수명.정적멤버 로 접근하게 된다면

      객체참조변수가 가리키는 힙영역에 있는 객체 의 주소로 이동 ⇒ 객체의 정적멤버로 포인팅이 된다.

    • 개념적으로도 사실상 공유변수의 어감이기에, 클래스명.정적멤버 사용으로 해당 변수는 클래스적 차원에서 관리된다는 것을 명시할 수 있다고 생각한다.
    • 물론, 정적 영역으로 바로 접근하는 것이 조금더 빠를수도 있을 거라 생각한다. 그런데 진짜 미미할듯.

Uploaded by N2T