자바 제어자

황희윤·2023년 11월 8일

제어자(Modifier)

  • 제어자는 클래스나 속성, 메서드의 선언부에 사용해서 부가적인 기능을 제어한다.

  • 제어자는 크게 접근 제어자와 일반 제어자로 나눈다.

접근 제어자(Access Modifier)

public

  • 클래스를 참조할 수 있는 곳(객체 생성이 가능한)이면 어디에서나 참조 가능
  • 단, 하나의 소스 파일에는 하나의 public 클래스만이 있을 수 있다.
  • 소스 파일의 이름은 파일 내에 있는 public 클래스의 이름과 일치해야 한다

protected

  • 선언된 클래스 내와 같은 패키지 내, 같은 소스 파일 내, 선언된 클래스를 상속받는 하위 클래스에서 참조 가능
  • 패키지 외부에서는 상속만 가능하다.
  • package와 차이점은 다른 패키지에 속한 클래스가 해당 클래스의 자식(child) 클래스라면 생성자를 호출할 수 있다.
  • 상위 클래스의 멤버가 protected이면 하위 클래스의 멤버는 protected나 public이어야 한다.

package

  • protected와 동일하게 적용되지만, 다른 패키지에서는 생성자를 호출할 수 없다.
  • 접근 제어자의 default

private

  • 오로지 선언된 클래스 내부에서만 참조 가능
  • 하위 클래스(상속)에서도 접근할 수 없다.

📍 제어자는 여러 개 사용이 가능하지만, 접근 제어자는 1개만 사용 가능하다.

📍 여러 개의 제어자를 사용할 때는 접근 제어자를 먼저 지정하고 일반 제어자를 뒤에 지정한다.

📍 보통 객체의 속성은 외부에서 접근하지 못하도록 private으로 선언해 막고, 대신 메서드public으로 선언해서 속성(데이터)에 간접적으로 접근할 수 있도록 한다. 그래서 객체 간 상호 작용은 오직 메서드를 통해서만 가능하다.

[더 알아보기]

싱글턴 패턴

Oracle, MySQL, MariaDB등 여러가지 RDBMS를 사용한다고 가정했을 때, 자바 프로그램은 DBMS가 어떤 종류인지에 관계없이 구현한 코드를 사용할 수 있어야 한다.
즉, RDBMS와 의존성을 낮추기 위해서 중간 관리 객체가 필요하다.

싱글턴 패턴 : 하나의 클래스에서 오직 하나의 객체만 생성하도록 하는 기법

  • 클래스 외부의 누구도 객체를 생성하지 못하게 한다.

  • 싱글턴은 필요할 때 생성되어(lazy) 필요 시점까지 메모리의 요구를 줄인다.

  • 생성자를 private로 지정해서 new로 생성할 수 없게 하고, public static 메서드를 사용해서만 객체에 접근할 수 있게 한다.

  • 싱글턴은 오직 단일 자원(resource)만 가지고 있고, 단일 자원의 속성에 접근하는 것을 공유할 필요가 있을 때 유용하다.

  • 데이터베이스 연결이나 네트워크 연결을 할 때 공용 자원에 접근할 때 사용하면 효율적이다.

일반 제어자

static, final, abstract, native, transient, synchronized, volatile

final

변경할 수 없는

  • 클래스 : 클래스를 변경할 수 없고, 확장이 불가능하다. 그래서 다른 클래스의 상위 클래스가 될 수 없다.

  • 메서드 : 메서드를 변경할 수 없고 재정의 할 수 없다. 그래서 읽기 전용 메서드가 된다.

  • 속성(멤버 변수)과 지역 변수 : 상수

  • final로 멤버 변수 선언만 하고 초기화하지 않은 다음, 생성자에서 한 번 초기화하는 것도 가능하다.

public class MyFrame extends Frame {
	public final int FRAME_WIDTH;
    public final int FRAME_HEIGHT;
    
    public MyFrame(int w, int h){
    	FRAME_WIDTH = w;
        FRAME_HEIGHT = h;
        
        this.setSize(FRAME_WIDTH, FRAME_HEIGHT);
    }
}
  • 이렇게 하면 각 객체마다 final이 지정된 속성(멤버 변수)이 다른 값을 가지면서 변경이 불가능하다.

static

synchronized

  • 메서드를 시작할 때 객체를 잠그고 끝나면 풀어주는 역할
  • 객체가 이미 잠겨져 있으면 이 메서드는 객체가 풀릴 때까지 기다린 후 실행하도록 제어한다.
  • 다중 스레드 환경에서 주로 사용되며, 스레드의 동기화에 사용한다.
  • 그래서 동일한 객체의 두 synchronized 메서드는 절대 동시에 실행되지 않는다.

native

  • C언어로 작성된 스텁(stub) 파일에서 호출되는 메서드를 지정할 때 사용한다.

transient

  • 객체 직렬화(object serialization) 과정에서 직렬화되지 않는 속성을 지정할 때 사용한다.
  • 일시적이라는 뜻이다.
  • 직렬화 : 객체를 파일의 형태 등으로 저장하거나, 통신하기 쉬운 포맷으로 변환하는 과정
  • 이펙티브 자바에서는 자바에서 제공하는 직렬화 기능을 사용하지 않을 것을 강력히 권장한다.
  • 자바에서 제공하는 직렬화는 여러가지 문제(특히 치명적인 보안 이슈)를 안고있다고 하며, 그 대안으로는 책에서는 JSON등의 포맷을 추천한다.

volatile

  • 스레드의 동작과 관련된 멤버 변수의 제어자
  • 하나의 스레드의 volatile 변수들에 대한 연산은 스레드가 요청한 순서대로 진행되도록 보장

abstract

  • 몸체가 없는 클래스와 메서드를 선언할 때 사용
  • 추상적
  • final과 abstract는 같이 사용할 수 없다. 왜냐하면 final은 확장이 불가능한데 abstract는 상속을 통해서 완성되기 때문이다. 마찬가지로 상속이 불가능한 private와도 같이 사용할 수 없다.
profile
HeeYun's programming study

0개의 댓글