Java스터디(3/24)

강민지·2024년 3월 22일

Java

목록 보기
1/1

6강 접근제어자

접근제어자

 자바에서 pulbic, private와 같은 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.

 
접근제어자의 종류

  • private: 모든 외부 호출을 막는다.
  • default: 같은 패기지 안에서 호출은 허용한다.
  • protected: 같은 패키지 안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.
  • public: 모든 외부 호출을 허용한다.

순서대로 private 이 가장 많이 차단하고, public 이 가장 많이 허용한다.
private -> default -> protected -> public

 

접근제어자가 필요한 이유!

 예를 들면 우리는 객체를 생성할 때 변수를 선언하곤 한다. 하지만 그 변수가 default나 public이라고 생각해보자.
 A라는 개발자는 a라는 변수를 변경하기 위한 조건식 포함한 a-1메서드를 만들었다. 하지만 B라는 개발자는 a-1메서드를 사용하지 않고 변수 a에 직접 접근하여 a변수를 변경 시켜버렸다. 이 프로그램은 a-1조건식을 지키지 않으면 강제 종료시켜버린다.
B개발자가 a변수에 직접 접근하여 변수를 변경한 탓에 프로그램이 강제 종료되어 버렸다.
이럴경우 우리는 a변수를 함부로 변경하지 못하도록 조치를 취해야 한다. 그럴때 사용하는 것이 접근 제어자 이다.

 

접근 제어자 사용 위치

접근 제어자는 필드와 메서드, 생성자에 사용된다.

public class Speaker { //클래스 레벨
 	private int volume; //필드
    
 	public Speaker(int volume) {} //생성자
    
 	public void volumeUp() {} //메서드
 	public void volumeDown() {}
 	public void showVolume() {}
}

접근 제어자의 핵심은 속성기능외부로 부터 숨기는 것이다.

  • private: 나의 클래스 안으로 속성과 기능을 숨길 때 사용, 외부 클래스에서 해당 기능을 호출할 수 없다.
  • default: 나의 패키지 안으로 속성과 기능을 숨길 때 사용, 외부 패키지에서 해당 기능을 호출할 수 없다.
  • protected: 상속 관계로 속성과 기능을 숨길 때 사용, 상속 관계가 아닌 곳에서 해당 기능을 호출할 수 없다.
  • public: 기능을 숨기지 않고 어디서든 호출할 수 있게 공개한다.

 

접근 제어자 사용 - 필드, 메서드

package access.a;

public class AccessData {

    public int publicField;
    int defaultField;
    private int privateField;

    public void publicMethod() {
        System.out.println("publicMethod 호출" + publicField);
    }

    void defaultMethod() {
        System.out.println("defaultMothod 호출" + defaultField);
    }

    private void privateMethod() {
        System.out.println("privateMethod 호출" + privateField);
    }

    public void innerAccess(){
        System.out.println("내부호출");
        publicField = 100;
        defaultField = 200;
        privateField = 300;
        publicMethod();
        defaultMethod();
        privateMethod();
    }
    //내부 호출일 경우는 AccseeData에 포함되어 있는 자신의 private필드와 메서드에 모두 
    접근 할 수 있다.
}

마지막에 innerAccess() 가 있는데, 이 메서드는 내부 호출을 보여준다. 내부 호출은 자기 자신에게 접근하는 것이다. 따라서 private 을 포함한 모든 곳에 접근할 수 있다

외부에서 이 클래스에 접근해보았다.

package access.a;

public class AccessInnerMain {
    public static void main(String[] args) {
    
        AccessData data = new AccessData();

        data.publicField = 1;    
        data.publicMethod();
		// public은 같은 메서드 안에서 접근이 가능 하므로 필드 메서드 모두 접근이 가능했다.

        data.defaultField = 2;
        data.defaultMethod();
        //defalut는 같은 패키지에서 접근할 수 있다. 
        AccessInnerMainAccessData는 같은 패키지이지 때문에 default접근 제어자에 
        접근 할 수 있었다.

//        data.privateField = 3;
//        data.privatMethod();

        data.innerAccess();
        // private는 AccsccData내부에서만 접근 할 수 있다. 
         따라서 필드와 메서드 둘다 접근 불가다. 
         하지만 innerAccess()메서드는 public이기 때문에 외부에서 호출 할 수 있다.  
    }
}

실행결과

publicMethod 호출 1
defaultMethod 호출 2
내부 호출
publicMethod 호출 100
defaultMethod 호출 200
privateMethod 호출 300

  위의 경우는 같은 패키지 안에서 실행되었다 하지만 만약 다른 패키지에서 default접근 제어자의 변수나, 메서드에 접근하게 된다면 접근 할 수 없다. 당연히 private 접근 제어자의 경우도 접근 불가다.

  하지만 innerAccess의 경우는 public이기 때문에 접근 가능하고, 해당 메서드 안에서는 자신의 private필드와 메서드에 접근 가능하다.

 

접근 제어자 사용 - 클래스 레벨

클래스 레벨의 접근 제어자 규칙

  • 클레스 레벨의 접근제어자는 public, default만 사용 가능하다.
    ( private, protected는 사용할 수 없다. )
  • public 클래스는 반드시 파일명과 이름이 같아야 한다.
    • 하나의 자바 파일에 public클래스는 하나만 등장할 수 있다.
    • 하나의 자바 파일에 default접근 제어자를 사용하는 클래스는 무한정 만들 수 있다.

 

캡슐화

캡슐화(Encapsulation)는 객체 지향 프로그래밍의 중요한 개념 중 하나다.
캡슐화(Encapsulation)는 데이터와 해당 데이터를 처리하는 메서드를 하나로 묶어서 외부에서의 접근을 제한하는 것을 말한다.
캡슐화(Encapsulation)를 통해 데이터의 직접적인 변경을 방지하거나 제한할 수 있다.

캡슐화속성과 기능을 하나로 묶고, 외부에 꼭 필요한 기능만을 노출하고 나머지는 모두 내부로 숨기는 것이다

숨겨야 하는 것과 노출해야 하는것?

  • 데이터를 숨겨라
    객체에는 속성(데이터)과 기능(메서드)이 있다. 캡슐화에서 가장 필수로 숨겨야 하는 것은 속성(데이터)이다. 객체의 데이터는 객체가 제공하는 기능인 메서드를 통해서 접근해야 한다.
  • 기능을 숨겨라
    객체의 기능 중에서 외부에서 사용하지 않고 내부에서만 사용하는 기능들이 있다. 이런 기능도 모두 감추는 것이 좋다. 사용자 입장에서 꼭 필요한 기능만 외부에 노출하자. 나머지 기능은 모두 내부로 숨기자

데이터는 모두 숨기고, 꼭 필요한 기능만 노출하는 것이 좋은 캡슐화이다.

그래서 캡슐화를 해서 좋은점?!

  1. 코드의 중복을 피할 수 있다.
  2. 객체에 대해 사용자가 알아야 할 지식의 양을 줄여준다.
  3. 외부에서의 조작으로 속성을 변경하는 일을 막을 수 있다.

0개의 댓글