아래 경험은 OOP 강의 및 풀코스를 듣고 나서, 저의 생각들을 정리한 글이며 주관적인 글이니 감안하고 읽어주시면 감사합니다.

 

이 과목을 알게 된 배경

처음 프로그래밍을 공부를 하고자 했을 때, 프로그래머로 빠르게 취업을 하고 싶다면 java를 배워야 한다는 말을 자주 들었다. java만 배우면 일단 취업이 가능하다고? 이러한 생각 때문인지 java를 배울 수 있는 국비학원, 책, 인강 등을 찾기 시작했는데, 그때 알게 된 게 pocu아카데미였다. 하지만, intro 강의를 들었을 때 내가 원하는 java를 처음부터 배우는 과정이 아니었기에 아쉬워하며 pocu 첫 강의인 c#강의를 듣고, java의 정석을 구매하여 다른 사람들과 java를 독학하기 시작했다. 그렇게 시간이 지나고 현재 포큐 과목을 계속 수강하며 드디어 java 개체지향 강의를 듣게 되었다. 

 

이 강의는 절대 Java의 기본기를 가르쳐주는 강의가 아닌 OOP설계 중심의 강의이니 들을 때 꼭 참고를 해주셨으면 좋겠다. 

 

OOP 패러다임은 무엇일까?

Object-oriented programming (OOP) is a programming paradigm based on the concept of "objects", which can contain data and code. The data is in the form of fields (often known as attributes or properties), and the code is in the form of procedures (often known as methods).
 

Object-oriented programming - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search Programming paradigm based on the concept of objects "Object-oriented" redirects here. For other meanings of object-oriented, see Object-orientation. Object-oriented programming (OOP)

en.wikipedia.org

간단하게 말하자면 아래와 같다.

 

https://www.udemy.com/course/object-oriented-programming-and-design-by-pocu/learn/lecture/18959442#overview

즉, 절차적인 프로그래밍을 사람처럼 생각해보자는 것이다. 여러 개의 변수들과 동작들을 각각 묶어 하나의 object로서 사용을 하여 사람들이 이해하기 쉬운 프로그래밍을 만든 것으로 이해할 수 있다. 

 

 

OOP과목을 들어야 하는 이유

 

C강의에서 이어지는 내용들

 

POCU 2200 수강후기

들어가는 글 Comp1500 C# 강의와, Comp 1000 강의를 듣고 나서, 취업을 어떻게 할 것인지 고민을 할까 고민을 하게 되었습니다. 딱히 어떠한 개발자가 되어야 할지 막막했고, 부트캠프나 국비 학원처럼

rocketnoning.tistory.com

윗글에서 작성한 중복된 내용이지만, C 강의를 들었다면 java에서 메모리들이 어떻게 할당되고 어디에 위치하는지 더 잘 알 수 있게 된다. 위의 그림은 스택과 힙에 어떤 식으로 자료들이 저장되는지 보여주는 자료이다

https://speakerdeck.com/deepu105/jvm-memory-usage-stack-vs-heap

C언어를 들은 뒤에 자바 프로그래밍을 하면서 추가로 생각해 봤던 부분.

 

보이지 않는 포인터

C에서는 pointer 자료형을 통해서 포인터를 직접 다루고 만진다. 하지만, 자바에서는 포인터는 다루지 않지만 대부분의 힙 메모리에 저장되는 포장된 포인터를 다루게 된다. 매니지드 언어 내부도 어쩔 수 없이 언 매니지드와 비슷하게 동작할 수밖에 없다.

 

빠른 바인딩과 늦은 바인딩

다형성을 배우게 되면 빠른 바인딩과 늦은 바인딩을 공부하게 된다. 컴파일 시 동작을 정의하는 이른 바인딩과 함수포인터를 통해서 연산자를 필요에 따라 바꾸며 사용하는 것을 보여주던 예제가 늦은 바인딩을 보여주는 예제라는 것을 깨닫게 된다. 그리고 다형성이 말이 달라서 다른 개념인 것 같지만, 결국 하나의 개념으로 통합되는 기쁨을 느끼면서 왜 Low 수준의 언어 또한 알아야 하는지 깊이 느끼게 된다.

 

COMP 2500 실습과 과제들

실습

예전 과목들을 들을 때 가장 후회했던 것 중 하나가 시간이 없다고 실습을 하다가 빌드봇 100%를 맞으면 대충 넘어간 적이 몇 번 있었다. 하지만, comp2500의 실습은 쉬워 보이지만 생각할 것들이 조금씩 남아있다.

생각해볼 만한 주제들이 몇 가지 있지만 그중에서 생각나는 것들은 LRU, 개체 모델링, 디자인패턴, 예외처리 이렇게 4가지가 가장 기억에 남는다.

  • LRU를 통한 멀티턴 연습
  • 개체 모델링으로 자동 화분 물 주기 프로그램 만들기
  • 책임연쇄패턴을 직접 만들어보며 느끼는 디자인 패턴
  • Exception handling에 대한 생각 해보기

등등 여러 가지가 있지만 실습조차 재미있었고, 이를 통해서 얻어가는 것이 많았다. 개체지향은 더구나 어떤 걸 연습해 보기에는 내가 제대로 설계를 해 나가는지 알 수 없었는데, 여러 가지 주제의 실습을 거치다 보면 조금씩 실력이 늘어나가는 것을 확인할 수 있었다.

 

과제

2500 과제들은 정말 할게 많다. 만약에 이 과목을 듣게 되신다면 과제는 꼭 시작하는 날부터 하시기를 권장한다. 2500 과제들은 대부분 설계에 중점을 둔 숙제들이다. 상속, 다형성, 디자인 패턴을 사용할 때 개체들의 관계 등 여러 가지를 경험해 볼 수 있다. 그리고 매우 추상적인 글을 보고 만들어야 하기 때문에 헤매는 것 또한 생기지만 거기에서 질문을 어떻게 하는지도 자신의 실력이라고 볼 수 있으니 슬랙에 모르는 부분은 과감하게 물어보는 것이 중요하다.

 

처음 과제를 마주하면 느낄만한 감정은 다음을 읽는 기분이었다.

소녀의 흰 얼굴이, 분홍 스웨터가, 남색 스커트가, 안고 있는 꽃과 함께 범벅이 된다. 모두가 하나의 큰 꽃묶음 같다. 어지럽다. 그러나, 내리지 않으리라. 자랑스러웠다. 이것만은 소녀가 흉내 내지 못할, 자기 혼자만이 할 수 있는 일인 것이다.

소나기 중 일부

 

문학책을 설계해야 하는 느낌이었다.(물론 명세서는 절대 문학책이 아니다) 명세서를 읽지만 이게 코딩을 하라는 건지 내가 무엇을 해야 하지?라는 생각을 매우 강하게 들게 했다. 그래도 뭐라도 해야 하기에, 일단 코드를 작성하다 보면 내가 무엇을 하고 있던 거지?라고 생각하게 되어 자괴감을 느낀 적이 한두 번이 아니다.

과제를 하다가 이렇게 말하고 싶었다..

 

http://www.yes24.com/Product/Goods/97919905

 

물론, 가끔 포프 님이 힌트도 주시니 이를 참고하면 금방 답에 가까워질 수 있다.

 

그래도 과제를 통해 배운 것들이 많은데 다음과 같다

- 함수의 명칭과 파라미터가 얼마나 중요한지 이해하고 사용해볼 수 있다.

- 다형성과 상속으로 풀 수 있는 문제가 다르다

- 공통성과 가변성의 분리

- 유연성 높은 설계와 개체의 상태 

 

 

상속 vs 컴포지션 선택 기준

상속과 컴포지션 선택 기준 개체지향 설계 생각에 대한 배운점 정리 프로젝트를 진행하면서 생각을 하게 된 생각이 있다. 여러가지 프래그먼트들이 존재하지만 팀원이 만든 DialogFragment 클래스

rocketnoning.tistory.com

 

OOP 설계 배운점 - 1

1. 생성자를 잘 구성하자 public Post( UUID id, String title, String body, UUID authorId ) { OffsetDateTime now = OffsetDateTime.now(); this.id = id; this.title = title; this.body = body; this.authorId = authorId; this.createdDateTime = now; this.mo

rocketnoning.tistory.com

 

OOP - 설계시 배운점 2

상속(추상화)과 다형성은 다른 문제해결 방법이다. 상속(추상화)로 해결할 수 있는 부분 → 데이터들의 기능이 다르지 않을때 즉, 데이터들의 기능이 같고 상태가 다를때는 추상화를 통한 상속

rocketnoning.tistory.com

 

OOP - 배운점 3

유연성이 높은 설계와 결합도가 높은 설계의 차이 OverdrawAnalyzer overdrawAnalyzer1 = new OverdrawAnalyzer(5, 5); CommandHistoryManager commandHistoryManager = new CommandHistoryManager(overdrawAnalyzer1); commandHistoryManager.execute(ne

rocketnoning.tistory.com

이것 말고도 배운 점은 많지만, 내가 잘 몰랐던 부분들을 작성해 두었던 것인 점을 감안해서 읽어주시면 감사하다.

 

 

개체 모델링

Udemy 강의중 목차

개체 모델링을 배우는 부분처럼 상속을 통한 개체 모델링 크게 2가지를 배우게 된다. 보통 클래스들 간의 동작을 작성하게 되면 어떤 식으로 작성할지 많은 고민을 하기 마련이고, 이를 배우는데 그냥 코드만 나와있는 경우가 대부분인데 이처럼 차근차근 하나씩 개체를 모델링하는 방법을 같이 고민해 주신다. 이를 통해서 개체를 어떻게 모델링해야 할지 따라 해 보면서 체화시킬 수 있는 좋은 방법이었다. 

 

 

다른 사람들의 코드를 보고 성장하기

 

과제나 실습이 끝나고 나면 그래도 다른 학우분들께서 이렇게 코드를 공유를 해주신다. 그리고 이를 보면서 배울 점들을 찾아보자. 특히, 과제나 실습이 후반부로 갈수록 문제의 추상화가 깊어진다. 그렇기에 자기가 짠 코드와 다른 학우분이 짠 설계가 다를 수 있고 이를 통해서 다른 관점에서 바라보는 해결책을 엿보고 이를 배울 수 있다.

 

 

 

POCU 강의를 듣고 나서 내가 느낀 점

포프 님이 가르쳐주시는 OOP 디자인 패턴

디자인 패턴이 모든 문제를 해결해주지 않는다는 것이다. 물론, 디자인 패턴으로 풀 수 있는 문제들이 있다, 디자인패턴이 다 나쁜 것은 아니지만, 디자인패턴은 도구이지 프로그래밍의 목적이 되어서는 안 된다 를 가르쳐주신다.

 

https://ppss.kr/archives/87970

 

‘디자인 패턴’ 중독자

저는 술을 좋아합니다. 친한 주변인들이나 공통의 관심사를 갖는 사람들과 모여 맛있는 안주와 함께 술을 마시는 것은 매우 즐거운 일입니다. 하지만 제가 알콜 중독자가 된다면 반길 사람은 없

ppss.kr

지금도 디자인 패턴에 대해 아주 큰 의미를 부여하지 않는 것은 동일하지만 두 가지 측면에서는 위대함을 인정합니다. 첫 번째는 많은 프로젝트에서 반복적으로 겪는 다양한 문제의 가장 잘 정제된 해결책 중 하나라는 것이고, 두 번째는 패턴들의 이름이 매우 효율적인 의사소통 수단이라는 점입니다.

위 기사의 핵심적인 부분은 위와 같다. 즉, 디자인패턴의 지향점은 디자인패턴을 이해하되 이를 통해 모든 문제를 해결하지는 못한다는 점을 기사에서도, 경험적으로도 느낄 수 있었다. 

 

클래스 간의 관계를 이해하기 시작했다

패턴은 너무나 어려웠고, 상속받기 시작하면 상속은 그냥 다형성을 쓰려고 사용하는구나 정도로만 이해하고 있었다.

이렇게 다형성을 사용하기 위해서나 상속을 받고 interface를 사용하는 줄 알았다.

 

게다가..

https://coldmater.tistory.com/198

(콜드마이터님의 수강 후기 중 일부).. 정말 나도 이렇게 하라는 대로 했고 무엇인지 모르고 그냥 외우고 사용했다.

 

예전에는 코드를 볼 때면 상속에 관련된 부분은 아예 이해조차 못하고 대충 이해하고 어렵다고만 느껴졌다. 하지만 지금은 oop 간의 패턴이나 구조를 이해하는데 조금씩 보이고 있다. 그리고 이를 활용해서 코드를 작성하는 것은 또 다른 기쁨을 나에게 가져다주는 것을 알 수 있었다.

내부 코드 중 일부, 예전에는 도대체 어디서부터 무엇을 읽어야 할지 알 수 없었지만, 함수 시그니처와 클래스들의 관계가 눈에 들어오기 시작했다. 

 

개체의 유효한 상태가 가지는 중요성

개체가 생성될 때부터 가지는 상태가 유효함을 보장할 수 있도록 해야 한다.라는 것을 강의 처음부터 끝까지 일관적인 논리로 알 수 있게 도와주신다. 그리고 특히 과제를 통해서 알 수 있었는데 개체마다 자신이 정상적으로 사용될 수 있는 상태를 체크하는 검증 로직을 사용해 봄으로서 왜 이러한 동작들을 해야 하는지 알 수 있었다.

 

인터페이스와 함수포인터의 관계

c강의를 들었을 때 함수포인터는 도대체 왜 배우는 걸까 라는 의문을 가지고 사용해 왔다. 늦은 바인딩으로 사용하는 부분에서 좋다는 건 알겠는데 굳이 이렇게 써야 할까? 도대체 어떤 기능 때문에 이런 걸 발명했을까 하면서 그냥 대충 이해하고 넘어갔었었다.

왜냐하면 함수포인터를 왜 만들었는지 찾아보면 대부분 함수를 포인터로 가리키는 포인터입니다 정도만 알려주고, 이를 어떻게 사용하는지 자세한 설명이 없기 때문에 함수포인터를 더욱 이해하기 어렵게 만드는 결정적인 역할을 해왔다.

하지만 인터페이스를 보면서 아, 함수포인터가 이걸 하려고 만들어졌던 거구나 라는 생각이 들면서 함수포인터 및 인터페이스의 기능과 용도를 알 수 있었다.

 

스스로 생각하는 습관

물론 이전 강의들에서도 스스로 생각하며 코딩을 해왔다고 자부했지만, 빌드봇이 정말 이상한 에러들을 보여준다. 아래 표를 참고해보자

내가 정말 애를 먹었던 부분은 non-sensical 에러였는데, 이게 무엇을 뜻하는지 알 수 없어 몇 날 며칠을 머리를 싸매고 코딩을 했다. 그리고 빌드봇에게 계속 제출을 하면서 다른 사람이 보기에 내 코드의 어떤 부분들이 문제일까 그리고 어떻게 작성하는 것이 올바를지 많은 생각을 할 수 있게 도와주었다. 

 

ㅎㅎㅎ... 충격적이었던 과제 1 빌드 상황

 

결론

C강의부터 시작된 빌드업이기에 C를 들었다면 JAVA를 JAVA를 들었다면 C강의를 들어보는 것을 추천한다. C강의부터 시작한 거대한 스케일의 빌드업을 JAVA 강의에서 끝맺음을 할 수 있다. (물론 뒤에 나오는 어셈블리어 등등 또한 연결되겠지만 말이다)

실전적으로 사용할 수 있는 OOP 지식을 얻었다.

  • 유연성 높은 설계와 유연성이 낮은 설계 둘 다 상황에 따라 필요함을 알 수 있고, 이를 어떻게 잘 활용하면 좋을지 고민할 수 있는 단계까지 올라갈 수 있다.
  • 다형적인 프로그래밍을 해볼 수 있는 좋은 경험이다. 다형적 프로그래밍을 처음 해보는 사람은 이를 구현해보는 경험을 하기가 쉽지 않다. 특히 프로그래밍을 어려서부터 해보거나 컴퓨터 전공이 아닌 이상 비전공인 사람들은 대충 블로그 글을 보면서 다형적 프로그래밍이 이런 거는구나라고 이해하지 말고 과제를 통해서 직접 경험해 봤으면 좋겠다.
  • 디자인패턴이 모든 문제를 해결하지는 않는다. 디자인 패턴을 사용해보면서 이것들이 정말 문제 해결을 완벽하게 해 주는 것이 아니라 하나의 도구임을 알 수 있는 과제와 실습이 준비되어 있다.

 

설계 능력은 결국 경험

  • 2500을 들으면서 결국 설계 능력은 많이 코드를 작성해 본 사람만 가지고 있을 수밖에 없겠다고 생각을 했다.
  • 어떤 식으로 설계해야 할지 가이드해주는 부분이 초보자들에게는 필요한데 그 부분을 빌드봇이 완벽하게 수행해 준다. 물론, 엄청나게 많은 빌드봇의 빌드가 필요하지만 그럼에도 과제를 진행하기 위해서는 필요한 과정이다..

https://blog.pocu.academy/ko/2021/03/19/survival-log-39-build-bot-beat-you.html

 

이 강의를 들으면 좋은 사람

독학 혹은 책, 블로그로 oop를 배우는 사람들은 이 강의를 한 번은 들어봤으면 좋겠다. 그 이유로는 2500을 들으면서 OOP 설계 시 마주하는 여러 문제에 부딪히면서 실제 코딩을 해볼 수 있다.

  • oop를 배우고 제대로 코딩을 해볼 수 있는 기회가 없다. 독학은 말할 것도 없고 부트캠프는 더욱이 시간이 나지 않아 진득이 앉아 개체지향을 공부할 수 있는 시간이 많지 않다.
  • 단순히 책 혹은 블로그로 가볍게 상속 컴포지션 이런 게 있다 추상화는 뭐고 이런 개념과 관련된 아주 짤막한 코드들을 볼 뿐이었고 제대로 이해도 하지 못했다. 그리고 이 코드들은 다른 사람이 공부한 것을 정리한 부분이기 때문에 단편적인 부분밖에 보지 못할 뿐만 아니라 적절한 추상화, 적절한 난이도로 직접 코딩을 해볼 수 있는. 즉, 숲을 볼 수 있는 강의 (comp 2500)을 듣는 것이 좋다.

 

끝맺는 말

https://unsplash.com/s/photos/sun

c강의 때부터 그랬지만, pocu강의를 다른 부트캠프나 면접들 등 여러 가지를 병행하면 정말 너무나 힘든 것 같다. 특히 나는 여러 번 복습과 공부를 느리게 하는 편이라서 더욱 힘들었던 것 같다. 앞으로는 운영체제 네트워크등 CS에 많은 관심을 가지고 공부해 나가서 실력을 쌓아야겠다. 공부를 하면 할수록 내가 배워야 할 게 너무나 많다는 것을 느끼는 건 함정..


어떻게든 Java를 배워서 하청을 받는 SI회사라도 취업을 해야겠다고 마음을 먹었던 그때가 아직도 생각난다. (si업계를 무시하는 게 아닙니다) 실력은 없지만 24시간 나의 시간을 불태워서라도 프로그래머로 시작해야겠다는 마음이 컸기 때문이다. 

 

매번 유튜브를 볼 때마다, 혹은 광고를 볼때마다 비전공자이지만 네이버에 붙었다, 카카오에 붙었다 초봉 6000을 받는다 등등.. 코딩을 하다 보면 내 실력이 하찮게 보이는 순간들.. 그런 순간들을 너무나 많이 겪었고, 앞으로도 겪을지도 모르겠다. 하지만, 나는 조금씩 성장해 왔고, 잘하진 않지만 꽤 괜찮은 프로그래머가 되어가고 있다고 믿고 있다. 

 

이 글을 읽고 있는 당신은 성장에 목마른 사람일 것이다. 더 잘하고 싶고, 더 좋은 코드를 만들고 싶은 엔지니어가 되고 싶을 것이다. 

 

주저하지 말고 앞으로 나아가길 바라며, 무서운 바람이 몰아치더라도 "중요한 건 꺾이지 않는 마음"을 되뇌며 내일 하루도 헤쳐 나가길 빌어본다. 모든 사람들이 원하는 꿈을 이루기를 항상 기도하며 글을 마친다. 

 

https://truereview87.tistory.com/248

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기