1. Getter 와 Setter

🚀  객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨질 수 있다.

       ex. 자동차의 속력은 음수가 될 수 없는데, 외부에서 음수로 변경하면 객체의 무결성이 깨짐

🚀  이러한 문제점 때문에 OOP에서는 직접적인 외부에서의 필드 접근을 막고 대신 메소드를 통해 필드에 접근하는 것을 선호

       ➡️  메소드는 데이터를 검증해서 유효한 값만 필드에 저장할 수 있기 때문

       ➡️  이러한 역할을 하는 메소드가 Setter

🚀  필드값이 객체 외부에서 사용하기에 부적절한 경우, 메소드로 적절한 값으로 변환해서 리턴할 수 있다.

       ➡️  이러한 역할을 하는 메소드가 Getter

private 타입 fieldName;

// Getter
public 타입 getFieldName() {
  return fieldName;
}

// Setter
public void setFieldName(타입 fieldName) {
  this.fieldName = fieldName;
}

 

  • field 타입이 boolean일 경우에는 Getter는 get으로 시작하지 않고 is로 시작하는 것이 관례
public class Car {
	// 필드 선언
	private int speed;
	private boolean stop;
	
	// speed 필드의 Getter/Setter 선언
	public int getSpeed() {
		return speed;
	}
    
	public void setSpeed(int speed) {
		if(speed < 0) {
			this.speed = 0;
			return;
		} else {
			this.speed = speed;
		}
	}
    
	// stop 필드의 Getter/Setter 선언
	public boolean isStop() {
		return stop;
	}
    
	public void setStop(boolean stop) {
		this.stop = stop;
		if(stop == true) this.speed = 0;
	}
}
public class CarExample {
	public static void main(String[] args) {
		//객체 생성
		Car myCar = new Car();

		//잘못된 속도 변경
		myCar.setSpeed(-50);
		System.out.println("현재 속도: " + myCar.getSpeed());

		//올바른 속도 변경
		myCar.setSpeed(60);
		System.out.println("현재 속도: " + myCar.getSpeed());
		
		//멈춤
		if(!myCar.isStop()) {
			myCar.setStop(true);
		}
		System.out.println("현재 속도: " + myCar.getSpeed());
	}
}

 

 


2.  싱글톤 패턴  Singleton

🚀  애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤 패턴을 적용

🚀  핵심은 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막는 것

🚀  대신 정적 메소드를 통해 간접적으로 객체를 얻을 수 있다.

public class 클래스 {
  // private 접근 권한을 갖는 정적 필드 선언과 초기화
  private static 클래스 singleton = new 클래스();
  
  // private 접근 권한을 갖는 생성자 선언
  private 클래스() {}
  
  // public 접근 권한을 갖는 정적 메소드 선언
  public static 클래스 getInstance() {
    return singleton;
  }
}
  • 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 것.
  • getInstance() 메소드가 리턴하는 객체는 정적 필드가 참조하는 싱글톤 객체이다.
  • 따라서 아래 코드에서 변수1과 변수2가 참조하는 객체는 동일한 객체가 된다.
클래스 변수1 = 클래스.getInstance();
클래스 변수2 = 클래스.getInstance();

public class Singleton {

    private static Singleton singleton = new Singleton();

    private Singleton() {}

    static Singleton getInstance() {
        return singleton;
    }
}
public class SingletonExample {
	public static void main(String[] args) {
		/*
 		Singleton obj1 = new Singleton(); //컴파일 에러
 		Singleton obj2 = new Singleton(); //컴파일 에러
		 */
		
		//정적 메소드를 호출해서 싱글톤 객체 얻음
		Singleton obj1 = Singleton.getInstance();
		Singleton obj2 = Singleton.getInstance();

		//동일한 객체를 참조하는지 확인
		if(obj1 == obj2) {
			System.out.println("같은 Singleton 객체입니다.");
		} else {
			System.out.println("다른 Singleton 객체입니다.");
		}
	}
}

 

 

 

*  내용 참고 - 책 '이것이 자바다'

+ Recent posts