본문 바로가기
programming_kr/java

제어자(modifier)

by JSsunday 2022. 9. 10.
728x90

제어자(modifier)

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

 

접근 제어자(access modifier)

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

  • private : 같은 클래스 내에서만 접근이 가능
  • default : 같은 패키지 내에서만 접근이 가능
  • protected : 같은 패키지 내, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
  • public : 접근 제한이 없다
대상 사용 가능한 접근 제어자
클래스 public, default
메서드 public, protected, default, private
멤버변수(인스턴스변수)
지역변수(로컬변수) 없음
package com.test;

public class AccessModifier2 {
	
	public String pubName; // 접근 제한이 없다.
	protected String proName; // 같은 패키지 내, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
	String defName; // 같은 패키지 내
	private String prvName; //같은 클래스 내
	
	public void pubMethod() {}; // 접근 제한이 없다.
	protected void proMethod() {}; // 같은 패키지 내, 그리고 다른 패키지의 자손 클래스에서 접근이 가능
	void defMethod() {}; // 같은 패키지 내
	private void prvMethod() {}; //같은 클래스 내
}

 

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

  • 외부로부터 데이터를 보호
  • 외부에서 불필요한, 내부적으로만 사용되는 부분을 감추기 위해

 

그 외의 제어자

static - 공통적인

static은 "클래스의" 또는 "공통적인"의 의미를 가지고 있습니다. 인스턴스 변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수(static멤버변수)는 인스턴스에 관계 없이 같은 값을 가집니다.

인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는 가의 여부에 있습니다.

제어자 대상 의미
static 멤버변수(인스턴스변수) 1. 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
2. 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
3. 클래스가 메모리에 로드될 때 생성된다.
메서드 1. 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
2. static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.
package com.test;

public class StaticTest {
	static String name; // 클래스 변수(static변수)
	static String code;
	
	static {	//클래스 초기화 블럭
		
	}
	
	static boolean max(int a, int b) { //클래스 메서드(static 메서드)
		return a > b;
	}
}

 

final - 변경될 수 없는

final은 "마지막의" 또는 "변경될 수 없는"의 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다. 변수에 사용되면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자신을 상속받는 자손 클래스를 정의하지 못하게 된다.

제어자 대상 의미
final 클래스 1. 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
2. final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드 1. 변경될 수 없는 메서드
2. final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.
멤버변수 1. 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수
package com.test;

public final class FinalClassTest extends FinalClass{ // FinalClass 상속받을 수 없다.
	public static void main(String[] args) {
		
	}
}

final class FinalClass {// 조상이 될 수 없다.
	final int MAX_SIZE = 10; // 값을 변경할 수 없다.
	
	final int getMaxSize() { // 오버라이딩으로 재정의 할 수 없다.
		final int LV = MAX_SIZE; // 값을 변경할 수 없는 지역변수
		return LV;
	}
}

 

abstract - 추상의

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

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

 

제어자(modifier)의 조합

대상 사용가능한 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstarct, static
멤버변수(인스턴스변수) 모든 접근 제어자, final, static
지역변수(로컬변수) final

 

접근 제어자 조합해서 사용시 주의사항

  1. 메서드에 statc과 abstract를 함께 사용할 수 없다.
    static메서드는 몸통이 있는 메서드에서만 사용 가능
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
    클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을 통해 완성되어야 한다는 의미이기 때문에 서로 모순
  3. abstract 메서드의 접근 제어자가 private일 수 없다.
    abstract메서드는 자손 클래스에서 구현해주어야 하는데 접근 제어자가 private이면, 자손 클래스에서 접근 불가능
  4. 메서드에 private와 final을 같이 사용할 수 없다.
    접근 제어자가 private인 메서드는 오버라이딩 될 수 없다. 둘 중 하나만 사용해도 충분하다.

참조
자바의 정석
728x90

'programming_kr > java' 카테고리의 다른 글

제네릭(generic)  (1) 2022.09.24
JAVA8 Optional 사용법  (1) 2022.09.17
람다식(Lambda)  (0) 2022.08.30
JAVA 8 interface 변경사항  (0) 2022.08.27
JAVA란?  (0) 2020.12.30

댓글