[Java] 제어자(modifier)

HodooHa·2024년 4월 23일
0

제어자(modifier)란?

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

  • 접근 제어자 - public, protected, default, private
  • 그 외 - static, final, abstract, native, transient, synchronized, volatile, strictfp

static - 클래스의, 공통적인

static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

인스턴스 멤버를 사용하지 않는 메서드는 static을 붙여서 static메서드로 선언하는 것을 고려하자.
호출 시 편리하고 속도도 더 빠르다.
static초기화 블럭은 클래스가 메로리에 로드될 때 단 한번만 수행되며, 주로 클래스 변수(static 멤버변수)를 초기화하는데 주로 사용된다.

[예시1]

class StaticTest {
	static int width = 200;  // 클래스 변수(static변수)
    static int height = 20; // 클래스 변수(static변수)
    
    static { // 클래스 초기화 블럭
    	// static 변수의 복잡한 초기화 수행
    }
    
    static int max(int a, int b) { // 클래스 메서드(static 메서드)
    	return a > b ? a : b;
    }
}

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

final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수

대표적인 final클래스로는 String과 Math가 있다.

[예시2]

class FinalTest { // 조상이 될 수 없는 클래스
	final int MAX_SIZE = 10;  // 값을 변경할 수 없는 멤버변수(상수)
    
    final void getMaxSize() { // 오버라이딩할 수 없는 메서드(변경불가)
    	final int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수(상수)
   		return MAX_SIZE; 
   }
}

abstract - 추상의, 미완성의

abstract가 사용될 수 있는 곳 - 클래스, 메서드

[예시3]

abstract class AbstractTest { // 추상클래스(추상메서드를 포함한 클래스)
	abstract void move(); // 추상메서드(구현부가 없는 메서드)

접근 제어자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자

  • private - 같은 클래스 내에서만 접근이 가능하다.
  • default - 같은 패키지 내에서만 접근이 가능하다.
  • protected - 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
  • public - 접근 제한이 전혀 없다.

접근 범위가 넓은 쪽에서 좁은 쪽의 수 나열하면 하기와 같다.

public > protected > default > private

[주의사항!!]

1. 메서드에 static과 abstract를 함께 사용할 수 없다.

  • static메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다.

2. 클래스에 abstract와 final을 동시에 사용할 수 없다.

  • 클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.

3. abstract메서드의 접근 제어자가 private일 수 없다.

  • abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면 자손 클래스에서 접근할 수 없기 때문이다.

4. 메서드에 private과 final을 같이 사용할 필요는 없다.

  • 접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다. 이 둘 중 하나만 사용해도 의미는 충분하다.

[출처] 자바의 정석, 남궁성, 도우출판

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

profile
성장하는 개발자, 하지은입니다.

0개의 댓글