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
반응형