본문 바로가기
객체지향 OOP

[자바의정석 기초 객체지향 개념] 제어자 static, final, abstract / 접근 제어자 / 캡슐화

by bzerome240 2022. 5. 30.

제어와드

제어자 modifier

: 클래스와 클래스의 멤버에 부가적인 의미 부여 (=형용사)

  • 접근제어자: public, protected, private, (default)
  • 그외: static, final, abstract, native, transient ...
  • 하나의 대상에 여러 제어자를 같이 사용 가능 (접근제어자는 하나만)
public class Modifier {
	public static final int width = 200;

	public static void main(String[] args) {
		System.out.println(width);
	}
}

 


 

static: 클래스의, 공통적인

  • static 멤버변수
    • 모든 인스턴스에 공통적으로 사용된다
    • 클래스 변수는 인스턴스를 생성하지 않고도 사용 가능하다
    • 클래스가 메모리에 로드될 때 생성된다
  • static 메서드
    • 인스턴스를 생성하지 않고도 호출이 가능하다.
    • static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.

 

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

  • final 클래스
    • 변경될 수 없는 클래스, 확장될 수 없는 클래스
  • final 메서드
    • 변경될 수 없는 메서드 → 오버라이딩을 통해 재정의 될 수 없다.
  • final 멤버변수, 지역변수
    • 값을 변경할 수 없는 상수

 

abstract: 추상의, 미완성의

  • abstract 클래스
    • 클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
  • abstract 메서드
    • 선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 의미한다.
abstract class Abst {
	abstract void movie(); // 구현부가 없음
}

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

→ 상속을 통해 추상 클래스를 구현해서 객체 생성 가능하다.

 


 

접근 제어자

접근 범위: public > protected > default > private

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

 


 

캡슐화

접근 제어자를 사용하는 이유?

  1. 외부로부터 데이터를 보호하기 위해서
  2. 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서

 

접근 제어자 private으로 외부에서 직접 접근하지 못하도록 해야 한다.

  • 클래스 내부에서만 사용되면 public으로 선언할 필요가 없다. private으로 선언한다
    • → 수정하게 될 때 테스트를 해야 하는데 테스트 범위만 넓어질 뿐
public class Time {
	private int hour;

	public int getHour() {
		return hour;
	}

	public void setHour(int hour) {
		if(isValidHour(hour)) return; // 값을 보호함
		this.hour = hour;
	}

	private boolean isValidHour(int hour) {
		return hour < 0 || hour > 23;
	}
}

Time t = new Time();
t.hour = 25; // 직접 접근 하는 예 -> private으로 선언하면 에러 발생
t.setHour(25); // 간접 접근

 

 

 

728x90
반응형

댓글