제어자

2025. 2. 21. 16:59Java/객체지향

1. 제어자란?

  • 제어자란 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.
  • 제어자의 종류
    • 접근 제어자: public, protected, default, private -> 한 가지 선택하여 사용
    • 그외 제어자: static, final, abstract 등

2. 접근 제어자 (access modifier)

  • 역할: 멤버 또는 클래스에 사용되어, 해당하는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한함 
  • 종류 (public > protected > default > private) 
    • public : 접근 제한이 전혀 없다
    • protected : 같은 패키지 내에서 + 다른 패키지의 자손 클래스에서 접근 가능
    • default : 같은 패키지 내에서만 접근이 가능하다. (접근 제어자가 안 붙어 있는 경우)
    • private : 같은 클래스 내에서만 접근이 가능하다
  • 대상에 따라 사용할 수 있는 접근 제어자
    • 클래스: public, default
    • 메서드, 멤버변수: public, protected, default, private
    • 지역변수: X 
  • ​ 접근 제어자를 사용하는 이유: 캡슐화, 데이터 감추기 -> 데이터 보호, 복잡성 감소
    • 외부로부터 데이터를 보호하고 외부에는 내부적으로만 사용되는 부분을 감춘다.
    • 접근 클래스 내에서만 사용되는 멤버변수나 부분작업을 처리하기 위한 메서드 등의 멤버들을 클래스 내부에 감추고, 외부에 노출시키지 않음으로써 복잡성을 줄일 수 있다.
  • ​생성자의 접근 제어자를 private으로 지정
    • 생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게된다. 그래도 클래스 내부에서는 인스턴스를 생성할 수 있다.
    • 1) Singleton기법: 대신 인스턴스를 생성해서 반환해주는 public메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용할 수 있도록 한다. 이 메서드는 public인 동시에 static이어야한다. 이렇게 하면 생성자를 통해 직접 인스턴스 생성X 메서드를 통해서만 가능하므로 사용할 수 있는 인스턴스 개수 제한 가능
    • 2) 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없음. 클래스 앞에 final을 추가하여 상속할 수 없는 클래스임을 알리는 것이 좋다

3.  그외 제어자

1) static - 클래스의, 공통적인

  • static이 사용될 수 있는 곳: 멤버변수, 메서드, 초기화블럭
  • static변수 = 클래스변수 = 공유변수
  • 클래스 변수 vs 인스턴스 변수 
    • 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지
    • 클래스 변수는 인스턴스와 관계없이 같은 값을 갖는다. 하나의 클래스 변수를 모든 인스턴스가 공유. 
    • 인스턴스 변수는 해당 인스턴스의 주소(this)를 통해 참조
    • 클래스 변수는 클래스명을 통해 참조
  • 주요 용도
    • 여러 곳(ex. 다른 객체에서 static A에 접근)에서 사용할 때
    • 전역변수(ex. 프로그램 전체에서 글로벌 변수 또는 메소드)로 주로 사용
  • 자바는 객체지향적 코드를 선호하므로 되도록 static 변수를 사용하지 않는 것이 좋다.

2) final - 마지막의, 변경될 수 없는

  • final이 사용될 수 있는 곳: 거의 모든 곳 (클래스, 메서드, 멤버변수, 지역변수)
    • 지역 변수 : 초기화 이후 값 변경 불가
    • 매개 변수 : 호출 시 전달한 값 변경 불가
    • 인스턴스 변수 : 인스턴스 생성 초기화 이후에 값 변경 불가
    • 클래스 변수 (static) : 프로그램 시작 이후 값 변경 불가
    • non-static method : 메소드 재작성 (오버라이딩) 불가
    • static method : 메소드 재작성 불가
    • 클래스 : 상속 불가 
  • final변수의 초기화
    • 일반적으로 선언과 초기화를 동시에 함
    • 인스턴스 변수의 경우 생성자에서 초기화 되도록 할 수 있다. 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능. 
    • static field는 생성자 초기화는 불가능하며, static 초기화 블럭을 활용할 수 있다.
  • 주요 용도: 코딩할 때 가변요소를 줄이기 위해 하드코딩을 지양해야하고, 부득이하게 특정 숫자를 사용해야하는 경우에는 그 숫자를 final 변수로 선언하여 그 변수를 사용한다.

3) abstract - 추상의, 미완의

  • abstract가 사용될 수 있는 곳: 클래스, 메서드
  • 메서드의 선언부만 작성하고 실제 수행내용은 구현하지 않는 추상메서드를 선언하는데 사용된다.
  • 추상메서드를 갖는 클래스는 자동으로 추상클래스가 되므로 클래스 앞에도 final을 선언한다.

 

4.  제어자의 조합

  • 대상에 따라 사용할 수 있는 제어자 정리
대상
사용가능한 제어자
클래스
public, default / final, abstract
메서드
모든 접근 제어자 / final, abstract, static
멤버변수
모든 접근 제어자 / final, static
지역변수
X / final

 

  • 제어자를 조합시 주의 사항
    • 메서드에 static과 abstract를 함께 사용할 수 없다.
    • 클래스에 abstract와 final을 동시에 사용할 수 없다.
    • abstract 메서드의 접근 제어자가 private일 수 없다.
    • 메서드에 private과 final을 같이 사용할 필요는 없다.