접근 제한자에는 public , protected, default, private 이렇게 4 가지가 있다.
public
클래스, 필드, 생성자, 메서드를 선언할 때 public을 붙이면 public 접근 제한을 가진다.
public 접근 제한을 가지게 되면 같은 패키지 내에서 뿐만 아니라 외부 패키지에서도 사용할 수 있다.
default
클래스, 필드, 생성자, 메서드를 선언할 때 public을 생략한다면, default 접근 제한을 가진다.
default 접근 제한을 가지게 되면 같은 패키지 내에서만 사용할 수 있다.
protected
protected 제한자는 public과 default 접근 제한의 중간쯤에 해당된다.
같은 패키지 내에서는 접근 제한이 없지만, 외부 패키지에서는 자식 클래스만 접근을 허용한다. (상속)
package package1;
public class A{
protected String field;
protected A(){ //field 필드와 A클래스 생성자는 protected 접근 제한을 가진다
}
}
package package2; //A클래스의 패키지와 다른 패키지다.
import package1.A; //패키지 1의 A클래스를 import해온다
public class B{
public B(){
//A a = new A(); A생성자는 protected 접근 제한.A의 자식 클래스가 아니다.접근 x
}
}
public class C extends A{ //C클래스는 A클래스의 상속을 받는 자식클래스. 접근가능
public C(){
A a = new A(); // 단, new 연산자를 이용해 생성자를 호출 할 수는 없다.
super(); // super()로 부모 클래스인 A의 생성자 호출 가능.
this.field = "Value";
}
}
private
클래스 내에서 필드, 생성자, 메서드를 선언할 때 private을 붙이면 private 접근제한을 가지게 되며,
모든 외부 클래스에서 접근하지 못한다. (private은 클래스의 접근 제한자로는 사용 못한다.)
public class A{
private A(){
}
}
public class Test{
A a = new A(); // A() 생성자는 private 접근 제한을 가지므로 불가.
}
위 경우 생성자 선언 시에 private 접근 제한자를 사용했으므로 외부 클래스에서 생성자를 호출하지 못한다.
즉, 클래스 외부에서 new( )를 통해 객체 생성을 할 수 없다.
이를 이용한 것이 바로 싱글톤 패턴이다.
가끔 프로그램에서 단 하나의 객체만 만들 수 있도록 설정해야하는 경우가 있을 때 싱글톤 패턴을 사용한다.
//싱글톤 패턴
public class Manager{
public static Manager instance = new Manager(); //클래스 내에서 객체 단 1개 생성
private Manager(){ //생성자에 private 제한자를 두어 외부 클래스에서 접근 x
}
static Manager getInstance(){ //생성한 객체 1개를 외부 클래스에서 사용하게
return instance;
}
}
일반적으로는 외부에서 객체의 데이터에 접근하는 것을 막는다.
외부에서 마음대로 읽고 변경할 경우 객체에 결점이 생길 수도 있기 때문이다.
따라서 객체 지향 프로그래밍에서는 주로 메소드를 통해서 데이터에 접근할 수 있게 한다.
Getter와 Setter 메서드가 바로 그 예이다.
public class Car{
public String name;
private int speed;
Car(String name){
this.name = name;
this.speed = 0;
}
public int getSpeed(){
return this.speed;
}
public int setSpeed(int speed){
this.speed = speed;
}
}
public class CarTest{
public static void main(String[] args){
Car myCar = new Car("Ray");
// myCar.speed = 5; 잘못된 코드이다. car객체의 speed필드는 private이므로 접근 불가
myCar.setSpeed(5); //객체의 setSpeed 메서드를 통해 speed에 우회접근, speed 설정
System.out.println("내 차의 속도: " + Integer.toString(myCar.getSpeed())//getSpeed 메서드로 필드 접근
//Integer.toString( 정수 입력 )을 이용하면 정수를 String으로 변경할 수 있다.
}
}
만약 외부에서 필드를 가져올 수 있게만 하고 수정을 불가하게 하고 싶으면 Getter 메서드는 냅둔 채
Setter 메서드만 지우면 된다.
'Dev > Java' 카테고리의 다른 글
[Java] 추상클래스 (0) | 2022.07.27 |
---|---|
[Java] 다형성 (0) | 2022.07.21 |
[Java] final 키워드 (0) | 2022.07.16 |
[Java] 메서드 오버라이딩 (0) | 2022.07.11 |
[Java] 클래스 상속 (0) | 2022.07.08 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!