[JAVA] 객체지향 프로그래밍 - 제어자 public부터 abstract까지

2023. 11. 29. 16:02프로그래밍 언어/Java

1. 제어자란

제어자(modifier)는 클래스, 변수 또는 메서드 선언부에 함께 사용되며 부가적인 의미를 부여한다. 제어자의 종류는 접근 제어자와 그 외 제어자로 나눌 수 있다.

접근 제어자 : public, protected, default, private

그 외 제어자 : static, final, abstract,...

접근 제어자는 한 번에 하나만 선택해서 사용할 수 있고, 그 외 제어자는 접근 제어자와 함께 조합해서 사용할 수 있다.


2. static - 클래스의

static은 '클래스의' 의미를 부여한다. static 멤버 변수는 모든 인스턴스가 공유하는 클래스의 멤버 변수이다. staic은 멤버 변수, 메서드, 초기화 블록에 사용된다. static 메서드는 인스턴스 멤버를 사용하지 않는 메서드에 사용한다.


3. final - 변경될 수 없는

final은 '변경될 수 없는'의미를 부여한다. 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 된다. 클래스에 사용되면 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

  • 클래스에 사용 : 확장할 수 없는 클래스가 된다. 다른 클래스의 조상이 될 수 없다.
  • 메서드에 사용 : 오버라이딩을 통해 재정의될 수 없다.
  • 변수에 사용 : 값을 변경할 수 없는 상수가 된다.
    • final이 붙은 인스턴스 변수는 생성자에서 초기화되도록 할 수 있다. 이 기능을 활용하면 각 인스턴스마다 상수를 다르게 정의할 수 있다.

4. abstract - 미완성의

abstract는 '미완성의'의미를 부여한다. 메서드에 사용하면 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않은 추상 메서드를 선언하는 데 사용된다.

  • 클래스에 사용 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
  • 메서드에 사용 : 선언부만 작성한 추상 메서드임을 의미한다.

추상 클래스는 인스턴스를 생성할 수 없고 상속과 오버라이딩을 용도로 만든 클래스이다.


5. 접근 제어자

접근 제어자는 멤버 또는 클래스에 사용되며, 키워드에 맞게 접근을 제한한다.

  • public : 접근 제한이 전혀 없다.
  • protected : 같은 패키지와 다른 패키지의 자손 클래스에서 접근이 가능하다.
  • default  : 같은 패키지 내에서만 접근이 가능하다.
  • private : 같은 클래스 내에서만 접근이 가능하다. 상속받은 클래스도 private 부모 클래스에는 접근할 수 없다.

접근 제어자를 사용하면 외부로부터 데이터를 보호하고 내부적으로만 사용되는 불필요한 부분을 감추기 위해 사용하는데, 이를 캡슐화라고 한다.

만약 메서드 하나를 변경해야 하는데, 이 메서드가 public이라면 메서드를 변경한 후 테스트해야 하는 범위가 넓다. 하지만 접근 제어자가 default라면 패키지 내부만 확인하면 되고, private라면 클래스 하나만을 살펴보면 된다. 

 

접근 제어자 때문에 어떤 클래스의 멤버 변수에 접근할 수 없는 경우가 많다. 그래서 겟터와 셋터 메서드를 정의하여 멤버 변수를 읽고 쓸 수 있다. 

public class Person {
    private String name;
    private int age;

    // 겟터 메서드: 멤버 변수의 값을 반환하는 메서드
    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    // 셋터 메서드: 멤버 변수의 값을 설정하는 메서드
    public void setName(String newName) {
        this.name = newName;
    }

    public void setAge(int newAge) {
        this.age = newAge;
    }
}

 

또 주의해야 할 점이 있는데, 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. 자손 클래스의 생성자에서 조상 클래스의 생성자를 호출해야 하는데 private에는 접근할 수 없기 때문이다. 따라서 생성자가 private면 클래스를 final로 지정하는 것이 일반적이다.


6. 제어자들의 조합

제어자 간의 속성 때문에 조합할 때 주의해야 할 사항이 꽤 있다. 하나하나 외우려 하지 말고 각 제어자들의 속성을 기억해 두면 실수할 일이 줄어든다.

  • absract : 상속이 필수이다.
  • private : 상속이 금지된다.
  • final : 상속이 금지된다.

위의 속성들 때문에 final과 private는 같이 사용할 확률이 높고 abstract와 private는 같이 사용할 수 없다.