티스토리 뷰

study/Java

제어자 (modifier)

xoxowo 2022. 12. 20. 15:35

제어자 (modifier)

제어자 (modifier)는 클래스, 변수, 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여

제어자의 종류는 접근 제어자와 그 외 제어자로 나눌 수 있다.

 

클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능

단, 접근 제어자는 4가지 중 하나만 선택해서 사용할 수 있다.

 

접근 제어자는 멤버 또는 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활을 한다.

 

접근 제어자 public, protected, default, private (4가지 중 1개만 사용 가능)

그 외 제어자 static, fianl, abstract, native, transient, synchronized, volatile, stricftp

 

 

static 

'공통적인' 의미를 가지고 있다.

멤버 변수, 메서드, 초기화 블럭에 사용될 수 있다.

인스턴스를 생성하지 않고도 사용 가능하다.

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

(인스턴스 메서드와 static메서드의 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.)

 

※ static 초기화 블럭은 클래스가 메모리에 로드될 때 단 한번만 수행되며, 주로 클래스변수(static 변수)를 초기화하는데 주로 사용된다.

 

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

제어자 대상 의미
static 멤버변수 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다
클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다
클래스가 메모리에 로드될 때 생성된다
메서드 인스턴스를 생성하지 않고도 호출 가능한 static 메서드가 된다
static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다
class StaticTest {
	static int width = 200; // 클래스 변수(static 변수)
    static int height = 100; // 클래스 변수(static 변수)
    
    static { // 클래스 초기화 블럭
    }
    
    static int max(int a, int b) { // 클래스 메서드 (static 메서드)
    	return a > b ? a : b;
    }
}

 

 

fianl 

'마지막의', '변경될 수 없는' 의미를 가지며, 거의 모든 대상에 사용할 수 있다.

변수에 사용되면 값을 변경할 수 없는 상수가 된다.

메서드에 사용되면 오버 라이딩을 사용할 수 없다.

클래스에 사용되면 자손 클래스를 정의할 수 없다.

 

※대표적인 fianl 클래스로 String과 Math가 있다.

 

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

제어자 대상 의미
fianl 클래스 변경될 수 없는 클래스, 확장될 수 없는 클래스가된다.
fianl로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 변경될 수 없는 메서드, fianl로 지정된 메서드는 오버라이딩이 불가하다
멤버변수 변수 앞에 fianl이 붙으면, 값을 변경할 수 없는 상수가 된다
지역변수
fianl class FianlTest { // 조상이 될 수 없는 클래스
	fianl int MAX_SIZE = 100; // 값을 변경할 수 없는 멤버변수(상수)
    
    fianl void getMaxSize() {	// 오버라이딩할 수 없는 메서드 (내용 변경 불가)
    	fianl int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;	
    }
}

 

 

 

abstract 

'추상의', '미완성'의 의미를 가지고 있다.

실제 수행내용은 구현하지 않은 추상 메서드를 선언하는데 사용된다.추상 클래스는 완성되지 않은 메서드가 존재하는 '미완성'이므로 인스턴스를 생성할 수 없다.abstract 클래스는 상속을 통해 완성해야한다.

 

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

제어자 대상 의미
abstract  클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미한다
메서드 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다
abstract class AbstractTest { // 추상 클래스 (추상 메서드를 포함한 클래스)
	abstract void move(); // 추상메서드 (구현부 {} <-가 없는 메서드)
}

 

접근 제어자 (access modifier)

접근 제어자는 멤버 또는 클래스에 사용되어 해당 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역활을 한다.

접근 제어자는 4가지 중 하나만 선택해서 사용할 수 있다.

 

접근 제어자를 사용하는 이유

- 외부로부터 데이터를 보호하기 위해서

- 외부에 불필요한, 내부적으로만 사용되는., 부분을 감추기 위해서

 

 

접근 범위가 넓은 쪽에서 좁으쪽의 순으로 나열하면 아래와 같다.

더보기

public        >        protected        >        (default)        >        private

제어자 같은 클래스 같은 패키지 자손 클래스 전체
public (접근제한 x) O O O O
protected O O O  
(default) O O    
private O      
대상 사용 가능한 접근 제어자
클래스 public, (default)
메서드 public, protected, (default), private
멤버변수
지역변수 없음

 

생성자의 접근제어자

생성자의 접근 제어자를 private으로 지정하면, 외부에서 접근이 불가하기 때문에 인스턴스를 생성할 수 없다.

그래도 클래스 내부에서는 인스턴스 생성할 수 있다.

 

 

제어자(modifier)의 조합 (정리)

대상 사용 가능한 접근 제어자
클래스 public, protected, (default), private
메서드 모든 접근 제어자, fianl, abstract, static
멤버변수 모든 접근 제어자, fianl, static
지역변수 fianl

 

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

- 클래스에 abstract와 fianl을 같이 사용할 수 없다

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

- 메서드에 private과 fianl을 같이 사용할 필요가 없다.

 

'study > Java' 카테고리의 다른 글

인터페이스 (interface)  (0) 2022.12.26
추상 클래스 & 메서드  (0) 2022.12.22
오버라이딩 (overriding)  (0) 2022.12.17
상속 (inheritance)  (0) 2022.11.16
생성자 (constructor)  (0) 2022.11.10
댓글