MVC패턴을 기반으로 로또미션을 진행하던중 의문점이 생겼다.
의문점이 생긴 부분은 아래와 같다❗❗
public class LottoController {
private final InputView inputView;
private final OutputView outputView;
public LottoController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}
위 코드를 보면 InputView, OutputView 객체를 생성해서 LottoController 객체의 인스턴스 변수로 생성해준다.
아무생각 없이 제출햇던 코드에서 대해 리뷰어 분께서 "인스턴스 변수를 선언하는 기준이 무엇인가?"라는 질문을 던져 주셨고 이부분을 고민해보게 되었다❗
고유한 상태(데이터)와 상태를 변화시키는 행동(로직)을 가지는 객체들이있다. 자기자신만의 상태를 가진다는 것은 같은 객체라고 해도 서로 구별된다는 것이다.
그러므로 고유한 상태를 가지는 객체들은 다른 객체안에서 사용할때 고유한 상태를 유지하게끔 인스턴스 변수화 하여 사용해주어야한다.
아래의 코드를 살펴보자❗
public class Cars {
private final List<Car> cars;
public Cars(List<String> carNames) {
this.cars = ... new Car(carNames);
}
}
...
public class Car {
private final String carName;
public Car(String carName) {
this.carName = carName;
}
}
위 코드의 Car 객체는 carName이라는 변수를 상태로 가진다. 즉, Car 객체들은 각각 고유한 자동차이름을 가진다는 것이다.
동시에, Cars 객체는 Car 객체들을 인스턴스 변수로 가진다. Cars 객체는 각자 다른 이름을 가진 Car들을 고유한 상태로 가진다는 것이다.
위 예시 같이 고유한 상태를 가지는 객체들은 인스턴스화 시켜 자기자신만의 상태를 가지게끔 해주어야한다!
왜냐하면, 인스턴스화 하지 않는다면, Car 객체들은 모두가 가지는 하나의 이름을 가진 객체들이 되기 때문이다.
하나의 객체안에는 다양한 행동(함수)를 가질 수 있다.
그런데 코드를 작성하다보면 객체 안의 다양한 행동안에서 반복적으로 사용되는 또 다른 객체가 있을 것이다.
이때, 매번 객체를 생성해주면 코드의 가독성도 좋지 않을 뿐더러, 메모리의 낭비도 가져올 것이다.
그렇기 때문에, 객체안에서 다양한 행동(함수)에서 자주 호출 되는 객체는 인스턴스 변수화하여 객체 안에 넣어주어야한다!
public class LottoController {
private final InputView inputView;
private final OutputView outputView;
public LottoController(InputView inputView, OutputView outputView) {
this.inputView = inputView;
this.outputView = outputView;
}
다시 맨처음의 코드를 보자❗
LottoController객체는 InputView, OutputView를 인스턴스 변수로 가진다.
그런데, InputView, OutputView 객체는 인스턴스 변수를 만드는 나만의 조건 2번에는 해당하지만 1번에는 해당하지 않는다.
그래서, 과연 InputView, OutputView를 인스턴스 변수로 사용하는 것이 옳은 것인가 하는 의문이 들었다.
왜냐하면 LottoController의 여러 함수에서 InputView, OutputView가 호출되기는 하지만 고유한 상태를 가지지는 않기 때문이다.
또한, 여러함수에서 호출된다는 조건은 InputView, OutputView를 Static화 해주어도 해결되기 때문이다.
만약, 프로그램의 규모가 커져 view가 InputView, OutputView 뿐 만이 아닌 더욱 많은 객체들을 가진다고 하자.
이때, 모든 view 객체들을 static화 하여 사용한다면 프로그램이 종료 될 때 까지 공간을 차지하면서 메모리 공간의 낭비를 가져 올 수 있다.
Static 메서드는 코드의 재사용성을 높여주는 자바의 유용한 객체지향적 기능인 Interface를 사용하는 것을 방해한다.
view에 많은 객체들이 생기고 view의 객체들을 Interface를 통해 다형성을 만들어주고자 할때, Static한 객체들은 Interface사용을 방해 할 수 있다.
객체지향프로그래밍은 객체들이 협력관계 속에서 각자의 책임을 가지고서 다른 객체에게 요청을 보내고 응답을 받는 프로그램세계라고 생각한다.
그래서 나는 객체들끼리 요청과 응답을 받는 구조를 만들기 위해 Static 사용을 지양했다.
하지만, 이번 미션을 진행하면서 현재 프로그램 규모에서 상태를 가지지 않는 InputView, OutputView를 굳이, 인스턴스 변수화하는 것이 좋은 것일까?? 하는 의문점이 생기게 되었다.