객체 지향에 대한 생각과 학습 방식에 대한 학생의 피드백

2014-07-25 10:13

지난 번 리팩토링을 좋아하지 않는다는 후배에게 해주고 싶은 말은?(http://www.slipp.net/questions/287)) 글에 이어 오늘은 다른 친구의 글을 공유해 본다.

현재 자바 수업 3주차로 사다리타기를 구현하고 있다. 사다리타기를 각자 구현한 후 class로 분리하고 리팩토링해보라는 미션을 주었더니 이런 피드백을 남겼다.

유지보수 용이한 코드, 보기 좋은 코드, 수정사항이 생겨도 반영하기 쉬운 코드를 짜기 위해 객체지향을 하는게 아닐까 생각하고 있습니다. 그러기 위해서 네트워크 osi 7 layer처럼 한 계층이 변해도 다른 계층에 영향을 미치지 않고 접근제어를 통해 훼손을 줄이는 것과 유사한 원리를 OOP에서도 사용하는 것 같습니다. 이해한 바가 정확한지는 잘 모르겠지만. 아무튼 ...

저 스스로 납득이 되지 않아서 학습 방식을 바꿀 생각 입니다. 교수님께서 올린 동영상은 꾸준히 보면서 저런 방법이 있구나하고 넘기고. 그 방법이 필요한 상황에 부딪혔을 때 그 방법을 활용하는 식으로 하려고 합니다. 지금 사다리게임을 짜면서 class를 나누는 필요성을 못 느끼겠습니다. 이렇게 trivial한 문제를 복잡하게 풀 필요가 있나 생각되고요.. 만약 지금 그대로 따라간다면 주입식 교육과 같이 "이렇게 하라니까 이렇게 해야지"와 별반 다르지 않다고 생각됩니다. 자꾸 리팩토링을 하면서 궁시렁 대고 스트레스 받는 제 모습을 보고 내린 결정입니다.

객체 지향이 왜 필요한 것인지에 대해서는 명확하게 이해하고 있다. 단, 지금 진행하고 있는 사다리타기 수준 정도의 단순한 문제를 객체 지향으로 구현할 필요가 있는지에 대해 의문을 제기하고 있다. 이런 피드백 받으면 초반에 약간 당황스러울 때도 있지만 기특하다는 생각이 든다. 진정 필요성을 느끼지 못하는 상황에서 의무적으로 하는 것이 아니라 자신만의 방식으로 필요성을 느끼는 순간 학습해 나가는 모습 때문이다.

이 친구가 객체 지향의 필요성을 느낄 수 있는 도전적인 문제나 효과적인 접근 방법이 있을까? 좋은 문제와 방법이 있다면 공유해 주면 좋겠다. 일단 나의 접근법은 사다리타기 점진적으로 리팩토링해가면서 객체 지향적으로 개발해 가는 과정을 보여주려고 한다.

0개의 의견 from FB

7개의 의견 from SLiPP

2014-07-25 13:14

학생의 생각이 맞는것 같기도 하지만.. 나중에 실전에 잘 대응 하려면 연습을 해놔야 하지 않은가 생각이 드는군요. 충분히 훈련이 되어 있어야 나중에 필요한때 쓸수 있지 않을까요?

2014-07-25 13:27

안녕하세요. 예전에는 페북에서 댓글 다는게 되었는데 언젠가부터 댓글창이 안보이네요. 뭔가 달라서 그런 거 같긴 한데.. 저는 왜 그런지 잘 모르겠네요.

사다리에 저런 피드백이라.. '객체지향'이란 단어가 많이 나오는데 의도하신 건지는 모르겠습니다.

학생들 레벨이 어느 정도인지는 모르겠는데, 제 생각엔 처음부터 객체지향을 강조할 필요는 없다고 봅니다. 아니 오히려 일부러 언급하지 않는게 낫다고 생각되요. 베이스가 되는 여러 abstraction 기법들을 살펴보고 난 후에 패러다임들을 소개하는 정도면 적절하다고 생각됩니다.

정말 OO가 적합한 문제가 있지만, 그렇지 않은 것도 있습니다. 요즘 유행하는 FP도 마찬가지구요. 어떤데서 imperative는 나쁜 거처럼 이야기되는데 그것도 아닙니다.

거기는 날씨 더운데 방학도 없나 보네요. 학생분들도 형님도 학업에 수고가 많습니다. 저도 다시 학교 가고 싶네요. 다시 학생 되면 공부는 안하고 놀러 다니고 싶어요^^

2014-07-25 13:49

@정재훈 님의 의견에 적극 동의 합니다. 사다리의 예제가 적합하다... 이 예제로 풀어라 의 접근에서 괴리가 있었던 듯 해요. 코드부터 접근하는 객체지향이 아닌 컨셉으로 접근해서 코드로 풀어나가는 ( 설명은 이미 하셨겠지만...) 접근법이 좋지 않을까... 코드의 재사용이나 수정용이가 객체지향의 특징이 아닌... 현실을 모델링하고 구현하는데 객체지향이 가진 장점이 있다. 그리고 그러한 예제를 일부나마 보여주는 게 설명엔 적합할 것 같아요. 사다리는 그냥 code snipet 을 가지고 객체지향 랭귀지로 객체지향 클래스 설계 컨셉만 입혀보는 거지요. 당연히 로직으로 풀어나가려는 프로그래머의 마음에는 "왜? 이렇게 풀어야 하지?" 라고 생각할 수 있습니다. 저 역시도 처음에 배울때는 "왜 클래스를 계속 분리하고 난리야?" 라고 생각했으니...

객체지향은 컨셉부터의 top-down 방식의 접근이 좋다고 개인적으로 생각을 합니다.

2014-07-25 14:50

@짱가 지금 내가 진행하는 방식은 네가 제안한 방식과는 완전히 다르게 접근하고 있다. 일단 지금까지 익숙한 절차지향적인 방식으로 접근하고 이후 코드를 조금씩 개선하면서 클래스를 하나씩 찾아가는 방식으로 접근하고 있다. 네가 top down이 좋다고 이야기했는데 나는 완전한 bottom up으로 접근하고 있다.

즉, 객체 지향 컨셉에 대해서는 이야기한 부분이 없다. 소스 코드를 구현하면서 클래스를 찾아나가는 연습을 먼저하고 있다.

2014-07-25 14:55

@정재훈 여기가 3학기로 진행하다보니 여름 방학이 없다. 지금 2학기 진행 중이다. 요즘 어떻게 지내남? 페북 통해 가끔 소식 듣기는 하는데 잘 지내는지 궁금하네.

학생들의 지금 상태는 1학기에 C, C#을 통해 절차지향적인 프로그래밍을 해본 경험이 있는 상태이다. 2학기 수업에서 자바를 학습하면서 클래스를 찾고 객체지향적인 프로그래밍 연습과 프로그래밍 언어에 대한 지식을 습득하는 것이 목적이다.

지금 단계는 객체지향에 대한 컨셉은 공유하지 않고 있다. 일단 자신에게 익숙한 방식으로 문제를 풀어본 후 그 소스 코드의 문제점을 찾으면서 조금씩 개선해 나가는 과정을 진행하고 있다. 아직 클래스에 익숙하지 않은 상태이기 때문에 클래스를 찾고, 새로 생성한 클래스에 책임을 분할하는 연습을 하고 있다고 보면 된다. 아직 자바를 시작한지 오래 되지 않아서 복잡한 예제로 넘어가기 힘들다.

2014-07-27 23:22

@자바지기 더운 여름에 고생이 많으세요.

전 회사 잘 다니고 있습니다. 계속 scala랑 akka 이용하는 프로젝트 참여하구 있구요. 근데 솔직히 즐겁게 참여하고 있진 않습니다. 생각해보면 회사 다니면서 일이 즐겁다는게 어불성설인거 같아요.^^; 그래도, 일이니까 그렇게 하고 있습니다.

현재 학생들 진도를 말씀해주셨는데, 그렇다면 지금 하시는대로 진행하는게 맞아 보입니다. 결국 리팩토링을 하다 보면 리팩토링 그 자체보다 더 중요한 걸 알아갈 수 있겠지요. 예를 들면, small method나 testable한 코드, 중복 제거 같은 것들이요.

그런 면에서 리팩토링의 필요성을 이야기해보시는 것도 좋으리라 생각됩니다. 근데 이미 하고 계실 거 같네요.^^

더운 날씨에 건강 유의하시면서 잘 지내시구, 다음에 뵙겠습니다~^^

2014-07-28 08:28

여러 차례 추가 기능을 요구한다면 학생이 도전적으로 변하지 않을 가요?

제가 생각하기에는 좋은 방식이라고 생각합니다. 객체지향을 처음부터 자세히 설명하는 것보다 이런 방식이 더 좋은 것 같습니다. 사람의 사고방식이 절차지향적이지 객체지향적이지 않기 때문에 객체지향을 자세히 설명한다고 해서 바로 와 닿지는 않을 것 같습니다. 머리로는 이해해도 제대로 사용하지는 못하겠지요.

가랑비에 옷 젖듯이 천천히 객체지향을 물들여가는 것은 좋다고 생각합니다.

의견 추가하기