개발공부/객체지향의 사실과 오해

[객(체지향의)사(실과)오(해)] 3. 타입과 추상화( 부제 : 어...이거?!)

장아장 2023. 4. 28. 17:49

제목에서 보았듯이, 읽자마자 어? 이거 어디서 봤는데? 하는 부분이 상당히 겹쳐있었다. 

이전에 CS를 공부하면서, 팩토리 패턴에서 공부했던 내용과 상당히 겹치는 부분이 있다고 느꼈다. 

 

뭐랄까, 팩토리 패턴이라는 하나의 정형화된 패턴을 구현하기 위해서 알아야 하는 추상화라는 부분을 다시 한번 공부한 것 같다는 느낌이 든다. 

 

간단하게 읽은 부분을 스스로 곱씹어본 것을 정리해보았다. 

추상화

  • 같은 역할을 하는 객체들을 동일한 역할명으로 추상화를 시킬 수 있었다. 
  • 어떻게 보면, 여태까지 이야기하던 역할이라는 부분은 단순하게 보면 인터페이스로 만들 수 있다고 생각이 든다. 
  • 그래서, 인터페이스라는 역할을 클래스가 수행하게 되면 되는 것 아닐까 라는 생각이 든다. 

이를 2주차를 리펙토링 하고, 3주차를 구현해보았다. 

앨리스는 케이크, 부채, 차, 버섯이라는 '아이템을 사용' 한다. 

즉, 앨리스라는 사용자 객체는 아이템을 사용한다. 이게 사용자의 역할이 된다. 

그렇다면, 아이템은 사용된다는 역할을 가진다. 

 

이를 위해 interface로 공통적인 메서드들을 만들어주었다. 

이를 각 클래스에서 구체화해준 것이다. 

이런식으로 interface를 구체화 시켜서 사용한다. 

이렇게 했을 때 장점은, 

앨리스는 이 메서드 하나로 모든 아이템을 사용할 수 있게 된다. (참 편하다 ㄹㅇ)

이를 통해 우리는 사용자라는 역할의 아이템을 사용한다는 하나의 기능을 정말 하나의 메서드로 만들 수 있게 된다. 

이게 추상화되지 않았다면, 버섯을 먹고 키가 커지기, 버섯을 먹고 키가 작아지기, 차를 마시기, 케이크를 먹기, 부채를 쓰기를 모두 다른 메서드로 만들어야 한다. 

 

추상화를 통해서 객체를 하나의 묶음으로 만들 수 있다는 장점이 있었다. 

그런데, 이 외에도 abstract class를 사용하는 방법도 존재했다. 

두 번의 경험을 위해 실제 3장을 위해 만드는 코드는 abstract class로 만들어보았다. 

 

프로젝트에 대한 아이디어는 우아한 테크코스에서 하는 자동차게임에서 따왔다. 

자동차의 종류를 3개정도 정해두고, 이를 입력받는 종류대로 만들어준 후, 이들끼리 시간이 지남에 따라 레이싱을 하고 1등이 발생하면 종료하는 방식으로 진행했다. 

 

자동차의 추상화클래스를 만들어주고, 이를 SUV, 레이싱카, 승용차 3가지로 만들었다. 

각자의 속도는 정해두고, 시작위치만 다르게 넣어 생성을 하게 해주었다. 

팩토리 패턴의 방식을 가져와 이를 통해 입력에 따라 동적으로 다른 클래스를 만들게 해주었다. 

이를 통해 하나의 메서드로 자동차를 종류별로 만들 수 있게 했다. 

 

사실 추상화 라는 부분을 공부하면서 실제 CS의 부분과 겹치는게 많다는 생각이 든다. 

우리가 공부하려는 모든 지식들은 사실 유기적인 관계가 아닐까 생각해본다. 

혹시 내가 또 활용할 지식이 있을 수 있으니 더 공부해봐야지

 

그럼...twenty thousand...🔥