JAVA(Singleton pattern, Array) - 5

Object와 OOP(Object-Oriented Programming)

Fastcampus 강의, programmers 강의와 부족한 부분들을 검색하면서 공부할 예정이다.


Singleton Pattern

program에서 instance가 단 한개만 생성되어야 하는 경우에서 사용하는 디자인 패턴이다. 그렇다면 언제 이렇게 디자인할까?

→ 날짜 객체 : 시간이라는 개념이 2개 이상 존재하면 안된다. 절대적인 시간 하나만 있어야 한다.

→ “회사” 라는 객체 : 우리 회사의 시스템을 구현하고 싶다면, 회사는 2개이면 안될 것이다.

위와 같은 경우에서 날짜, 회사 라는 객체는 2개 이상이면 안된다.


Singleton Pattern 구현

어떻게 구현할 수 있을까? 처음에 말로만 듣고는 그냥 한번만 선언하면 안되는건가…? 싶었지만 Java를 배우면서 느낀건 되게 안전함을 추구하는 언어인 것 같았기에 그 어떠한 가능성이라도 배제하려는 것 같았다.(사용자가 실수로 2번 선언할 수도 있다는 가능성 배제)

일단 Constructor를 private으로 선언하고, instance를 statc하게 선언하는 것으로 시작한다. 다음과 같은 상황을 내 나름대로 구현해봤다.

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

여기로가면 내가 작성한 코드를 볼 수 있다. 이번에는 singleton pattern 으로 instance를 선언하는 것 이외에는 처음부터 혼자서 구현했었다.


class CarFactory{
    private static CarFactory instance = new CarFactory(); // static변수로 instance 생성. class가 load될 때 이미 instance가 생성된 것.
    private static int makeCount = 0;

    private CarFactory() { } // Constructor

    public static CarFactory getInstance() { // 외부에서 여기에 접근하여 instance 주소를 얻을 수 있다.
        if(instance == null) { // 혹시라도 instance가 없다면 생성하고 반환.
            instance = new CarFactory();
        }
        return instance;
    }

    Car makingCar(String carName, String carColor) {
        Car makedCar = new Car(carName, carColor);
        makeCount++;
        return makedCar;
    }

    void factoryInfo() {
        System.out.println("The factory make " + makeCount + " cars.");
    }
}

singleton pattern으로 선언하는 방법이다. 나머지는 역시나 너무 기초적인 것이라서 설명은 안적었다.


Array

여기에도 Java의 Array에 대해 포스팅을 했었다. 저 글을 적었을 때는 너무 이론적인 부분부터 세세하게 공부하려다가 포스팅이 엄청 오래걸렸고, 이해 안가는 부분도 존재했었다.


arrayCopy() method

Java에서 제공하는 array 복사 method이다. 처음봤었기에 사용법과 Object Array에서는 어떻게 복사를 하는지에 대해 볼 것이다.

System.arrayCopy(src, srcPos, dest, destPos, length);

부끄럽게도 docs라는 좋은 사이트를 모르고 이때까지 객관적인 자료를 얻기위해 wikipedia랑 다른 신빙성 있어보이는(?) 사이트를 돌아다녔다. 오라클에서 제공하는 docs를 보고 내가 모르는 method가 있으면 분석하기 좋았다.


user defined Object(객체) 또한 배열에 저장할 수 있다.

Car[] cars = new Car[6];
cars[0] = new Car();
cars[1] = new Car();
...

위처럼 선언하고 쓰면 된다. 근데 만약에 arrayCopy() method를 사용해서 복사를 한다면??


먼저 결론부터 말하면 arrayCopy()는 객체 배열을 복사할 때 instance자체의 내용을 복사하는 것이 아니라 instance를 가리키는 reference variable의 값을 복사했다. 따라서 원본 배열의 요소인 Car객체의 instance값을 바꾸면 복사된 객체의 instance의 값도 바뀐다는 것이다. 이러한 상황을 방지하려면 각각 따로 객체를 new로 선언하고 for문을 써서 하나하나 복사해주는 방법으로 하면 된다.