접근제어자와 Method (메서드)
접근제어자란?
메서드와 변수에 사용되는 값으로 어느 범위까지 접근을 허용할 것인지를 결정하는 역할을 한다.
/* 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는 무한 생성이 가능하다.