Java

객체(Object) - 제어자(modifier)

제주니어 2022. 9. 22. 23:38

제어자(modifier)

제어자란?

  • 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하는 것이 가능.
  • 접근 제어자는 하나만 사용이 가능하다. public > protected > (default) > private

static - 클래스의, 공통적인

  • 인스턴스 변수는 하나의 클래스로부터 생성되더라도 다른 값을 유지, 클래스 변수(static 멤버변수)는 인스턴스에 관계없이 같은 값을 갖는다.
  • static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

static 멤버변수

  • 모든 인스턴스에 공통으로 사용되는 클래스 변수가 된다.
  • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다.
  • 클래스가 메모리에 로드될 때 생성된다.

static 메서드

  • 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
  • static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

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

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

final 클래스

  • 변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
  • final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다. (상속 X)

final 메서드

  • 변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해 재정의 될 수 없다.

final 멤버변수 & 지역변수

  • 변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
  • final이 붙은 변수는 상수이므로 선언과 초기화를 동시에 한다.
  • 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있다.
  • 클래스 내에서 매개변수를 갖는 생성자를 선언하고, 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로 제공받는 것이다.
  • 이 기능을 활용해 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능하다.
package com.kh.chapter3;

import com.kh.chapter3.field.A_Field;
import com.kh.chapter3.field.B_StaticField;
import com.kh.chapter3.field.C_StaticFinalField;
import com.kh.chapter3.field.D_InitBlock;

public class Application {

	public static void main(String[] args) {
// 3. 클래스 변수 테스트
		// 클래스 변수는 프로그램 실행과 동시에 메모리(static)에 생성되었기 때문에 객체를 생성하지 않아도 접근이 가능하다. 
		System.out.println(B_StaticField.publicStacicField);
		System.out.println(B_StaticField.getPrivateStacicField());
		
		
//		정적 멤버는 객체의 참조 변수로도 접근이 가능하지만, 정적 멤버는 클래스 이름으로 접근하는 것을 지향한다.
//		B_StaticField staticField = new B_StaticField();
//		System.out.println(B_StaticField.publicStacicField);
//		System.out.println(B_StaticField.getPrivatesStacicField);
	}
}

상수(static final)

 [표현법]
 public static final 상수명 = 값;
  • static과 final의 순서는 상관없으며 선언과 동시에 초기화 해주어야 한다. (static 블록을 통해서도 가능)
  • 초기화해주고 값을 변경할 수 없기때문에 setter가 필요없다.
  • public으로 선언되었기 때문에 getter가 필요없다.
  • 상수의 이름은 모두 대문자로 작성하는 것이 관례이다. 만약 서로 다른 단어가 혼합된 이름이면 언더바(_)로 단어들을 연결한다.
package com.kh.chapter3.field;

public class C_StaticFinalField {
	public static final int MAX_LEVEL = 90;
}

abstract - 추상의, 미완성의

  • abstract가 사용될 수 있는 곳 - 클래스, 메서드
  • abstract 클래스 : 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
  • abstract 메서드 : 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.

접근 제어자(access modifier)

  • 접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
  • private : 같은 클래스 내에서만 가능
  • default : 같은 패키지 내에서만 가능 (클래스에서 가능)
  • protected : 같은 패키지 내 & 다른 패키지의 자손클래스에서 가능
  • public : 접근 제한이 없다. (클래스에서 가능)

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

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

get + 메서드

  • 단순히 멤버변수의 값을 반환하는 일 → 멤버변수의 값을 읽는다.

set + 메서드

  • 매개변수에 지정된 값을 검사해 조건에 맞는 값일 때만 멤버변수의 값을 변경하도록 작성 → 멤버변수의 값을 변경한다.

생성자의 접근 제어자

  • 생성자에 접근 제어자를 사용해 인스턴스의 생성을 제한할 수 있다.
  • 보통 생성자의 접근 제어자는 클래스의 접근 제어자와 같지만, 다르게 지정할 수 있다.
  • 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다.

제어자(modifier)의 조합

대상 사용가능한 제어자
클래스 public, (default), final, abstract
메서드 모든 접근 제어자, final, abstract, static
멤버변수 모든 접근 제어자, final, static
지역변수 final
  • 메서드에 staticabstract를 함께 사용할 수 없다. → static메서드는 몸통이 있는 메서드에만 사용이 가능.
  • 클래스에 abstractfinal을 동시에 사용할 수 없다. → final은 클래스를 확장할 수 없다는 의미고, abstract는 상속을 통해서 완성되어야 한다는 의미.
  • abstract메서드는 접근 제어자가 private일 수 없다. → abstract메서드는 자손클래스에서 구현해주는데, private이면 자손 클래스에서 접근할 수 없기 때문.
  • 메서드는 privatefinal을 같이 사용할 필요는 없다. → 접근 제어자가 private인 메서드는 오버라이딩 될 수 없기 때문에 둘 중 하나만 사용해도 의미가 충분.