제어자(modifier)

배지원·2022년 9월 27일
0

JAVA

목록 보기
15/32

1. 제어자

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  • 하나의 대상에 여러 제어자를 같이 사용가능(접근 제어자는 하나만)
  • 접근 제어자는 맨앞에 있어야함
	  public     static final int WIDTH = 200;
// (접근 제어자)	    (제 어 자)
	public static void main(String[] args){
		System.out.prinln("WIDTH="+WIDTH);
    	}
	}

(1) static

  • '클래스의' 또는 '공통적인'의 의미를 가지고 있다.

  • 하나의 클래스로부터 생성된 클래스 변수는 공통된 값을 가진다.

  • 하나의 변수를 모든 인스턴스가 공유한다

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

(2) final

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

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

  • 메소드에 사용시 오버라이딩을 할 수 없게 된다.

  • 클래스에 사용시 자손클래스를 정의하지 못한다.

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

(3) abstract

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

  • 사용될수 있는곳은 클래스, 메서드 이다

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

2. 접근 제어자(access modifier)

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

(1) public
어떤 클래스든 접근할 수 있다는 것을 의미

(2) protected
자기 자신, 같은 패키지, 서로 다른 패키지다 하더라도 상속받은 자식 클래스에서는 접근할수 있다는 것을 의미(자손일경우에만 다른패키지에서 호출 가능)

(3) private
자기 자신만 접근할 수 있다는 것을 의미

(4) 접근제한자를 적지 않으면 default접근 지정자
자기자신과 같은 패키지에서만 접근할 수 있다는 것을 의미

public(접근제한 없음) > protected(같은 패키지 + 자손[다른 패키지]) > default(같은 패키지) > private(같은 클래스)

class myparent{
    private int prv = 1;        // 같은 클래스
            int dft = 2;        // 같은 패키지 (default)
    protected int prt = 3;      // 같은 패키지 + 자손(다른 패키지)
    public int pub = 4;         // 접근제한 없음

    public void printmembers(){
        System.out.println(prv);    // 실행
        System.out.println(dft);    // 실행
        System.out.println(prt);    // 실행
        System.out.println(pub);    // 실행
    }
}

public class ModifierTest {
    public static void main(String[] args) {
        myparent m = new myparent();
//      System.out.println(m.prv);          // 에러 발생
        System.out.println(m.dft);          // 동작
        System.out.println(m.prt);          // 동작
        System.out.println(m.pub);          // 동작
    }
}

3. 접근 제어자(캡슐화)

  • 외부로부터 데이터를 보호하기 위해서 외부에서 클래스 내의 데이터로 접근하는 것을 막음

  • 간접접근은 허용함(메서드를 통한 접근)

  • 되도록이면 클래스 내에서만 사용하는 변수와 메서드는 private로 감싸기

    class test{
       private int hour;               // 외부 접근을 막기 위해 private를 사용하여
                                       // 현재 클래스에서만 사용할 수 있도록 함
       private int minute;
    
       public void setHour(int hour) {         // 메서드를 통한 간접접근(입력)
           this.hour = hour;
           System.out.println(this.hour);
       }
    
       public int getHour() {				// 메서드를 통한 간접접근(출력)
           return hour;
       }
    }
    public class Encapsulation {
       public static void main(String[] args) {
           test t  = new test();
           t.hour;         // 오류 발생
           t.minute;       // 오류 발생
           t.setHour(10);      // 메서드 호출하여 값 입력 (동작)
           System.out.println(t.getHour());	// 메서드 호출하여 값 출력
       }
    }
profile
Web Developer

0개의 댓글