Starbucks Caramel Frappuccino
본문 바로가기
  • 그래 그렇게 조금씩
JAVA/Java Intermediate(OOP)

5. 접근 제어자와 캡슐화

by Toughie 2024. 3. 3.

 

 

For Safe Programming !

 

객체 지향 프로그래밍에서 관련된 데이터와 기능, 즉 필드(데이터)와 메서드는 클래스로 묶어서 관리하기로 했다.

하지만 이것만으로는 부족하다. 기껏 클래스에 잘 담아뒀는데 누가 마음대로 꺼내서 건드리면 말짱 도루묵이기 때문이다.

이를 위해서 존재하는 것이 바로 접근 제어자(access modifier)이다.

접근 제어자는 말 그대로 접근의 수준을 제어할 수 있도록 하는 것이다. '필요한 부분만 공개하겠다 !'


캡슐화(Encapsulation)

객체지향의 4가지 특징 중 하나인 캡슐화는 말 그대로 캡슐(클래스) 안에 데이터와 로직을 담는 것을 말한다.

즉 데이터(필드)와, 데이터 조작 메서드를 묶어서 관리하고 접근 제어자를 통해 외부의 무분별한 접근을 제한하는 것이다.

 

1. 데이터는 일단 숨기고 보자.

객체에는 속성과 기능이 있다. 즉 데이터와 메서드가 있는데, 기껏 데이터를 관리하는 메서드를 만들어 놔도 

객체를 다루는 곳에서 데이터에 직접 접근해서 바꿔버리면 메서드는 무용지물이 되어 버릴 것이다.

(ex. 은행 계좌를 관리하는 클래스가 있는데, 계좌라는 데이터에 직접 접근해서 1조로 만들어 버리면 아주 곤란할 것이다 😬)

따라서 데이터는 우선 외부에 노출시키지 말고, 조작이 필요하다면 해당 메서드를 만들고 해당 메서드만 외부에 노출시키자. (Getter, Setter)

class Capsule {
	private int num = 10;
    //getter
	public int getNum() {
		return num;
	}
    //setter
	public void setNum(int a) {
		num = a;
	} 
}

2. 기능은 필요한 것만 제공하자.

클래스 안에는 데이터를 조작하는 메서드가 굉장히 많을 것이다.

하지만 이 객체를 불러서 사용하는 데 있어 이런 메서드들을 전부 이해하거나 사용할 필요는 없을 것이다.

우리가 스마트폰을 사용하면서 간단한 터치나 버튼만 사용하지, 운영체제나 내부 프로그램 로직을 전부 이해하거나 알 수는 없듯이 말이다.

 

또한 협업의 측면에서도 호출해서는 안되거나, 호출할 필요가 없는 메서드까지 노출해 두면 다른 개발자가 보고 혼란에 빠질 수 있다.

(이걸 호출해야 된다는 거야 뭐야..?) 최대한 선택지를 줄여서 제공하는 것이 원활한 협업에도 도움이 될 것이다.

기본적으로 public으로 해두면 누군가 접근하거나 호출할 수 있는 가능성이 있다는 것을 염두에 두자.


접근 제어자의 종류(필드 & 메서드)

접근 제어자의 종류는 총 4가지가 있다.

priavte -> default -> protected -> public 순서로 오픈된다고 보면 된다.

 

private

접근 제한 수준이 가장 높다. 말 그대로 프라이빗하게 객체 내부에서만 접근이 가능하다.

외부에서는 전혀 호출이나 접근이 불가능하다.

(Swift에서 싱글톤 패턴을 사용하면서 private init을 했던 것처럼 java에서도 싱글톤 패턴을 사용한다면 아래처럼 할 수 있을 것이다.)

 

public class Singleton {
    // 정적 변수(instance)는 클래스가 로드될 때 한 번만 초기화.
    private static Singleton instance;

    // private를 통해 외부에서 인스턴스화방지.
    private Singleton() {}
}

 

default(package-private)

접근 제어자를 따로 적어주지 않으면 지정되는 기본 접근제어 수준이다.

'같은 패키지 내부'에 있다면 접근이나 호출이 가능하다.

 

protected

같은 패키지 내부에 있거나, 패키지가 다르더라도 상속 관계의 호출이나 접근이 허용되는 수준이다.

 

public

가장 오픈되어 있다. 어디서든 접근하거나 호출할 수 있다.


접근 제어자의 종류(클래스 레벨)

지금까지는 클래스 앞에 public이 붙은 것에 큰 의문을 품지 않았을 수도 있지만,

클래스 수준에서는 접근 제어자를 public 또는 default만 사용할 수 있다. 

 

클래스 레벨의 public

1. 한 자바 파일 안에서 public 클래스는 오직 하나만 존재할 수 있다.

2. public 클래스의 이름은 자바 파일의 이름과 반드시 동일해야 한다.

 

클래스 레벨의 default

pulbic 클래스가 아닌 default 클래스는 제약 없이 여러 개 만들 수 있다.

 

 


학습 출처

김영한의 실전 자바 - 기본 편

'JAVA > Java Intermediate(OOP)' 카테고리의 다른 글

7. final  (0) 2024.03.07
6. static 정적  (3) 2024.03.07
4. 생성자 Construct  (0) 2024.03.02
3. 절차 지향 vs 객체 지향(OOP)  (0) 2024.02.23
2. 기본형과 참조형 (Primitive, Reference), NullPointerException  (0) 2024.02.12