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 객체입니다.");
}
}
}
* 내용 참고 - 책 '이것이 자바다'
'Programming Language > JAVA' 카테고리의 다른 글
[Java] 오버라이딩 Overriding (0) | 2024.08.11 |
---|---|
[Java] 상속 Inheritance (0) | 2024.08.11 |
[Java] final 필드와 상수 · 접근 제한자 (0) | 2024.08.11 |
[Java] 인스턴스 멤버와 정적 멤버 (0) | 2024.08.10 |
[Java] 생성자 Constructor (0) | 2024.08.10 |