JAVA - 제어자(modifier)

jodbsgh·2022년 3월 22일
0

💡"JAVA"

목록 보기
21/67

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

static - 클래스의, 공통적인

  • 인스턴스변수는 하나의 클래스로부터 생성되었더라도 각기 다른 값을 유지하지만, 클래스변수는 인스턴스에 관계없이 같은 값을 갖는다.
  • static이 붙은 멤버변수와 메서드, 초기화블럭은 인스턴스를 생성하지 않고도 사용할 수 있다.

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

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

  • 변수에 사용되면 값을 변경할 수 없는 상수가 된다.
  • 메서드에 사용하면 오버라이딩을 할 수 없게 되며, 자신을 확장하는 자손클래스를 정의하지 못하게 된다.

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

생성자를 이용한 final멤버 변수의 초기화

  • final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스변수의 경우 생성자에서 초기화 되도록 할 수 있다.
  • 클래스 내에 매개변수를 갖는 생성자를 선언하여, 인스턴스를 생성할 때 final이 붙은 멤버변수를 초기화하는데 필요한 값을 생성자의 매개변수로부터 제공받는 것이다.
  • 이를 활용하면 각 인스턴스마다 final이 붙은 멤버변수가 다른 값을 갖도록 하는 것이 가능하다.
class Card{
	final int NUMBER;		//상수지만 선언과 함께 초기화 하지 않고
    final String KIND;		//생성자에서 단 한번만 초기화할 수 있다.
    static int width  = 100;
    static int height = 250;
    
    Card(String kind, int num)
    {
    	KIND = kind;		//매개변수로 넘겨받은 값으로
        NUMBER = num;		//KIND와 NUMBER를 초기화한다.
    }
    
    Card()
    {
    	this("HEART", 1);
    }
    
    public String toString()
    {
    	return KIND + " " + NUMBER;
    }
}

class FinalCardTest{
	public static void main(String args[])
    {
    	Card c = new Card("HEART", 10);
        c.NUMBER = 5;	//에러 ! cannot assign a value 
        				//to final variable NUMBER
        System.out.println(c.KIND);
        System.out.println(c.NUMBER);
        System.out.println(c);	//System.out.pritnln(c.toString());
    }
}

abstract - 추상의, 미완성의

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

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

추상 클래스는 아직 완성되지 않은 메서드가 존재하는 '미완성 설계도' 이므로 인스턴스를 생성할 수 없다.

	abstract class AbstractTest{		//추상 클래스
    	abstract void move();			//추상 메서드
    }

이런 클래스는 인스턴스를 생성해봐야 할 수 있는 것이 없다. 그래서 인스턴스를 생성하지 못하게 클래스 앞에 제어자 'abstract'를 붙여 놓은 것이다.

public abstract class WindowAdaptor
	implements WindowListener, WindowStateListener, WindowFocusListener{
    	public void windowOpened(WindowEvent e) {}
        public void windowClosing(WindowEvent e) {}
        public void windowClosed(WindowEvent e) {}
        public void windowIconified(WindowEvent e) {}
    }

위 클래스 자체로는 쓸모가 없지만, 다른 클래스가 이 클래스를 상속받아서 일부의 원하는 메서드만 오버라이딩해도 된다는 장점이 있다.

접근 제어자(access modifier)

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

public > protected > (default) > private

제어자(modifier)의 조합

  1. 메서드에 static과 abstract를 함께 사용할 수 없다.
  2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
  3. abstract메서드의 접근 제어자가 private일 수 없다.
  4. 메서드에 private와 final을 같이 사용할 필요는 없다.
profile
어제 보다는 내일을, 내일 보다는 오늘을 🚀

0개의 댓글