[자바의 정석] chapter7 객체지향 프로그래밍2 / 4.제어자(modifier)

임대진·2022년 3월 3일
0

4.제어자(modifier)

4.1 제어자란?

  • 제어자(modifier)는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다.

    접근 제어자 public, protected, default, private
    그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp

  • 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능

  • 접근 제어자는 한 번에 네 가지 중 하나만 선택해서 사용할 수 있다.

  • 즉, 하나의 대상에 대해서 public과 private을 함께 사용할 수 없다는 것이다.

4.2 static - 클래스의, 공통적인

  • static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다.

    static이 사용될 수 있는 곳-멤버변수, 메서드, 초기화 블럭

제어자대상의미
static멤버변수- 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.
-클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
- 클래스가 메모리에 로드될 때 생성된다.
메서드- 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.
- static메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다.
class StaticTest{
      static int width = 200; // 클래스 변수(static변수)
      static int height = 120; // 클래스 변수(static변수)
      
      static{                 // 클래스 초기화 블럭
           // static변수의 복잡한 초기화 수행
      }
      
      static int max(int a, int b){  // 클래스 메서드(static메서드)
           return a > b ? a : b;
      }
 }

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

  • final은 '마지막의' 또는 '변경될 수 없는'의 의미를 가지고 있음

    final이 사용될 수 있는 곳 - 클래스, 메서드, 멤버변수, 지역변수

제어자대상의미
final클래스변경될 수 없는 클래스, 확장될 수 없는 클래스가 된다.
그래서 final로 지정된 클래스는 다른 클래스의 조상이 될 수 없다.
메서드변경될 수 없는 메서드, final로 지정된 메서드는 오버라이딩을 통해
재정의 될 수 없다.
멤버변수변수 앞에 final이 붙으면, 값을 변경할 수 없는 상수가 된다.
지역변수

※ 대표적인 final클래스로는 String과 Math가 있다.

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

4.4 abstract - 추상의, 미완성의

  • abstract는 '미완성'의 의미를 가지고 있다.

    abstract가 사용될 수 있는 곳 - 클래스, 메서드

    제어자대상의미
    abstract클래스클래스 내에 추상 메서드가 선언되어 있음을 의미한다.
    메서드선언부만 작성하고 구현부는 작성하지 않은 추상 메서드임을 알린다.
    abstract class AbstractTest{  // 추상 클래스(추상 메서드를 포함한 클래스)
    abstract void move();   //추상 메서드(구현부가 없는 메서드)

4.5 접근 제어자(access modifier)

접근 제어자가 사용될 수 있는 곳 - 클래스, 멤버변수, 메서드, 생성자
private 같은 클래스 내에서만 접근이 가능하다.
default 같은 패키지 내에서만 접근이 가능하다.
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근이 가능하다.
public 접근 제한이 전혀 없다.

제어자같은 클래스같은 패키지자손클래스전체
publicoooo
protectedooo
(default)oo
privateo
  • 접근 범위가 넓은 쪽에서 좁은 쪽의 순으로 왼쪽부터 나열하면 다음과 같다.

    public>protected>(default)>private

    ※ 접근 제어자가 dfault라는 것은 아무런 접근 제어자로 붙이지 않는 것을 의미한다.
    대상사용가능한 접근 제어자
    클래스public, (dfault)
    메서드public, protected, (default), private
    멤버변수
    지역변수없음

접근 제어자를 이용한 캡슐화

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

  • 외부로부터 데이터를 보호하기 위해서
  • 외부에는 불필요한, 내부적으로만 사용되는, 부분을 감추기 위해서
public class Time{
     private int hour;
     private int minute;
     private int second;
     
     public int getHour(){return hour;}
     public void setHour(int hour){
             if(hour<0 || hour>23) return;
             this.hour = hour;
     }
     public int getMinute() { return inute;}
     public void setMinute(int minute){
            if (minute < 0 || minute >59) return;
            this.minute = minute;
     }
     public int getSecond() { return second;}
     public void setSecond(int second){
            if (second<0 || second>59) return;
            this.second = second;
     }
  }
public class TieTest{
 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);
     System.out.println(t.getHour());
}
}

4.6 제어자(modifier)의 조합

대상사용가능한 제어자
클래스public,(default),final,abstract
메서드모든 접근 제어자, final, absract, static
멤버변수모든 접근 제어자, final, static
지역변수final
  • 제어자를 조합해서 사용할 때 주의해야 할 사항
    1. 메서드에 static과 abstract를 함께 사용할 수 없다.
      static메서드는 몸통이 있는 메서드에만 사용할 수 있기 때문이다.
    2. 클래스에 abstract와 final을 동시에 사용할 수 없다.
      클래스에 사용되는 final은 클래스를 확장할 수 없다는 의미이고 abstract는 상속을
      통해서 완성되어야 한다는 의미이므로 서로 모순되기 때문이다.
    3. abstract메서드의 접근 제어자가 private일 수 없다.
      abstract메서드는 자손클래스에서 구현해주어야 하는데 접근 제어자가 private이면,
      자손클래스에서 접근할 수 없기 때문이다.
    4. 메서드에 private과 final을 같이 사용할 필요는 없다.
      접근 제어자가 private인 메서드는 오버라이딩될 수 없기 때문이다.
      이 둘 중 하나만 사용해도 의미가 충문하다.
profile
신입개발자 공부기록 블로그

0개의 댓글