캡슐화 & 제어자(modifier)
- 클래스와 클래스의 멤버(멤버 변수, 메서드)에 부가적인 의미 부여
- 접근 제어자 (한개만 사용 가능)
- public, protected, (default: 아무것도 안 붙임), private
- 그 외
- 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;
}
}
Author And Source
이 문제에 관하여(캡슐화 & 제어자(modifier)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@kimsy8979/캡슐화-제어자modifier저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)