= Object-Oriented Design 세미나 = == 실전 객체지향 설계로 배우는 왜? == * '''“단일 변화로 인한 수정 사항을 예측 가능한 범위 내에 집중시켜라.”''' * 이것은 비단 객체지향에 한정된 이야기가 아니라 컴퓨터공학 발전의 역사를 이끌어온 가장 중대한 목표이자, 앞으로 여러분이 컴퓨터공학도로서 갖춰야할 모든 공학적 지혜들의 근본이라는 것을 잊지 마세요. - [변형진] === 후기 === * 오늘 긴 시간동안 모두 수고하셨습니다. 오늘 설명한 내용이 아직 깊이 와닿지 않더라도 좋습니다. 프로젝트 개발에 있어 그동안 흔히 전개했던 방식과는 다른 접근 방식의 가능성을 확인하는 것만으로도 좋은 경험이 되었길 바랍니다. 누누히 강조하지만 한 번에 이해하시길 바라서 진행하는 세미나가 아니라, 정말 중요한 하나의 제언만이라도 남는다면 그것을 앞으로 몇 번 듣고 또 듣고, 그리고 정말 그 개념이 필요한 순간이 됐을 때 큰 힘이 되리라 믿습니다. 예제는 좋은 예제거리에 대한 의견이 없어 SE 프로젝트 주제를 차용했는데, 설계만으로 문제가 깔끔하게 해결되는 과제가 아니라 알고리즘으로 해결해야할 부분이 꽤 있는 과제다보니, 실습이 설계부분에 집중하기 힘들었던 점은 다소 아쉽네요. 좋은 후기를 작성해주신 분 한 분을 선정해서 번역서 [http://book.naver.com/bookdb/book_detail.nhn?bid=2500990 Holub on Patterns]을 선물로 드립니다. 후기는 감상보다는 되새김이 되었으면 좋겠습니다. :) - [변형진] * 학교 환경도 안 받쳐주고, 제 머리도 안 받쳐줬어요. diff/merge 기능 설계를 바라보면서 객체지향 설계를 봤는데 어려우면서도 효율적인거 같더라구요. 그리고 형진이 형이 세뇌하신 내용 "단일변화가 생겨서 수정할 때 쉽게 수정하려면 구조가 중요하다" 이거 꼭 외울게요 - [윤종하] * 원래 정말 철저하게 절차지향적으로 프로그래밍 하던 사람이라... 오늘 내용이 좀 어려웠습니다;; 특히 그냥 들을때는 이해하면서 넘어가도, 실제 프로그래밍을 하려니까 막막하더라구요. 마지막 실습때 질문도 했었는데, 형은 if문 안에서 Comparer 객체를 선언해서, equals 함수를 사용하라고 하셨는데, 전 if문 안에서 객체를 생성할 생각조차 하지 못했었거든요. 그저 주어진 정보만 가지고, 반복문을 돌릴 생각뿐이었죠; 그런데 집으로 돌아오면서 생각해봤는데, 제가 짠대로 하면 '''“단일 변화로 인한 수정 사항을 예측 가능한 범위 내에 집중시켜라.”''' 라는 말과는 거리가 한 참 멀어지더라구요;; 예측은 가능한데 예측범위가 프로그램 소스 코드 전~부 라는거죠. 덕분에 "아, 정말 이런거 때문에 OOP를 하라는 거구나" 라는걸 알게 되었습니다 ㅋㅋ 오늘 했던 내용 중 정말 특히 기억에 남는건 '''"상속을 하기 위한 프로그래밍을 하지 말아라" & "패턴을 적용시키기 위한 프로그래밍을 하지 마라"''' 였습니다. 제가 뭘 배우기만 하면 꼭 써먹을려는 습관이 있는지라, 정말 문법같은걸 배우면 꼭 써먹으려고 하거든요. 그런데 이 말을 듣고, 문법의 남용을 자제해야겠다는 생각을 했습니다; 마치 영어 배울때 '''수동태 문장 많이 만들지 마라''' 라는 느낌이었어요 ㅋㅋ 정말 중간에 어려워서 LineDrawable 얘기할땐 잠깐 졸았지만 너무 유익한 세미나 였습니다~ - [박성현] * 일단 개인적으론 늦어서 앞부분을 못들은게 아쉽고, SE팀플과 관련된 수확이 있어서 여러모로 유용한 세미나였습니다ㅋ 일단 들으면서 간단히 적었던걸론 *'''추상화는 단일변화에 대해 수정해야 할 사항을 예측가능케 할려고 한다는점 -> 변경 가능성이 있는건 다 추상화하자?''' *'''패턴을 통해 커뮤니케이션이 좋아지는거지, 구현이 좋아지는건 아니다'''' *'''잘 설계하다보니 몇가지 패턴이 보이는 것이지, 패턴을 쓴다고 설계가 잘되는 것은 아니다''' 정도가 요지였던듯 합니다. 확실히 제 경험에 비추어보면 학부과정에서 OOP에 대한 개념을 배울때는 상속, 다형성 등을 배울때 과제는 상속을 이용한 무언가, 오버라이딩, 오버로딩을 하도록 요구했습니다. 심지어 의미없는 프렌드도 쓰도록했었죠ㅎ 물론 가르치는 교수님의 입장에선 직접 써보게하려면 그 방법이 가장 확실합니다. 그렇지만 그렇게 배우고나면 왠지 설계에 대한 별 생각없이 그렇게 하게되더군요. 저또한 미숙하지만 후배들에게 OOP를 왜 쓰고, 어떤 점이 좋은가를 알려주다보니 다시 한번 기본개념에 대해 생각하게되고 그러면서 제대로된 OOP는 뭔가 싶었습니다. (적어도 제 생각엔)'''단지 class쓰고 상속한다고 OOP가 아닙니다'''. OOP의 장점을 이용해야 진정한 OOP입니다. 이 글을 보는 분에게 하고싶은 말은 위의 요지와 함께 '''한 명제가 참이라고 그 명제의 역이 반드시 참은 아니라는점'''과 '''아 다르고 어 다르다'''라는 말도 함께 해주고 싶네요ㅎ 그리고 저 또한 오늘 실제 디자인에서 Drawable로 GUI를 로직에서 완전히 분리시킨 것을 보고 다시 한번 추상화에 대한 공부가 되었습니다. 앞으로 추상화하는 법을 좀 더 익혀야겠어요. - [김홍기] * 집에 가자마자 아버지가 저한테 객체 지향 설계를 왜 하는지 설명하라고 했습니다. 그런데..여러 번 반복해서 언급한 내용임에도 불구하고, "단일 변화로 인한 수정 사항을 가능한 범위 내에 집중시켜라"라는 말을 정확히 할 수 없었습니다ㅠㅠ 나중에 기존 내용을 고칠 때, 여러 군데에 퍼져있으면 고치기 힘드니까 쓰인 곳 안에서만 해결하는 것이 좋다고 풀어서 대답하긴 했지만, 정확한 표현은 아닌 듯 하네요. 아직 세뇌가 덜 됐..ㅎ;; get과 set을 사용하면 메인에서 그 자료형이 뭔지 알고 있는 거니까 변경시에 같이 변경해야 하므로 사용을 자제하는 건가요? 다른 클래스에서 private로 선언한 거를 메인에서 접근하기 위해 get과 set을 사용하는 거 같은데, 그럴거면 private로 왜 선언하는 건지 의문을 작년에 가졌...는데 여전히 모르는..;ㅅ; 우문(뭔가 질문하면서도 이상해서..;)현답을 기대합니다 ㅎ; - [강소현]