캡슐화 & 제어자(modifier)

  • 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
  1. 접근 제어자 (한개만 사용 가능)
    • public, protected, (default: 아무것도 안 붙임), private
  2. 그 외
    • static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 하나의 대상에 여러 제어자를 같이 사용할 수 있음. (접근 제어자는 한개만)
public class ModifierTest {
	// 순서는 상관 없지만, 관례적으로 접근제어자를 가장 왼쪽에 씀
	public static final int WIDTH = 200;
    
    public static void main (String[] args) {
    	System.out.println("WIDTH=" + WIDTH);
    }
}

제어자

Static

  • 클래스의, 공통적인
  • 객체 생성 없이 사용 가능
  • iv 멤버 사용 불가
  • 사용 대상
    • static 멤버변수 : 모든 인스턴스에 공통적으로 사용되는 클래스 변수
    • static 메서드 : 인스턴스를 생성하지 않고도 호출이 가능한 메서드
class StaticTest {
	// 클래스 변수 (static 변수)
	static int width = 200;		// 간단 초기화 (명시적)
    
    static {	// 클래스 초기화 블럭
    	// 복잡한 초기화 수행
    }
    
    static int max(int a, int b) {	// 클래스 메서드 (static 메서드)
    	return a > b ? a : b;
    }
    
}

Final

  • 마지막의, 변경될 수 없는
  • String, Math... 와 같은 클래스들이 대표적인 final class이다.
  • 사용 대상
    • final 클래스 : 변경 또는 확장이 불가능한 클래스가 되기 때문에, 다른 클래스의 조상이 될 수 없음. (상속 계층도의 제일 마지막)
    • final 메서드 : 변경될 수 없는 메서드. 오버라이딩을 통해 재정이 될 수 없다.
    • final 멤버변수 : 값을 변경할 수 없는 상수가 됨.
    • final 지역변수 : 값을 변경할 수 없는 상수가 됨.
final class FinalTest {				// 조상이 될 수 없는 클래스
	final int MAX_SIZE = 10;		// 값을 변경할 수 없는 멤버변수(상수)
    
    final void getMaxSize() {		// 오버라이딩 할 수 없는 메서드(변경 불가)
    	final int LV = MAX_SIZE;	// 값을 변경할 수 없는 지역변수(상수)
        return MAX_SIZE;
    }
}

Abstract

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

AbstractTest a = new AbstractTest(); 	// 에러. 추상 클래스의 인스턴스 생성 불가 

=> 추상 클래스를 상속받아서 완전한 클래스(구상 클래스)를 만든 후에 객체 생성 가능

접근 제어자(access modifier)

  • 다음 네가지 중, 한가지만 사용이 가능하다.

    • private : 같은 클래스 내에서만 접근이 가능하다.
    • (default) : 같은 패키지 내에서만 접근이 가능하다.
    • protected : 같은 패키지 내에서, 그리고 다른 패키지의 자손 클래스에서 접근이 가능하다.
    • public : 접근 제한이 전혀 없다
      접근 범위 : public > protected > (default) > private
  • class 앞에는 public, (default)만 올 수 있다.

  • 멤버(변수, 메서드) 앞에는 4가지 모두 사용 가능하다.

  • 하나의 패키지에 public class는 하나!


캡슐화

  • 데이터를 외부로부터 보호하기 위해서 사용 -> 보호: 캡슐화!
  • iv는 접근 제어자를 private으로 하여, 외부에서 직접 접근하지 못하도록 해야 한다. (외부 접근 차단)
  • 메서드는 public으로 한다. (메서드를 통한 간접 접근)
  • 외부에는 불필요한, 내부적으로만 사용되는 부분을 감추기 위해서 사용
  • 접근 제어자는 최소화 시켜놓고, 필요할 때 넓히는게 좋다.
public class Time {
	// 외부에서 iv에 직접 접근하는 것을 막는다.
	private int hour;
    private int minute;
    private int second;
    
    // 메서드에는 접근이 가능하게 한다. 메서드를 통한 iv 접근 ok (간접 접근 허용)
    public int getHour() { return hour; }
    
    public void setHour(int hour) {
    	if (hour < 0 || hour > 23) return;  // iv 의 값을 보호한다
        this.hour = hour;
    }
}

좋은 웹페이지 즐겨찾기