2 분 소요

제어자(Modifiers)

  • public이라는 단어가 예시에 계속해서 나왔었습니다.
    public class Main {}
    
  • public은 접근 제어자 중에 하나입니다. 말 그래도 해당 클래스, 속성, 메서드에 접근 할 수 있는 단계를 설정합니다.
  • 제어자를 2가지 그룹으로 나눌 수 있습니다
    • 접근 제어자 - 접근 단계를 설정
    • 비접근 제어자 - 접근 단계를 설정하지 않으나 다른 기능을 제공함

접근 제어자(Access Modifiers)

  • 클래스의 접근 제어자는 총 2개 입니다.
제어자 설명
public 다른 클래스에서도 접근 가능
default 같은 패키지 안에 있는 클래스에서 접근 가능. 제어자가 없을 시 기본값
  • 속성, 메서드, 생성자의 접근 제어자는 총 4개 입니다.
제어자 설명
public 다른 클래스에서도 접근 가능
protected 같은 패키지 또는 상속 받은 클래스에서 접근 가능
default 같은 패키지 안에 있는 클래스에서 접근 가능. 제어자가 없을 시 기본 값
private 같은 클래스에서만 접근 가능

비접근 제어자(Non-Access Modifiers)

  • 클래스의 비접근 제어자는 총 2개 입니다.
제어자 설명
final 해당 클래스는 상속 불가
abstract 해당 클래스는 객체 생성을 하지 못함
  • 속성, 메서드의 비접근 제어자는 총 6개 입니다.
제어자 설명
final 해당 속성과 메서드는 오버라이드 또는 변경 불가
static 해당 속성과 메서드는 객체보다 클래스에 속함(객체 생성없이 사용 가능)
abstract abstract 클래스에서만 메서드에 사용 가능. 해당 메서드는 정의되어있지 않아야함(예: abstract void run();).
transient 객체를 직렬화 할때 해당 속성과 메서드 스킵
synchronized 하나의 쓰레드에서 한번만 실행 가능한 메서드
volatile 속성 값이 지역 쓰레드에 할당되는 것이 아니라 메인 메모리에서 불러옴
  • 주로 사용되는 것은 final, static, abstract 입니다.

상수(Final)

public class Main {
  final int x = 10;
  final double PI = 3.14;

  public static void main(String[] args) {
    Main obj = new Main();
    obj.x = 50; // 에러 발생: 상수 값 변경 불가
    obj.PI = 25; // 에러 발생: 상수 값 변경 불가
    System.out.println(obj.x);
  }
}

정적(Static)

public class Main {
  // Static method
  static void myStaticMethod() {
    System.out.println("static 메서드는 객체 생성없이 호출 가능");
  }

  // Public method
  public void myPublicMethod() {
    System.out.println("public 메서드는 객체 생성 후 호출 가능");
  }

  // Main method
  public static void main(String[] args) {
    myStaticMethod(); // static method 호출 가능
    // myPublicMethod; // 에러 발생

    Main obj = new Main(); // Main의 객체 생성
    obj.myPublicMethod(); // public 메서드 호출 가능
  }
}

추상(Abstract)

// 추상 클래스
abstract class Main {
  public String fname = "KyuSang";
  public abstract void study(); // 추상 메서드
}
// 추상 클래스를 상속받은 클래스
public class Student extends Main {
  public int graduationYear = 2018;
  public void study() { // 추상 메서드를 여기서 정의함
    System.out.println("귀차니즘 온");
  }
}
public class Second {
  public static void main(String[] args) {
    // Student 클래스의 객체 생성
    Student obj = new Student();

    System.out.println("이름: " + obj.fname);
    System.out.println("졸업년도: " + obj.graduationYear);
    obj.study(); // 추상 메서드 호출
  }
}