녕의 학습 기록

[Java] 접근 제한자 / 싱글톤 패턴 / Getter , Setter 본문

Dev/Java

[Java] 접근 제한자 / 싱글톤 패턴 / Getter , Setter

kjyyjk 2022. 7. 19. 12:37

접근 제한자에는 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