본문 바로가기
개발/Java

[1주차] Java 중급 - 복습해봅시다(static과 싱글톤 패턴)

by 컴쏘 2023. 6. 24.

설명에 따른 객체를 구현하여 테스트 코드가 실행되도록 구현하기

자동차 공장이 있습니다. 자동차 공장은 유일한 객체이고, 
이 공장에서 생산되는 자동차는 제작될 때마다 고유의 번호가 부여됩니다. 
자동차 번호가 10001부터 시작되어 자동차가 생산될 때마다 10002, 10003 
이렇게 번호가 붙도록 자동차 공장 클래스, 자동차 클래스를 구현하세요.
다음 CarFactoryTest.java 테스트 코드가 수행 되도록 합니다.

객체 → 자동차 공장

public class CarFactoryTest {

	public static void main(String[] args) {
		CarFactory factory = CarFactory.getInstance(); // static의 CarFactory의 instance를 준 것
		Car mySonata = factory.createCar(); // createCar내부에서 생성한 인스턴스 받음
		Car yourSonata = factory.createCar();
		
		System.out.println(mySonata.getCarNum());     //10001 출력
		System.out.println(yourSonata.getCarNum());   //10002 출력
	}
}

CarFactory.java

package ch19;

public class CarFactory {

	private static CarFactory instance = new CarFactory(); 
	// static 선언 -> CarFactory의 instance를...
	
	private CarFactory() {}
	
	public static CarFactory getInstance() { // static으로 method 선언
		if(instance == null) {
			instance = new CarFactory();
		}
		return instance;
	}
	
	public Car createCar() {
		
		Car car = new Car(); // 내부에서 생성자 호출 
		return car;
	}
}

Car.java

package ch19;

public class Car {

	private static int serialNum = 10000; // static으로 선언 
	private int carNum;
	
	public Car() {
		serialNum++;
		carNum = serialNum;
	}

	public int getCarNum() {
		return carNum;
	}

	public void setCarNum(int carNum) {
		this.carNum = carNum;
	}
}

추가공부

싱글톤 패턴의 사용이유

  • 메모리 측면 : 최초 1번의 new 연산자를 통해 고정된 메모리 영역을 사용 → 추후 해당 객체에 접근할 때 메모리 낭비를 방지 가능 & 인스턴스 활용과 속도 측면에서 유리
  • 데이터 공유가 쉬움 : 전역으로 사용되는 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용가능
    • 여러 클래스이 인스턴스에서 싱글톤 인스턴스의 데이터에 동시 접근시 동시성 문제가 발생할 수 있음 (단점)
      • syncronized 사용해야 함
    • test하기 어렵다 (단점)
      • 자원을 공유하기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화 시켜주어야 함
  • 단점
    • 의존 관계상 클라이언트가 구체 클래스에 의존하게 됨
    • new 키워드를 직접 사용해서 클래스 안에서 객체를 생성 → solid 원칙 중 dip을 위반하고 ocp 원칙 또한 위반할 가능성이 높음
    • 자식 클래스를 만들기 어려움

2023 KAKAO Tech Campus_BackEnd 필수 과정
Java 1주차 강의 정리 내용입니다.