Java/JAVA의 정석_객체지향

제어자(modifier)

Jenny_yoon 2022. 10. 31. 17:08
728x90
반응형

1) 특징

- 클래스와 클래스 멤버(멤버변수, 메서드)에 부가적인 의미부여 (형용사 역할)

- 종류

  • 접근제어자 : public, protected, (default-공백), private (이중 1개만 사용 가능)
  • 그 외 : static, final, abstract...

- 하나의 대상에 여러 제어자 같이 사용 가능(접근 제어자는 하나만)

- 사용 순서는 상관 없음 (보통 접근제어자를 제일 왼쪽에 사용)

ex. 예시

public class ModifierTest {
    public static final int WIDTH = 200;	//접근제어자1 + 제어자2
    
    public static void main(String90 args) {   //접근제어자1 + 제어자1
    	System.out.println("WIDTH="+WIDTH);
    }
}

2)  static 정리

- 의미 : 클래스의, 공통적인

ex.예시

class StaticTest {
    static int width = 200; //간단(명시적)초기화. 클래스변수(static 변수)
    static int heith = 120;
    
    static {
    		//복잡 초기화
    }
    
    static int max(int a, int b) { //클래스메서드(static 메서드), iv 사용x
     	return a>b ? a: b;			   
    }
}

3) final 

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

ex.예시

final class FinalTest {			// final+클래스 : 조상이 될 수 없는 클래스
    final int MAX_SIZE = 10;		// final+멤버변수 : 값을 변경할 수 없는 멤버변수(상수)
    
    final void getMaxSize() { 		// fianl+메서드 : 오버라이딩할 수 없는 메서드(변경불가)
    	final int LV = MAX_SIZE;	// final+지역변수 : 값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;
    }
}

4) abstract

- 의미 : 추상의, 미완성의

- 미완성 클래스. 선언부만 있고 구현부(괄호 {})가 없음

- 즉, 설계도 미완성으로 제품 생산 불가 -> 인스턴스 생성불가

- ex.예시

abstract class AbstractTest {	//추상클래스(추상메서드를 포함하면 무조건 추상클래스임)
	abstract void move;	//추상 메서드(구현부가 없음)
    

//AbstractTest a = new AbstractTest(); //에러!! 인스턴스 생성불가!
더보기

인스턴스 생성하기 위해서 -> 완전한 클래스를 만들어야함

: 추상클래스를 상속받기!

5) 접근제어자(access modifier)

- 종류

  • public : 접근 제한이 없음
  • protected : 같은 패키지 내 + 다른 패키지의 자손 클래스에서 접근 가능
  • (default) : 같은 패키지 내에서만 접근 가능
  • private : 같은 클래스 내에서만 접근 가능

ex.예시

package pkg1;

class MyParent {
    private   int prv;	//같은 클래스
    	      int dft;	//같은 패키지
    protected int prt;	//같은 패키지 + 자손(다른 패키지)
    public    int pub;	//접근제한 없음
    
    public void printMembers(){
    	System.out.println(prv); //OK
        System.out.println(dft); //OK
        System.out.println(prt); //OK
        System.out.println(pub); //OK
     }
}
public class MyParentTest {
	public static void main(String[] args){
    	MyParent p = new MyParent();
        System.out.println(prv); //에러!! 같은 클래스 내에서만 사용가능
        System.out.println(dft); //OK
        System.out.println(prt); //OK
        System.out.println(pub); //OK
     }
}

- 접근제어자 사용이유

  • 외부로부터 데이터를 보호하기 위해
  • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해 (접근제어자 범위는 좁을 수록 좋다)

ex.예시

public class Time {
    //접근제어자를 private로 하여 외부에서 직접 접근 못하도록 함
    private int hour;
    private int minute;
    private int second;
    
    //메서드는 public으로 간접접근 허용
    public int getHour() { return hour; }
    public void setHour(int hour) {
    	if (hour < 0 || hour > 23) return;
        this.hour = hour;
    }
더보기

hour를 25로 변경하고 싶은 경우

-> t.setHour(25); 로 설정

->이 경우 23까지라는 범위를 초과 했으므로 return되어 메서드를 빠져나가게 된다. (값 보호)

: hour의 경우 0~23까지라는 범위가 규정되어 있는데, 외부에서 직접 접근이 가능하다면 그 범위를 초과하게 될 수도 있으므로, 함부로 접근 못하게 private로 설정

 

ex.예시2

package ch7;

class Time {
	private int hour;
	private int minute;
	private int second;
	
	public void setHour(int hour) {
		if(hour<0 || hour>23) return;
		
		this.hour = hour; }
	public int getHour() { return hour; };
}
public class TimeTest {
	public static void main(String[] args) {
		Time t = new Time();
//		t.hour = -100;
		t.setHour(21); //hour값을 21로 변경
		System.out.println(t.getHour());
		t.setHour(100); //hour값을 100을 변경했지만 변경되지 않음. hour값는 23까지라는 한계를 정해놨기 때문.
		System.out.println(t.getHour());
	}
}
728x90
반응형