728x90

자바 접근제어자 - private와 public의 차이점
자바에서 클래스의 필드나 메서드에 접근할 수 있는 범위는 접근제어자(Access Modifier) 로 결정됩니다. 이 중 가장 자주 사용되는 두 가지, private와 public의 차이점은 무엇일까요?
기본 구조
package edu.mju.oop;
public class Car {
private int member_val;
public void access(int a){
member_val = a; // 같은 클래스 내부라서 접근 가능
}
}
- member_val은 private으로 선언되어 있으므로 Car 클래스 내부에서만 접근 가능합니다.
[같은 패키지 - 다른 클래스] → 접근 불가
package edu.mju.oop;
public class Asset {
Car c = new Car();
public void add(int val){
c.member_val = val; // 같은 패키지여도 다른 클래스에서는 private 접근 불가
}
}
설명: Car와 Asset이 같은 패키지에 있어도 member_val은 private이므로 외부 클래스에서는 접근할 수 없습니다.
[다른 패키지] → 접근 불가
package edu.mju.nonOOP;
public class Driver {
Car c = new Car();
public void drive(int speed){
c.member_val = speed; // 다른 패키지 + 다른 클래스
}
}
설명: 패키지가 다르면 당연히 접근 불가! 게다가 private은 패키지 구분 없이 클래스 외부 접근 자체가 안 됨.
[다른 패키지 + 상속 관계] → 접근 불가
package edu.mju.nonOOP;
public class BMW extends Car {
public void valueUp(int add){
member_val += add; // 상속받아도 private 멤버에는 직접 접근 불가
}
}
설명: 상속을 받았다고 해도 private 멤버는 서브 클래스에서도 접근할 수 없습니다.
public이면 어떻게 될까?
public int member_val;로 바꿔준다면
위의 모든 경우에서 접근이 가능해져요. 어디서든지 객체를 통해 member_val에 접근할 수 있게 됩니다.
private vs public
제어자접근 가능 범위예시
private | 같은 클래스 내부에서만 접근 가능 | Car 클래스 내부의 member_val 접근 |
public | 어디서든 접근 가능 | 외부 클래스, 다른 패키지, 서브 클래스 등 모두 접근 가능 |
- 메서드는 public으로 선언해서 외부에서 접근하도록 함
- setter, getter 메서드를 이용해 private 필드에 간접적으로 접근하게 한다
728x90