접근 제어자는 멤버 또는 클래스에 사용되어, 해당한느 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
클래스나 멤버에 -주로 멤버- 접근 제어자를 사용하는 이유는 클래스 내부에 선언된 데이터를 보호하기 위해서이다.
1) 데이터가 유효한 값을 유지하도록, 함부로 변경하지 못하도록 하기 위해서
2) 클래스 내에서만 사용되는, 내부 작업을 위해 임시로 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추기 위해서
이는 정보 은닉 (information hiding)이라 하며, 객체지향개념의 캡슐화 (encapsulation)에 해당하는 내용이다.
보통 클래스의 멤버변수의 접근 제어자를 private
으로 하고, 이들을 다루기 위한 getter & setter
함수를 public
으로 한다. 이를 통해 멤버변수에 직접적인 접근은 허가하지 않고, 메서드를 통한 접근만 허용한다.
✋ 정보은닉과 캡슐화는 다르다
은닉화
는 속성을,캡슐화
는 기능 (메서드)를 담당해 중요한 정보를 은닉한다.은닉화
는 외부에서 객체의 속성에 함부로 접근하지 못하도록 하는 것이며,캡슐화
는 메서드 안에서 어떠한 일이 일어나는지를 모르게 해야한다는 것이다.- getter, setter에서 메서드 명에 변수 이름을 노출시키면 완벽한
캡슐화
를 이루지 못한다.- 중요한 정보를 담은 코드하면 캡슐화는 필수이다.
참고: https://dokdogalmaegi.tistory.com/48
생성자에 접근 제어자를 사용함으로써 인스턴스의 생성을 제한할 수 있다. 보통 생성자와 접근 제어자는 클래스의 접근 제어자와 같지만, 다르게 지정할 수도 있다.
생성자의 접근 제어자를 private
으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.
대신 인스턴스를 생성해서 반환해주는 public 메서드를 제공함으로써 외부에서 클래스의 인스턴스를 사용할 수 있도록 한다. 이 메서드는 public인 동시에 static일 것이다.
이처럼 생성자를 통해 직접 인스턴스를 생성하지 못하게 하고 public 메서드를 통해 인스턴스에 접근하게 함으로써 사용할 수 있는 인스턴스의 개수를 제한할 수 있다.
그리고 Math클래스는 몇 개의 상수와 static 메서드만으로 구성되어 있기 때문에 인스턴스를 생성할 필요가 없다. 그래서 외부로부터의 불필요한 접근을 막기 위해 생성자의 접근 제어자를 private
으로 지정하였다.
⭐️ 실무적인 활용
1. 모든 변수는 private으로 선언
2. 변수에 대해서 getter, setter 함수를 만들어서 값을 읽고 쓴다.
3. 하나의 파일에서 public 클래스는 하나만 존재한다.
- 파일에서 진입점이 하나만 만들기 위해서
- 객체 지향 관점에서 하나의 파일은 하나의 기능만 수행하기 위해서
- 원래 파일 하나 당 클래스 하나만 들어간다 (프로젝트마다 다르다.)