JAVA

접근제어자와 Method (메서드)

wallarin 2024. 12. 2. 15:45
반응형

접근제어자란?

메서드와 변수에 사용되는 값으로 어느 범위까지 접근을 허용할 것인지를 결정하는 역할을 한다.

 

/* Class에서 사용이 가능한 접근제어자 */

// public
/* 모든 패키지에서 접근이 가능하다. */
public class Test {
	// 내용
}

// (default)
/* 같은 패키지 내에서만 접근이 가능하다. */
class Test {
	// 내용
}

 

/* Method에서 사용이 가능한 접근제어자 */

/* 필드 단위 */
public String test;
private String test;
protected String test;
String test;

/* 메서드 단위 */

// public
/* 어디서나 접근이 가능하다. == 어느 클래스에서나 호출이 가능하다. */
pulibc void Test {
	// 내용
}

// private
/* 클래스 내부에서만 접근이 가능하다. + 외부 클래스는 직접 접근이 불가능하며, Getter와 Setter를 이용해서 간접적인 접근이 가능하다. */
private void Test {
	// 내용
}

// protected
/* 같은 패키지이거나 상속받은 클래스에서 접근이 가능하다. */
protected void Test {
	// 내용
}

// (default)
/* 같은 패키지 내에서만 접근이 가능하다. + 메소드의 반환값이 존재하지 않을 때 사용한다. */
void Test {
	// 내용
}

 

static - 객체를 생성하지 않고 호출할 수 있다. (메서드, 변수, 블록, 내부 클래스 모두에서 사용이 가능하나, 주로 메소드에서 사용한다.

void - 반환할 결괏값이 없을 때에 사용한다.

 

ex)

    public static void - 객체 생성 없이 다른 클래스에서 호출이 가능하며 반환할 결과 값이 없다는 의미이다.


필드, 메서드 레벨의 접근 제어자의 종류

  private: 모든 외부 호출을 차단한다.

  default(package-private): 같은 패키지 안에서의 호출은 허용된다.(myapp 패키지 안에 해당 파일이 있으면서 다른 파일에서 사용하려는 경우 가능 But myapp.hello 패키지안에 파일을 생성해서 사용하려는 경우는 불가능)

  protected: 같은 패키지 안에서 호출은 허용한다. 패키지가 다르더라도 상속 관계(extends) 호출은 허용한다.

  public: 모든 외부 호출을 허용한다.

 

사용 위치

  필드, 메서드, 생성자에 사용된다. (클래스에서도 일부 사용가능)

 

아래는 필드, 메서드 단위에서 접근 제어자를 사용하는 예시이다.

package myapp

public class Car { // 클래스 레벨
    private String color; // 필드
    String carType;
    public int inventory;

    public Car(String color,String carType, int inventory) { // 생성자
        this.color = color;
        this.carType = carType;
        this.inventory = inventory;
    }

    public void openDoor() { /* 메서드 */ }
    void engineStart() { /* 메서드 */ }
    private void drive() { /* 메서드 */ }
}
package myapp

public class InnerMain() {
    public static void main(String[] args) {
        Car car = new Car("red", "승용차", 10);

        // private 접근 불가능
        // Error: java: color has private access in access.a.Car
        // Error: java: drive() has private access in access.a.Car
        car.color = "blue"; // 에러 발생
        car.drive(); // 에러 발생

        // default 같은 패키지이기 때문에 접근 가능
        car.carType = "SUV";
        car.engineStart();

        // public 접근 가능
        car.inventory = 200;
        car.openDoor();
    }
}
package myapp.plus

public class OuterMain() {
    public static void main(String[] args) {
        Car car = new Car("red", "승용차", 10);

        // private 접근 불가능
        // Error: java: color has private access in access.a.Car
        // Error: java: drive() has private access in access.a.Car
        car.color = "blue"; // 에러 발생
        car.drive(); // 에러 발생

        // default 같은 패키지가 아니기 때문에 접근 불가능
        // Error: java: carType is not public in access.a.Car; cannot be accessed from outside package
        // Error: java: engineStart() is not public in access.a.Car; cannot be accessed from outside package
        car.carType = "SUV";
        car.engineStart();

        // public 접근 가능
        car.inventory = 200;
        car.openDoor();
    }
}
클래스 레벨에서의 사용

클래스 레벨에서의 접근 제어자의 종류

  public: 다른 패키지의 클래스에서 객체 생성 후 호출 가능

  default: 같은 패키지 에서 객체 생성 후 호출 가능 / 다른 패키지는 불가능

규칙

  • private와 protected는 사용할 수 없다.
  • public 클래스는 반드시 파일명과 이름이 같아야한다.
  • 하나의 파일 안에 public 클래스는 한번만 사용할 수 있다.
  • 하나의 자바 파일에 default는 무한 생성이 가능하다.