접근 제한자
접근 제한자의 종류 및 범위
접근 제한자는 4가지의 종류가 있으며 접근 가능 범위는 다음 표와 같다.
default 는 변수나 메서드 선언 시 아무것도 적지 않았을 때의 경우이다.
class Sample {
int Value; // default int Value;
void Method() { // default void Method()
}
}
Java
복사
•
클래스에는 public 과 default 가 사용 가능하다.
•
변수와 메서드에는 public , protected , default , private 모두 사용 가능하다.
•
default 의 경우 같은 패키지 내에서만 사용 가능하다.
package edu.lion.car;
public class SCar {
int year = 2000; // 변수가 default로 선언되었다.
SCar(){ // 생성자가 default로 선언되었다.
System.out.println("삼성차 생성자");
}
}
Java
복사
import edu.lion.car.SCar;
public class JvmTest {
public static void main(String[] args) {
SCar sar = new SCar(); // 여기서 컴파일 에러가 난다.
// SCar의 생성자가 public이 아니라서
// 같은 package 가 아니면 객체생성 불가능
System.out.println(sar.year); // class SCar의 year 변수가
// default로 선언되었기 때문에 에러가 난다.
}
}
Java
복사
class Scar 의 int year 와 생성자 SCar() 가 default로 선언되었기 때문에 다른 패키지에서는 사용이 불가능하다.
사용하고 싶다면 public 으로 선언해주어야 한다.
ㅈ
•
매개 변수를 통해서 잘못된 값이 넘어오는 것을 막기 위해 private 를 사용하는 것.
매개 변수가 값을 함부로 변경하지 못하게 변수를 private 로 선언한다.
private 에 접근하기 위해서 getter 와 setter 를 사용한다.
•
getter 와 setter 예시
class Car{
public int getSpeed() { // 값을 부르는 Getter
return speed;
}
public void setSpeed(int speed) { // 값을 수정할 수 있는 Setter
this.speed = speed;
}
}
Java
복사
•
예제 코드
class Circle{
private double rad = 0; // private로 선언되었기 때문에
final double PI = Math.PI; // Circle 클래스 내부에서만 사용 가능하다.
public double getRad() { // rad를 위한 Getter
return rad;
}
public void setRad(double r) { // rad를 위한 Setter
if(r < 0){
rad = 0;
return;
}
this.rad = r;
}
public Circle(double r) {
setRad(r);
}
public double getArea(){
return rad * rad * PI;
}
}
Java
복사
public class PrivateTest {
public static void main(String[] args) {
Circle c = new Circle(1.5);
System.out.println("1.5일 때 " + c.getArea());
c.setRad(2.5);
System.out.println("2.5일 때 " + c.getArea());
c.setRad(-3.3);
System.out.println("-3.3일 때 " + c.getArea());
c.rad = -4.5; // Circle 클래스의 rad는 private 이므로 컴파일 오류가 난다.
System.out.println("-4.5일 직접 접근할 때 " + c.getArea());
}
}
Java
복사
위 코드처럼 Circle 클래스의 rad 에 음수가 오는 것을 막기 위해서 rad 를 private 로 선언했다.
그리고 rad 에 접근하기 위해 getter 와 setter 를 만들었다.
PrivateTest 의 주석처럼 c.rad = -4.5; 는 컴파일 오류가 난다.
접근제한자 관련 실무 Tip
1.
모든 변수는 무조건 private로 선언.
잘못된 값이 매개변수를 통해서 넘어오는 것을 막기 위해서.
2.
변수에 대해 getter 와 setter 를 만들어서 사용한다.
private 값에 접근하기 위한 메서드
3.
하나의 파일에서 public class 는 하나만 사용 가능하다.
4.
Class 와 생성자는 접근제한자를 별도로 설정해야 한다.
Class 가 public 이어도 생성자(메서드)는 접근 제한자를 따로 설정해 주어야 사용할 수 있다.
package edu.lion.car;
public class HCar {
HCar(){ // default 생성자
System.out.println("현대차 생성자");
}
}
Java
복사
import edu.lion.car.HCar;
public class JvmTest {
public static void main(String[] args) {
HCar har; // HCar의 생성자 HCar()가 default이므로
har = new HCar(); // 여기에서 컴파일 오류가 난다.
}
}
Java
복사