티스토리 뷰

개발

[Java] 제어자

호호홍얍얍 2022. 5. 18. 19:15

제어자

  • 접근제어자: public > protected > default > private
  • 그외: static, final, abstract, native, transient, synchronized, volatile, strictfp
  • 제어자는 클래스나 멤버변수와 메서드에 주로 사용되며, 하나의 대상에 여러 제어자를 조합하여 사용할 수 있다.
  • 단, 접근 제어자는 1개만 사용 가능하다.

static

  • '클래스의' '공통적인' 이라는 의미를 가진다.
  • static이 붙은 멤버변수와 메서드, 그리고 초기화 블럭은 인스턴스가 아닌 클래스에 관계된 것이기 때문에 인스턴스를 생성하지 않고도 사용할 수 있다.
사용가능대상 의미
멤버변수 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
클래스가 메모리에 로드될 때 생성된다.
메서드 모든 인스턴스에 공통적으로 사용되는 클래스 변수가 된다.
클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.
클래스가 메모리에 로드될 때 생성된다.
초기화블럭 클래스가 메모리에 로드될 때 딱 한 번만 수행된다.

final

  • '마지막의' '변경될 수 없는' 이라는 의미를 가지고 있으며 거의 모든 대상에 사용될 수 있다.
  • 변수에 저장하면 값을 변경할 수 없는 상수가 되며, 메서드에 사용되면 오버라이딩을 할 수 없게 되고 클래스에 사용되면 자손클래스를 정의하지 못하게 된다.
  • final이 붙은 변수는 상수이므로 일반적으로 선언과 초기화를 동시에 하지만, 인스턴스변수의 경우 생성자에서 초기화되도록 할 수 있다. - 인스턴스마다 다른 변수를 가지게 할 수 있다.
사용가능대상 의미
클래스 변경(확장)될 수 없는 클래스 - 조상 불가
메서드 변경될 수 없는 메서드 - 오버라이딩 불가
멤버변수, 지역변수 변경될 수 없는 상수

abstract

  • '미완성'의 의미
  • abstract 클래스는 인스턴스를 생성할 수 없는데, 이 클래스를 상속받아서 일부의 원하는 메서드만 오버라이딩하는 데 쓰일 수 있다.
사용가능대상 의미
클래스 클래스 내에 추상 메서드가 선언되어 있음을 의미. 인스턴스를 생성할 수 없다.
메서드 선언부만 작성하고 구현부는 아직 작성하지 않음

접근 제어자

  • 멤버 또는 클래스에 사용되어 해당되는 멤버 또는 클래스를 외부에서 접근하지 못하도록 제한하는 역할을 한다.
  • 하나의 소스파일에는 public 클래스가 단 하나만 존재할 수 있다.
제어자 같은 클래스 같은 패키지 자손클래스 전체
public O O O O
protected O O O X
default O O X X
private O X X X
  • 접근 제한을 이용한 캡슐화
    • 데이터가 유효한 값을 유지하도록, 또는 데이터를 외부에서 함부로 변경하지 못하도록 외부로부터의 접근을 제한함
    • 외부에서 접근할 필요가 없는 멤버들을 private으로 지정하여 외부에 노출시키지 않음으로써 복잡성을 줄임
    • 두 가지 모두 캡슐화 개념에 해당함
public class Time {
    private int hour;        // private으로 하여 외부에서 직접
    private int minute;        // 접근하지 못하게 한다.
    private int second;

    public int getHour() {return hour;}        // 값을 얻고 싶으면 get으로
    public void setHour(int hour){            // 값을 변경하고 싶으면 set
        if (hour < 0 || hour > 23) return;
        this.hour = hour;
    }
    public int getMinute() { return minute;}
    public void setMinute(int minute) {
        if (minute < 0 || minute > 59) return;
        this.minute = minute;
    }
    public int getSecond() {return second;}
    public void setSecond(int secod){
        if(second < 0 || second > 59) return;
        this.second = second;
    }

생성자의 접근제어자

  • 생성자의 접근 제어자를 private으로 지정하면, 외부에서 생성자에 접근할 수 없으므로 인스턴스를 생성할 수 없게 된다.
  • 대신 인스턴스를 생성해서 반환해주는 public 메서드를 제공함으로써 외부에서 이 클래스의 인스턴스를 사용하도록 할 수 있다. 이 메서드는 public 인 동시에 static이어야 한다.
  • 생성자가 private인 클래스는 다른 클래스의 조상이 될 수 없다. final을 더 추가하여 상속할 수 없는 클래스라는 것을 알리는 것이 좋다.

class Singleton {
...
private static Singleton s = new Singleton();
//getInstance()에서 사용될 수 있드록 인스턴스가 미리 생성되어야 하므로 static이어야 한다.

private Singleton() {
...
}

public static Singleton getInstance() {
if(s==null)
s = new Singleton();
return s;
}
}


'개발' 카테고리의 다른 글

[Spring Boot] 웹 브라우저 요청과 응답  (0) 2022.05.25
[1일 1로그 100일 완성 IT지식] 010. 비트 모아 데이터  (0) 2022.05.22
[Java] 패키지와 임포트  (0) 2022.05.17
[Java] 상속  (0) 2022.05.17
[Java] 변수와 메서드  (0) 2022.05.15
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함