├── .DS_Store ├── .github └── workflows │ └── blank.yml ├── Booktalk ├── Object │ ├── FeelsDiscussion1.md │ ├── FeelsDiscussion2_chapter03.md │ ├── FeelsDiscussion_chapter04.md │ ├── YoonusDiscussion2.md │ └── YoonusReview.md └── TheEssenseOfObjectOrientation │ ├── hyein │ ├── chapter01.md │ ├── chapter02.md │ ├── chapter03.md │ ├── chapter04.md │ ├── chapter05.md │ ├── chapter06.md │ └── chapter07.md │ └── jongfeel │ ├── appendixA.md │ ├── chapter01.md │ ├── chapter02.md │ ├── chapter03.md │ ├── chapter04.md │ ├── chapter05.md │ ├── chapter06.md │ └── chapter07.md ├── LICENSE ├── README.md └── Stamp ├── Black Glazed Latte.jpg ├── BlackRiceLatte.jpg ├── Double Espresso Cream Latte.jpg ├── IceChouxCreamLatte.jpg ├── Iced Brown Sugar Oat Shaken Espresso.jpg ├── LavenderBlondeStarbucksDoubleShot.jpg ├── Mango Dragonfruit with Lemonade Starbucks Refreshers.jpg ├── MugwortCreamFrappuccinoWithColdBrew.jpg ├── README.md ├── Raspberry Pop Shaken Tea.jpg ├── Starbucks French Vanila Latte.jpg ├── Starbucks_New_Year_Citrus_Tea.jpg ├── Starbucks_Strawberry_Dream_Malcha_Latte.jpg ├── Starbucks_Vanilla_Cream_Cold_Brew.jpg ├── Starbucks_americano.JPG ├── Starbucks_americano_e-Gift_Item.jpg ├── Starbucks_cafelatte.png ├── Starbucks_cafemocha.png ├── Starbucks_giftitem_wants.JPG ├── Starbucks_iceamericano.png ├── Starbucks_icecafelatte.png ├── Starbucks_iceddolcelatte.png ├── Starbucks_tarro_latte.jpg ├── Starbucks_two_americano_two_cake.jpg ├── ToffeeNutLatte.png ├── approved.png ├── approved_1Q.png ├── approved_2021_2Q.png ├── approved_2021_3Q.png ├── starbucks_dessert_set.png └── starbucks_iced_caramel_macchiato.png /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/.DS_Store -------------------------------------------------------------------------------- /.github/workflows/blank.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: Markdown Linting Action CI 4 | 5 | # Controls when the action will run. 6 | on: 7 | # Triggers the workflow on push or pull request events but only for the main branch 8 | push: 9 | branches: [ main ] 10 | pull_request: 11 | branches: [ main, jongfeel/* ] 12 | 13 | # Allows you to run this workflow manually from the Actions tab 14 | workflow_dispatch: 15 | 16 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 17 | jobs: 18 | # This workflow contains a single job called "build" 19 | build: 20 | # The type of runner that the job will run on 21 | runs-on: ubuntu-latest 22 | 23 | # Steps represent a sequence of tasks that will be executed as part of the job 24 | steps: 25 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 26 | - uses: actions/checkout@v2 27 | 28 | - name: Markdown Linting Action 29 | # You may pin to the exact commit or the version. 30 | # uses: avto-dev/markdown-lint@04d43ee9191307b50935a753da3b775ab695eceb 31 | uses: avto-dev/markdown-lint@v1.5.0 32 | #with: 33 | # Custom rule files (file|directory|glob|package) 34 | #rules: # optional 35 | # Configuration file (JSON, JSONC, or YAML) 36 | #config: # optional 37 | # Fix basic errors 38 | #fix: # optional, default is false 39 | # Write issues to file 40 | #output: # optional 41 | # Files to ignore/exclude 42 | #ignore: # optional 43 | # Files (directories|globs) for a work or any additional arguments 44 | #args: 45 | -------------------------------------------------------------------------------- /Booktalk/Object/FeelsDiscussion1.md: -------------------------------------------------------------------------------- 1 | # Object discussions 2 | 3 | ## Prologue 4 | 5 | ### Discussion 1 - Robert W. Floyd 6 | 7 | - 프로그래밍 패러다임이라는 용어를 1974년에 Robert W. Floyd가 사용 8 | - 47년 전에 프로그래밍에도 패러다임이라는 용어를 쓴 분에게 존경을 표하고 싶음 9 | - 해당 내용에 대한 링크: https://dl.acm.org/doi/10.1145/359138.359140 10 | - [The Art of Programming](https://en.wikipedia.org/wiki/The_Art_of_Computer_Programming) 의 리뷰어 였다고 함 11 | - 사실 책 이름에 대해서는 많이 들어봤지만 절판되서 읽을 기회가 없었음. 훗날 절판된 책을 구하거나 한다면 퇴직이나 프로젝트 성 혹은 은퇴 후에나 한번 읽어보면 좋을 것 같다는 생각 12 | 13 | ### Discussion 2 - Both of two paradigm: procedure and object-oriendted 14 | 15 | - [토마스 쿤](https://en.wikipedia.org/wiki/Thomas_Kuhn)의 혁명적인(revolutionary) 패러다임이 프로그래밍 세계에서는 발전적(evolutionary)이라는 저자의 주장에 어느 정도 동의함 16 | - 왜냐하면 객체지향적인 프로그래밍에 절차지향적인 프로그래밍을 완전히 배제할 수 없기 때문 17 | - 그래서 패러다임 - paradigm 이라는 단어의 의미를 더 생각해 보게 됨 18 | - 패러다임이라는 단어가 어떻게 다가왔는지? 19 | 20 | #### Scientific revolution 21 | 22 | - 여태까지 위키피디아에서 영어 문서보다 뛰어난 한글 문서는 없었는데 토마스쿤의 경우는 한글 문서가 더 뛰어나다는 걸 발견함 23 | - [토마스 쿤](https://ko.wikipedia.org/wiki/%ED%86%A0%EB%A8%B8%EC%8A%A4_%EC%BF%A4)에서 정상과학과 혁명적 과학이라는 부분이 있는데, 오브젝트 책에서 설명하는 토마스 쿤의 패러다임에 대해 잘 설명하고 있는 부분이라는 게 느껴짐 24 | - IT 쪽이 아니라 사회과학 쪽이어서 왠지 우리나라 사람이 잘 적어둔 느낌? 25 | 26 | ### Discussion 3 - No silver bullet 27 | 28 | - 튜링상 수상에 빛나는 [프레데릭 브룩스](https://en.wikipedia.org/wiki/Fred_Brooks)의 1987년 논문 [은총알은 없다](https://en.wikipedia.org/wiki/No_Silver_Bullet)가 언급이 되었다 29 | - 이것이 암시하는 바는 객체지향 패러다임이 정답이고 이게 모든 문제를 해결해 줄 수 있는 것이 아니라는 것을 뜻함 30 | - 그렇다는 것은?? 저자인 조영호님의 경우 많은 실전 경험과 학문적인 견해를 통해 문제 해결에 정답이 없다는 진리를 깨우쳤을 가능성이 높을 것으로 판단됨, [맨 먼스 미신](https://en.wikipedia.org/wiki/The_Mythical_Man-Month)은 프레데릭 브룩스의 소프트웨어 공학 관련된 매우 유명한 책이고 이 책에 나온 내용을 언급했다는 것은 객체지향 뿐 아니라 소프트웨어 공학에 대해서도 수준 높은 지식을 갖추었을 것으로 생각할 수 있음 31 | - 여기서도 40~50년 전에 이미 훌륭하신 분들의 논문과 그 방향성에 대해 많은 것을 얘기해 주고 번역서도 나와 있음에도 불구하고 잘 모르고 있는 것이 문제라고 봄. 그렇다고 이런걸 알려줘도 코딩하는 것과 상관 없다고 생각하는 태도가 더 큰 문제일 듯 한데, 어떻게 생각하는지 얘기해 보면 좋겠네요 32 | 33 | ## Chapter 01 34 | 35 | ### Discussion 1 - theory and practice 36 | 37 | - [로버트 L, 글래스](https://en.wikipedia.org/wiki/Robert_L._Glass)옹을 언급했다, 안타깝게도 내가 아직 읽어보지 않은 책을 언급했지만 이론과 실무 어느것이 먼저인 것인가에 대한 화두는 꽤 좋은 듯 하다. 38 | - 글에서 저자가 주장하는 바는 추상적인 개념과 이론은 훌륭한 코드를 작성하는데 필요한 도구라고 한다. 39 | - 사실 소프트웨어는 공학의 레벨이고 컴퓨터 과학과는 거리가 좀 있다는 편을 들어 봤을 때는 충분히 맞는 말이다. 40 | - 하지만 나는 여기에 덧붙여 본다면 어느 수준 - 그러니까 능숙하게 코드를 작성할 수 있고 그 이상의 좋은 방법을 찾기 시작할 때 쯤 분명 공학적인 방식을 접근하고 이해해야 할 필요가 있으며, 그 때 이론과 더불어 40~50년 전 부터 시작해서 최근까지 잘 만들어 두고 이어져 온 공학 관련된 내용을 배워야할 필요가 있다고 본다. 41 | - 결국 훌륭한 코드를 작성하는 프로세스는 공학일 테니까, 비전공자도 반드시 알아야 할 것이라고 봅니다 => 문송이지만 공학을 해야 하는 자세 필요 42 | 43 | ### Discusstion 2 - Problems 44 | 45 | - 극장 티켓 판매의 간단한 예제를 통해 실제 클래스 코드를 동반해서 설명한다 46 | - 그 이후 문제점에 대해 언급하면서 생각할 부분을 얘기해 주는데 이 부분에 대해 잘 이해할 필요가 있다고 본다 47 | - 객체지향이 반드시 실세계를 완벽하게 모방해야할 필요는 없다고 보지만 상식적인 수준에서의 객체들의 행동에 대해 구현해야 함을 얘기한다. 48 | - 관람객과 판매원의 수동적인 존재, 객체를 지향함에 있어서 생각해 볼 만한 좋은 소재 49 | - 또 의존성(dependency) 문제로 class 변경이 다른 class의 의존성으로 인해 변경이 되어야 함을 언급: Audience와 TicketSeller를 변경할 경우 Theater도 함께 변경해야 함 50 | - dependency, coupling을 우리는 얼마나 이해하고 있는가? 51 | 52 | ### Discussion 3 - Improved design 53 | 54 | - 객체를 자율적인 존재로 변화: 자율적이라는 의미? 55 | - message response 56 | - interface 57 | - 객체 사이의 결합도를 낮추고 변경하기 쉬운 코드를 작성하기 위해 따라야 하는 가장 기본적인 설계 원칙 => 이 문장만 읽으면 당연한 얘기처럼 들리지만, 왜 우리의 코드는 이런 설계 원칙을 설명하지 못하는 코드를 작성하는가? 58 | 59 | ### Discussion 4 - nice? 60 | 61 | - 저자는 아래와 같이 언급한다 62 | 63 | > 우리는 객체의 자율성을 높이는 방향으로 설계를 개선했다. 그 결과, 이해하기 쉽고 유연한 설계를 얻을 수 있었다. 멋지지 않은가? 64 | 65 | - 저자가 이렇게 할 수 있다는게 멋지다고 생각하면 책을 잘못읽은 것 66 | - 저자는 당연히 잘 하는 사람이고 객체지향을 잘 아는 사람인데다 책을 써서 알려주는 것이므로 자신의 능력을 자랑? 하는 것으로 볼 수 있는데 그렇지 않다. 67 | - 자율성이 있는 객체로 설계했고, 이해하기 쉬웠고, 유연한 설계를 했다는 부분 객체지향적인 코드를 작성했다는 이 부분에 포인트가 있어야 함 68 | 69 | ### Discussion 5 - Object-Oriented Design 70 | 71 | - 객체지향 설계에 대한 언급 72 | - 아직도 설계? 라고 하면 코딩하는 거하고 상관 없는 혹은 어떤 경력이 많은 사람이 해야 하는 고차원적인 행위라고 생각하지만, 내 생각에는 설계를 못하는 프로그래머는 많은 일을 할 수 없다고 자신할 수 있다. 73 | - 변경을 수용할 수 있는 설계의 의미? 어느 정도까지 생각하고 설계해야 하는가에 대한 의문? => 객체지향의 중요한 의미를 살릴 수 있다면 객체지향적인 설계 74 | 75 | ## Chapter 02 76 | 77 | ### Discussion 1 - Requirements 78 | 79 | - 객체지향 프로그래밍을 언급하지만 요구사항에 대한 걸 처음 언급한다. 80 | - 요구사항이란 무엇일까? 요구사항이 뭔지도 모르고 프로그래밍을 한다면 아마 보여주기식 프로그래밍이 될 가능성이 높다. 81 | - 책에 4페이지에 걸쳐 설명이 되어 있는데, 실제 업무를 하는데 있어서 이해해야 할 중요한 요소라고 봄 82 | - 이것도 여러 프로젝트를 해 보면 결국 얼마나 말과 글을 이해하는 능력이 좋은지 상식적인 프로세스를 얼마나 잘 이해할 수 있는지로 귀결됨 83 | 84 | ### Discussion 2 - Trade off 85 | 86 | - 교과서적으로만 이해하고 코드를 좀 짜본 거라면 절대 트레이드 오프가 무엇을 의미하는 것인지 모를 것이라고 생각함 87 | - [객체지향 사고 프로세스](http://aladin.kr/p/HN7Um)라는 책에서도 동일하고 트레이드 오프에 대해 언급을 하고 있고, 상속과 인터페이스의 간극에 대해 유연하면서도 상황에 맞게 사용할 줄 아는 혜안을 가지는게 객체지향 설계의 묘미라고도 하였다. 88 | - 복잡한 비지니스 프로세스를 여러번 경험하고 나면 이 트레이드 오프가 의미가는 바를 더 잘 알게 될 것이라고 생각하며, 책에서 언급한 내용만으로는 이해할 수 없다고 본다. -------------------------------------------------------------------------------- /Booktalk/Object/FeelsDiscussion2_chapter03.md: -------------------------------------------------------------------------------- 1 | # Object Discussions 2 | 3 | ## Chapter 03 4 | 5 | ### Discussion 01 - Role, Responsibility, Collaboration 6 | 7 | 객체를 정말로 지향하기 위해 이해해야 할 중요한 키워드, 실제 이런 키워드들이 의미가 있다고 생각하는 객체들을 만들어서 코드를 작성해 본 적이 있는지 논의 필요 - 많은 시간이 걸릴 듯. 8 | 9 | ### Discussion 02 - Message, Method 10 | 11 | 메서드의 뜻은 어느 정도 이해가 가는데, 메시지의 실제 의미를 이해하기가 조금은 쉽지 않은 듯? 왜냐하면 메서드는 코드상에 내가 구현한 메서드라고 얘기할 수 있는데 메시지는? 메시지를 전달했다와 메서드를 호출했다의 차이는 뭘로 설명할 수 있을까에 대한 논의 필요. 12 | 13 | ### Discussion 03 - 객체의 자율성 => 캡슐화 14 | 15 | 다시 한번 remind, 객체의 자율성이란? 캡슐화는 왜 객체의 자율성을 보장하는 장치인가? screening과 movie 객체의 관계에 대한 설명 확인. 16 | 17 | ### Discussion 04 - 협력: 행동을 결정 18 | 19 | 협력과 행동의 관계 되짚어보기, 객체간에 협력이 필요한 이유는 알겠는데 그것이 행동으로 결정되는게 어떤 의미인지? 객체가 행동하려면? 20 | 21 | - 메시지가 객체를 결정한다 22 | - 행동이 상태를 결정한다 23 | 24 | 이 말의 의미 얘기해보기. 25 | 26 | ### Discussion 05 - 책임 27 | 28 | 객체의 본질, 솔직히 역할, 책임, 협력 중에 가장 이해가 쉬운 부분이 책임인 듯. 객체의 책임에 대해 다시 한번 얘기해보기. 협력을 위한 행동이 필요하고 행동이 상태를 변화 시키면, 그것이 객체의 책임을 다하는 것이라고 볼 수 있지 않을까? 29 | 30 | ### Discussion 06 - 역할 31 | 32 | 역할이 셋 중에 제일 이해하기 어려운 부분인 듯. 객체의 책임이 여러개일 수 있는데 여기에서 그 역할은 추상적이어야 함 => 하나의 역할로 책임을 통합 협력 역시 추상적이 되면서 유연해짐. 33 | 34 | 세속적인 얘기로 바꿔 보자면 하나의 인터페이스를 구현한 여러 클래스가 있고 그 객체가 여러개라면? 이렇게 놓고 본 후에 다시 역할이 의미하는 바 얘기해 보기. 35 | 36 | 또 자문자답 해보기: "이 객체가 무슨 역할을 수행해야 하는가?" 좋은 질문인 듯. 객체지향이 재미있어 지는 부분의 시작점이라고 봄. 오버라이딩?을 교과서적으로만 받아들이고 코드를 짤 때도 어거지로 짜고 있었다면 이제 역할이라는 것으로 다시 바꿔서 생각해 볼 필요가 있다고 봄. 37 | 38 | 역할의 추상화 역시 마찬가지 개념. 39 | 40 | 이제 코드 상에서 보여지는 abstract라는 키워드의 의미를 다시 한번 되새겨볼 필요가 있다. 여태까지 우리는 어떤 의미로 abstract라는 단어를 생각해 왔을까? 41 | 42 | ### Discussion 07 - Character and Actor 43 | 44 | 3장의 모든 내용을 다시 추상화하여 설명하는 것의 끝판왕. 이게 정말 이해가 잘 된다면 객체지향에서 역할이라는 개념을 정말 잘 이해할 수 있을 것 같다. 이걸 다시 객체지향에서 얘기하는 걸로 바꿔서 얘기해보면 좋은 논의 소재가 될 듯. 대체가 가능한 객체의 역할이라는 주제. 45 | 46 | interface나 abstract를 이런 식으로 표현했던 사람이 있다니... 존경심이라는게 여기서 나오는 듯 하다. Wirfs-Brock03 인용 문구를 보고. -------------------------------------------------------------------------------- /Booktalk/Object/FeelsDiscussion_chapter04.md: -------------------------------------------------------------------------------- 1 | # Object Discussions 2 | 3 | ## Chapter 04, 설계 품질과 트레이드오프 (Design quality and Trade off) 4 | 5 | ### Discussion 01 - Data oriented? 6 | 7 | 훌륭한 객체지향 설계는 데이터가 아니라 책임에 초점을 맞춰야 한다는 온전히 객체지향적인 설계 과정에서만 맞는 말일 수 있다. 8 | 객체지향적일 필요가 없는 문제가 그런 프로젝트에서는 데이터 중심과 그 처리 과정이 중요할 수 있다. 9 | 10 | 예) IoT 센서를 통해 받아온 날씨 데이터를 시각화 하는 문제를 해결하는데 객체지향까지 동원될 필요가 있을까? 하는 의문. 11 | 물론 객체지향을 적용할 수 있지만 도메인 모델이 너무 단순하기 때문에 이런 문제까지 객체지향을 적용하는게 맞을지는 의문이다. 12 | 13 | 다시 돌아와서, 영화 예매 시스템의 경우는 단순한 도메인 모델이 아니므로 충분히 객체지향적인 설계가 필요하며 지향해야 한다는 점에서는 매우 동의한다. 14 | 15 | 그럼에도 불구하고 저자는 데이터 중심의 설계가 객체지향적인 문제를 해결하고자 하는데 문제가 뭔지에 대해서 얘기하는 걸 보면 객체지향에 대한 매우 깊은 이해가 있다는 걸 역으로 짐작해 볼 수 있다. 이게 읽는 사람에 따라 어떻게 느껴지는지에 대해 의견을 나눌 필요 있음. 16 | 17 | ### Discussion 02 - Type dependency 18 | 19 | 예제에 movieType이 등장하는데 이걸 보고 느낀건 나도 종종 이런 식으로 데이터를 중심으로 type을 분류해 switch case문으로 구분해서 별도의 로직을 코드로 작성했던 적이 많다는 것이다. 20 | 21 | 그리고 책에 있는 내용을 보자마자, `아! 이걸 상속을 통한 overriding으로 했으면 깔끔했을텐데!`를 알아차리게 됐다. 22 | 23 | class 코드를 수십개를 만들어내면서 정작 type별 분류, 아니 enum으로라도 만들면 다행이다. int 변수로 0, 1, 2로 구분해서 if, if else, else 문으로 했던 적이 있던가? 그랬다면 그 흑역사에 대해 논의해볼 필요가 있어 보인다. 24 | 25 | ### Discussion 03 - All business logic in one method 26 | 27 | 아니나 다를까 `영화를 예매하자` 단락에 ReservationAgency라는 그럴싸한 class가 준비되어 있고 내가 예상했던 if, if else, else, switch case문의 향연이 단 하나의 메소드인 reserve에 준비되어 있다 으하하하! 28 | 29 | 혹시 자신이 짠 코드가 이랬던 적이 있었던가? 나는 솔직히 있다. 왜 이런 procedural code가 나오는지 역시 논의를 할 필요가 있다. 데이터 중심이라면 반드시 그 데이터를 처리해야 하는 함수 기반의 로직 처리가 길게 나오는게 필연적이기 때문이다. 30 | 31 | 이럴꺼면 그냥 함수로 만들지 ReservationAgency라는 클래스는 그냥 이름뿐인 클래스인듯하다. 만약 이런 클래스를 만들고 객체지향적으로 짰다고 하면 아직 객체지향을 많이 배워야 하지 않을까? 싶다. 32 | 33 | ### Discusion 04 - Again encapsulation 34 | 35 | 인터페이스의 중요성이 다시 한번 강조된다. 36 | 37 | > 변경될 가능성이 높은 부분을 **구현**이라고 부르고 상대적으로 안정적인 부분을 **인터페이스**라고 부른다는 사실을 기억하라. 38 | 39 | 너무나도 공감되는 말이다. 인터페이스가 가지는 어떤 역할을 정말 잘 생각해 보면 객체지향을 언급하는데 정말 빠질 수 없는 녀석이라고 확신할 수 있다. 40 | 41 | 나도 돌이켜 보면, 어떻게든 인터페이스를 적용하려고 의식적으로 코딩을 하다 보면, 결국 어떤 설계를 해야 하는지 그림을 그리게 되고 인터페이스를 통한 객체의 자율성의 보장은 다른 객체들과의 원활한 협력을 가능하게 하는 것 같다. 42 | 43 | 솔직히 잘 만든 인터페이스 하나가 어떤 파장을 불러 오는지 경험한게 있다면 얘기해 보면 좋을 것 같다. 이게 논의 포인트. 44 | 45 | ### Discussion 05 - cohesion, coupling and deisgn 46 | 47 | 응집도와 결합도에 대한 얘기는 사실 많이 들어본 얘기일 것이다. 그런데 실제 자신의 코드에 `이건 응집도가 낮아요`, `이건 결합도가 높아요` 이런 식으로 못 짠 코드에 대해 얘기하지 못한다. 48 | 49 | 또 `응집도와 결합도를 고려해서 코드를 짰다`라고 해서 보면 그게 얼마나 맞는 말인지 누가 판단해줄 근거도 없고 그냥 도시전설 같은 이야기인것만 같다. 50 | 51 | 하지만 보통은 응집도가 높게는 짤 수 있다고 믿는데, 결합도에 대해서는 쉽게 얘기하지 못하는 부분을 많이 발견한다. 왜일까? 그건 인터페이스에 대한 이해도가 현저히 부족해서 생기는 결과라고 본다. 52 | 53 | 이것도 결국 설계 문제로 귀결되는데, 저자의 뼈 있는 한 마디가 심금을 울리는 듯 하다. 54 | 55 | > 응집도와 결합도의 의미를 이해하기 위한 첫걸음은 두개념 모두 설계와 관련 있다는 사실을 이해하는 것이다. 56 | 57 | 역시 기승전설계? 인듯 한데, 다시 설계에 대해 생각해 보고 논의할 필요가 있다고 봄. 58 | 59 | ### Discussion 06 - SRP, Single Responsibility Principle 60 | 61 | 단일 책임의 원칙은 응집도가 높은 설계의 원칙임 62 | 63 | 아무것도 모르고 보면 그저 좋은 말 같다. 64 | 65 | 우리는 SOLID 중, S에 해당하는 단일 책임의 원칙을 잘 지키고 있었는지 논의해볼 필요가 있다. 66 | 67 | 그저 프로젝트 마감 때문에, 동작만 하면 되기 때문에, 시간이 없기 때문에라는 좋은 핑계거리를 두고 좋은 코드를 작성하기 위한 의무를 져버리지 않았는지 반성도 해봤으면 좋겠다. 68 | 69 | ### Discussion 07 - Review encapsulation 70 | 71 | Rectangle class의 예제는 너무 이상적이다. 구현에 집중하면 객체지향의 원칙이 캡슐화에 대한 원칙 역시 지킬 수 없을 것이다. 72 | 73 | enlarge라는 메소드를 생각할 수 있으려면, 정말 객체지향을 생각해야 하는데 구현에 집중한다면 아마 책의 예제처럼 AnyClass.anyMethod()와 같은 일이 계속해서 벌어질 것이다. 74 | 75 | class 코드를 작성했던 때를 떠올려 보고 책의 예제인 Reactangle과 같은 코드를 짜본 적이 있는지? 논의해 봤으면 좋겠다. 76 | 77 | ### Disscussion 08 - Problem of data driven design 78 | 79 | 데이터 중심 설계의 문제점에 대해 두 문장으로 요약이 되었다 80 | 81 | > 데이터 중심의 설계는 본질적으로 너무 이른 시기에 데이터에 관해 결정하도록 강요한다.\ 82 | 데이터 중심의 설계에서는 협력이라는 문맥을 고려하지 않고 객체를 고립시킨 채 오퍼레이션을 결정한다. 83 | 84 | 이게 어떤 의미인지 자세한 토론을 해봤으면 좋겠다. 이미 잘못된 설계의 예제와 문제점, 약간의 해결책이 진행 되었으므로 느낀점을 얘기해봐도 좋을 것 같다. 85 | 86 | 두번째 문장은 `어떤 객체도 섬이 아니다`라는 얘기와 일맥상통하는 말로 강하게 다가온다. 고립 == 섬. 와닿지 않을까? -------------------------------------------------------------------------------- /Booktalk/Object/YoonusDiscussion2.md: -------------------------------------------------------------------------------- 1 | # Object discussions 2 | 3 | 4 | 5 | ## 들어가며 6 | 7 | 8 | ### Discussion 1 - 프롤로그(PROLOG) 9 | 10 | 프롤로그(PROLOG) - 논리형 패러다임을 수용한 대표적인 언어 11 | 12 | 논리형 언어라는 단어가 갑자기 생소하게 느껴짐 - 수학적? 13 | 14 | 그리고 논리형 언어면 컴퓨터가 제일 좋아하는 거 아닐까 하지만 그걸로는 부족하니 객체지향적 언어가 나온거겠지 라는 생각도 들었다. 15 | 16 | 그리고 프롤로그라고 해서 책의 첫 인사 그 뜻인건가 싶었지만 그건 Prologue였다 ㅎㅎ; 17 | 18 | 19 | ### Discussion 2 - 프로그래밍 패러다임의 수용성 20 | 21 | 두 패러다임이 함께 존재할 수 있다. 22 | 23 | 프로그래밍 패러다임은 혁명적(revolutionary)이 아니라 발전적(evolutionary)이다. 24 | 25 | 무조건적으로 모든 상황에서 객체지향이 최고다가 아니라 필요할 때 쓰는게 중요하구나 싶은 생각이 든다. 26 | 27 | 그런데 필요한지 아닌지 판단기준은 어떻게 정하는 걸까 28 | 29 | 30 | 31 | ## 01 객체, 설계 32 | 33 | 34 | ### Discussion 3 - 이론이 먼저일까, 실무가 먼저일까? 35 | 36 | 로버트 L.글래스(Robert L. Glass) - 이론보다 실무가 먼저다. 37 | 38 | 분석이나 설계가 이론이라고 생각을 했었는데 그 이유가 바보같고 어이없지만 코딩을 제외한 문서작성은 이론적인거라고 생각했던거 같다. 39 | 40 | 하루라도 빨리 객체지향적 프로그래밍을 해보고 싶은 열망?갈망이 생겼다. 조급한 마음도 든다. 41 | 42 | 43 | ### Discussion 4 - 의존성의 밸런스는 어떻게 맞춰나가야 하지? 44 | 45 | 결합도는 낮춰야 하지만 그렇다고 객체사이에는 없어서는 안되는 의존성 역시나 밸런스조절이 진짜 힘들거 같다. 46 | 47 | 48 | ### Discussion 5 - 비록 현실에서는 수동적인 존재라고 하더라도 일단 객체지향의 세계에 들어오면 모든 것이 능동적이고 자율적인 존재로 바뀐다. -의인화 49 | 50 | 레베카 워프스브록님의 객체를 의인화한다는 표현에서 객체에 대한 애정이 느껴진다고 하면 내가 오버하는 것일까 51 | 52 | 객체가 생명과 지능을 가진 싱싱한 존재로 다시 태어난다니 나도 체감할 수 있는 날이 오겠지? 53 | 54 | 55 | 56 | ## 03 객체, 설계 57 | 58 | 59 | ### Discussion 6 - 어떤 객체도 섬이 아니다[켄트 벡] 60 | 61 | 객체 세계에는 왕따는 없겠다는 생각이 들어서 이상적으로 느껴진다. 62 | 63 | 64 | ### Discussion 7 - 객체가 메시지를 선택하는 것이 아니라 메시지가 객체를 선택한다[Metz12] 65 | 66 | 이상하다 객체는 자유롭다고 했는데 메시지를 선택할 수 없다라는건 무슨 의미지라는 생각이 들었다. 67 | 그러나 메시지가 객체를 선택해야 하는 이유를 보니 아무리 자유롭다고 해도 최소한의 규칙이 있는거 아닐까라는 생각이 들었다. 68 | 69 | 70 | ### Discussion 8 - 객체지향 패러다임에 갓 입문한 사람들이 가장 쉽게 빠지는 실수는 객체의 행동이 아니라 상태에 초점을 맞추는 것이다. 71 | 72 | 아직 객체지향 프로그래밍을 해본 경험은 없지만 나도 이러할 거 같다라는 생각이 든다. 73 | 그건 상태관리를 하는 리액트가 생각나서 그런거 같기도 하다. 74 | 75 | 76 | ### Discussion 9- 역할은 객체가 참여할 수 있는 일종의 슬롯이다. 77 | 78 | 개인적으로는 역할이 되게 매력적으로 느껴졌다. 객체가 자유롭다는걸 제대로 와닿게 하는 핵심중 하나라고 할까. 79 | 80 | 81 | ### Discussion 10 - 연극 안에서 배역을 연기하는 배우라는 은유는 협력 안에서 역할을 수행하는 객체라는 관점이 가진 입체적인 측면들을 훌륭하게 담아낸다. 이 부분을 읽고 막연했던 객체에 대해 조금은 이해하게 된거 같다. & 역할은 객체의 페르소나다. 82 | 83 | 이 부분을 보고 든 생각이 나라는 사람이 상대방의 기준에 따라서 롤이 바뀌는 게 객체가 배역을 연기하는 배우가 되는거와 맥락상 같은게 아닐까 라는 생각이 들었다. 84 | 85 | 가족들을 예시로 든다면 엄마의 관점에서는 딸일테고 동생들이 보기에는 언니나 누나가 될테고 역할에 맞는 액션을 취하게 되는게 객체와 비슷한게 아닌가라는 생각이 든다. 86 | 87 | 88 | ### Discussion 11 - 협력은 연극과 동일하고 코드는 극본과 동일하다. 89 | 90 | 왠지 낭만적이다 이렇게 비유할 수 있다니! 그러면 개발자는 시나리오 작가인것인가? 91 | 92 | 93 | 94 | ## 04 설계 품질과 트레이드 오프 95 | 96 | ### Discussion 12 97 | 98 | 이번 장에서는 데이터 중심의 설계로 코드를 작성하며 나쁜 설계의 예시를 보여준다. 99 | 그러고 언어는 다르지만 나또한 이런식으로 코드를 짜고 있었다는 생각에 뜨끔해진다. 100 | 101 | ### Discussion 13 - 좋은 설계란 오늘의 기능을 수행하면서 내일의 변경을 수용할 수 있는 설계다. 102 | 103 | 좋은 설계하면 지금 나에게 떠오르는건 멘토님이 예전에 냥터레스트 서버부분을 리팩토링해주신 코드다. 104 | 105 | 그당시 객체지향 코드란 이런거구나 라고 감탄은 하였지만 어려워서 감히 merge도 못했는데 지금 다시 보니 106 | 107 | 데이터 중심의 내코드가 이렇게 쪼개져서 협력을 하고 있구나 라는 생각이 먼저 들었다. 108 | 109 | 기존의 내코드는 하나가 변경되면 결합도가 높아서 전체코드를 수정했었는데 멘토님 코드라면 필요한 부분만 수정하면 110 | 111 | 다른 객체들의 코드를 수정할 일은 없으니 낮은 결합도를 가진거구나라는 생각이 들었다. 112 | 113 | 또 유지보수를 위한 코드를 만들어야 한다는게 이런 의미구나라는 생각도 들었다. 114 | 115 | 116 | ### Discussion 14 - "인터페이스에 대해 프로그래밍하라[GOF94]" 117 | 118 | 멘토님의 코드를 보면 구현되는 부분은 각각 나누어져 내부에 있으며 다른 객체들과 협력할때는 가지고온 const가 인터페이스역할을 하는거 같다 119 | 이게 내가 맞게 생각하는걸까? 120 | 121 | ### Discussion 15 - private으로 설정해도 접근자와 수정자를 통해 속성을 외부로 제공하고 있다면 위반하는 것이다? 122 | 123 | private안에 있으면 무조건 캡슐화가 되는거라고 생각했는데 그게 아니라는게 124 | 125 | 126 | 127 | ### Discussion 16 - 데이터 중심 설계는 객체를 고립시킨채 오퍼레이션을 정의하도록 만든다 128 | 129 | 내코드는 당연하게도 고립되어 있었겠다 싶어져서 갑자기 코드에게 미안(?)해진다. 앞으로는 객체지향적인 생각을 하도록 의도적으로라도 노력을 해야겠다는 생각이 든다. 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | -------------------------------------------------------------------------------- /Booktalk/Object/YoonusReview.md: -------------------------------------------------------------------------------- 1 | # 오브젝트 - 코드로 이해하는 객체지향 설계 2 | 3 | 4 | ## 이 책을 읽게 된 계기 5 | 6 | - 이책의 존재에 대하여는 youtube 코딩의 신 아샬님의 채널([https://www.youtube.com/watch?v=PX_Ot_irSG8](https://www.youtube.com/watch?v=PX_Ot_irSG8))을 통하여 작년부터 알고 있었는데 당시에는 뽐뿌가 오지 않아서 기억만 해두었다가 저자 조영호님의 객체지향의 사실과 오해를 멘토님의 추천을 통하여 읽고 나서야 오브젝트도 조영호님이 쓰신 책이라는 사실을 알게 되어서 바로 구입을 하여 읽기 시작하게 되었습니다. 7 | 8 | 9 | 10 | ## 과거 객체지향에 대한 생각 11 | 12 | - 9년전에 자바&오라클을 3개월정도 배운적이 있었습니다. 13 | 14 | - 당시에 오라클 강사님이 객체지향은 붕어와 붕어빵틀의 관계같은거라고 설명해주셨었고 이후 객체지향이라는 단어를 듣거나 보면 붕어빵과 붕어빵틀을 자연스레 떠올리게 되었습니다. 15 | 16 | - 하지만 멘토님의 멘토링과 객체지향의 사실과 오해라는 책을 읽고 객체지향이란 무엇인지 궁금하고 고민하게 되었습니다. 17 | 18 | 19 | 20 | ## 02 객체지향 프로그래밍 21 | 22 | - 저자는 이번 장의 목표는 이 책을 읽으면서 이해하게 될 다양한 주제들을 가볍게 살펴보는 것(얉은 수준이라도)이다라고 얘기합니다. 23 | 24 | - 이 책을 읽기 위해 필요한 가장 중요한 준비물은 가벼운 마음가짐이라는데 과연 어떨까요 25 | 26 | 29 | 30 | 31 | 32 | ### 02 객체지향 프로그래밍을 향해 33 | 34 | #### 협력, 객체, 클래스 35 | 36 | 객체지향의 본질은 클래스가 아닌 객체에 초점을 맞춰야 하며 이를 위해서는 프로그래밍을 하는 동안 집중해야 할 두가지가 있습니다. 37 | 38 | 1. 어떤 클래스가 필요한지를 고민하기 전에 어떤 객체들이 필요한지 고민하라. 39 | 2. 객체를 독립적인 존재가 아니라 기능을 구현하기 위해 협력하는 공동체의 일원으로 봐야한다. 40 | 41 | 42 | #### 도메인의 구조를 따르는 프로그램 구조 43 | 44 | - 사용자가 원하는 어떤 문제를 해결하기 위해 사용자가 프로그램을 사용하는 분야를 **도메인**이라고 부른다고 합니다. 45 | 46 | - 제가 웹세계로 알고 있는 도메인이라는 용어는 ip주소를 식별하게 만든 인터넷 주소인데 제가 알고있는 도메인의 범위는 도메인 용어의 극히 일부겠구나라는 생각이 들었습니다. 47 | 48 | - 요구사항과 프로그램을 객체라는 동일한 관점에 바라 본다라는게 머리로는 조금 이해하겠지만 솔직히 직접 와닿지는 않는데 객체지향 프로그래밍의 경험이 없어서 그런거 같습니다. 😅 49 | 50 | #### 클래스 구현하기 51 | 52 | - Screening 클래스는 사용자들이 예매하는 대상인 상영을 구현하고 53 | - Screening은 상영할 영화(movie), 순번(sequence), 상영 시작 시간(whenScreened)을 인스턴스 변수로 포함합니다. 54 | - Screening은 상영 시작 시간을 반환하는 getStartTime 메서드, 순번의 일치 여부를 검사하는 isSequence 메서드, 기본요금을 반환하는 getMovieFee 메서드를 포함합니다. 55 | 56 | 구현된 코드 57 | 58 | ```java 59 | Public class Screening { 60 | private Movie movie; 61 | private int sequence; 62 | private LocalDateTime whenScreened; 63 | 64 | public Screening(Movie movie, int sequence, LocalDateTime whenScreened) { 65 | this.movie = movie; 66 | this.sequence = sequence; 67 | this.whenScreened = whenScreened; 68 | 69 | } 70 | 71 | public LocalDateTime getStartTime () { 72 | return whenScreened; 73 | } 74 | 75 | public boolean isSequence (int sequence) { 76 | return this.sequence == sequence; 77 | } 78 | 79 | public Money getMovieFee () { 80 | return movie.getFee(); 81 | } 82 | } 83 | ``` 84 | 85 | - 인스턴스 변수는 private로 메서드는 public으로 지정한 거처럼 내부와 외부를 구분하여 접근성을 제어하는 이유는 경계의 명확성이 객체의 자율성을 보장하기 때문이라고 합니다. 그리고 더 중요한 이유로 프로그래머에게 구현의 자유를 제공하기 때문이라고 합니다. 86 | 87 | **자율적인 객체** 88 | 89 | 1. 객체는 상태(state)와 행동(behavior)을 함께 가지는 복합적인 존재 90 | 2. 객체가 스스로 판단하고 행동하는 자율적인 존재 91 | 92 | - 객체 지향은 객체라는 단위 안에 데이터와 기능을 한 덩어리로 묶음으로써 문제영역의 아이디어를 적절하게 표현할 수 있게 했는데 이처럼 데이터와 기능을 객체 내부로 함께 묶는 것을 **캡슐화**라고 부릅니다. 93 | 94 | - 외부에서의 접근을 통제할 수 있는 접근 제어(access control) 메커니즘도 함께 제공하는데 public, protected, private과 같은 접근 수정자(access modifier)를 제공합니다. 95 | 96 | - 캡슐화와 접근 제어는 객체를 두부분으로 나누는데 하나는 접근 가능한 부분으로 퍼블릭 인터페이스(public interface)라고 부릅니다. 97 | 98 | - 다른 하나는 외부에서는 접근 가능하고 오직 내부에서만 접근 가능한 부분으로 이를 구현(implementation)이라고 부릅니다. 인터페이스와 구현의 분리(separation of interface and implementation) 원칙은 훌륭한 객체지향 프로그래밍을 만들기 위해 따라야 하는 핵심 원칙입니다. 99 | 100 | 101 | **프로그래머의 자유** 102 | 103 | - > 프로그래머의 역할을 클래스 작성자(class creator)와 클라이언트 프로그래머(client programmer)로 구분하는 것이 유용합니다. [Eckel06] 104 | 105 | 106 | - 이 내용은 2006년도에 쓴 Thinking in Java에서 나오는 인용구이며 저자는 브루스 에켈이라는 분입니다. 107 | 108 | 109 | ![화면 캡처 2021-02-11 182413](https://user-images.githubusercontent.com/2981954/107627040-09cf1480-6ca2-11eb-84ca-81dce4586eff.jpg) 110 | 111 | - 그런데 클래스 작성자는 구체적으로 어떤 포지션을 말하는 건지 잘 모르겠습니다. 112 | 113 | - 클래스 작성자는 클라이언트 프로그래머가 숨겨 놓은 부분에 마음대로 접근할 수 없도록 방지함으로써 클라이언트 프로그래머에 대한 영향을 걱정하지 않고도 내부 구현을 마음대로 변경할 수 있는걸 **구현은닉**이라고 부릅니다. 114 | 115 | #### 협력하는 객체들의 공동체 116 | 117 | - 시스템의 어떤 기능을 구현하기 위해 객체들 사이에 이뤄지는 상호작용을 **협력**이라고 부릅니다. 118 | 119 | #### 협력에 관한 짧은 이야기 120 | 121 | - 수신된 메시지를 처리하기 위한 자신만의 방법을 **메서드(method)**라고 부릅니다. 122 | 123 | - 메서드와 메서드를 명확하게 구분한 것 -> 객체지향 패러다임이 유연하고, 확장 가능하며, 재사용 가능한 설계 124 | 125 | 126 | 127 | ### 03 할인 요금 구하기 128 | 129 | 130 | 131 | #### 할인 정책과 할인 조건 132 | 133 | **TEMPLATE METHOD 패턴(GOF94)** 134 | 135 | - 부모클래스에 기본적인 알고리즘의 흐름을 구현하고 중간에 필요한 처리를 자식 클래스에게 위임하는 디자인 패턴 136 | 137 | **오버라이딩과 오버로딩** 138 | 139 | > 많은 사람들이 오버라이딩(overriding)과 오버로딩(overloading)의 개념을 혼동한다. 오버라이딩은 부모 클래스에 정의된 같은 이름, 같은 파라미터 목록을 가진 메서스를 자식 클래스에서 재정의하는 경우를 가리킨다. 140 | 141 | > 자식 클래스의 메서드는 오버라이딩한 부모 클래스의 메서드를 가리기 때문에 외부에서는 부모클래스의 메서드가 보이지 않는다. 142 | 오버로딩은 메서드의 이름은 같지만 제공되는 파라미터의 목록이 다르다. 오버로딩한 메서드는 원래의 메서드를 가리지 않기 때문에 이 메서드들은 사이좋게 공존한다. 143 | 다음은 오버로딩의 예를 나타낸 것이다. Money 클래스에 구현된 두개의 plus 메서드는 이름은 같지만 하나는 Money타입의 파라미터를, 다른 하나는 log 타입의 파라미터를 받도록 정의돼 있다. 144 | 145 | > 이경우 두 메서드는 공존하며 외부에서는 두개의 메서드 모두 호출할 수 있다. 146 | 따라서 이 경우에는 오버라이딩이라고 부르지 않고 오버로딩이라고 부른다. 147 | 148 | ```java 149 | Public class Money { 150 | public Money plus ( Money amount ) { 151 | return new Money(this.amount.add(amount.amount)); 152 | } 153 | 154 | public Money plus ( long amount ) { 155 | return new Money(this.amount.add(BigDecimal.valuOf(amount))); 156 | } 157 | } 158 | 159 | ``` 160 | 161 | 162 | 163 | 164 | 165 | ### 04 상속과 다형성 166 | 167 | #### 컴파일 시간 의존성과 실행 시간 의존성 168 | 169 | - > *코드의 의존성과 실행 시점의 의존성이 다르면 다를수록 코드를 이해하기 어려워진다는 것이다. 코드를 이해하기 위해서는 코드뿐만 아니라 객체를 생성하고 연결하는 부분을 찾아야 하기 때문이다. 반면 코드의 의존성과 실행 시점의 의존성이 다르면 다를수록 코드는 더 유연해지고 확장 가능해진다. 170 | 이와 같은 의존성의 양면성은 설계가 트레이드오프의 산물이라는 사실을 잘 보여준다.* 171 | 172 | - > *설계가 유연해질수록 코드를 이해하고 디버깅하기는 점점 더 어려워진다는 사실을 기억하라. 반면 유연성을 억제하면 코드를 이해하고 디버깅하기는 쉬워지지만 재사용성과 확장 가능성은 낮아진다는 사실도 기억하라. 여러분이 훌륭한 객체지향 설계자로성장하기 위해서는 항상 유연성과 가독성 사이에서 고민해야 한다. 무조건 유연한 설계도, 무조건 읽기 쉬운 코드도 정답이 아니다. 이것이 객체지향 설계가 어려우면서도 매력적인 이유다.* 173 | 174 | - 이와 같은 딜레마를 알기 위해서는 설계를 많이 해봐야한다는 멘토님의 말씀 175 | 176 | 177 | #### 차이에 의한 프로그래밍 178 | 179 | - 부모 클래스와 다른 부분만을 추가해서 새로운 클래스를 쉽고 빠르게 만드는 방법입니다. 180 | 181 | 182 | #### 상속과 인터페이스 183 | 184 | - 자식 클래스가 부모클래스를 대신하는 것을 업캐스팅이라고 부릅니다.(upcasting) 185 | 186 | SOLID (객체 지향 설계)원칙중 L에 해당하는 -리스코프 치환 원칙 (ft. 멘토님) 187 | 188 | 리스코프가 사람이름이었던것도 멘토님이 얘기해주셔서 알았고 궁금해서 검색했더니 189 | 190 | ![화면 캡처 2021-02-12 123019](https://user-images.githubusercontent.com/2981954/107727270-3fb9da80-6d2e-11eb-887a-6263287f3d8c.jpg) 191 | 192 | ![화면 캡처 2021-02-12 123104](https://user-images.githubusercontent.com/2981954/107727272-40527100-6d2e-11eb-93fa-73dbca99f92d.jpg) 193 | 194 | 이 분이십니다. 195 | 196 | #### 다형성 197 | 198 | - 다시 한번 강조하지만 메시지와 메서드는 다른 개념입니다. 199 | 200 | - 실제로 어떤 메서드가 실행될 것인지는 메세지를 수신하는 객체의 클래스가 무엇이냐에 따라 달라지는데 이를 **다형성**이라고 부릅니다. 201 | 202 | - 다형성은 컴파일 시간 의존성과 실행 시간 의존성을 다르게 만들 수 있는 객체지향의 특성을 이용해 서로 다른 메서드를 실행할 수 있게 합니다. 203 | 204 | - 다형성을 구현하는 방법으로는 지연 바인딩(lazy binding)(또는 동적 바인딩(dynamic binding))이 있고 이는 메시지와 메서드를 실행 시점에 바인딩하는 것입니다. 205 | 206 | - 객체지향이 컴파일 시점의 의존성과 실행 시점의 의존성을 분리하고, 하나의 메시지를 선택적으로 서로 다른 메서드에 연결할 수 있는 이유가 바로 지연 바인딩이라는 메커니즘을 사용하기 때문입니다. 207 | 208 | **구현 상속과 인터페이스 상속** 209 | 210 | - >상속을 구현 상속(implememtation inheritance)과 인터페이스 상속(interface inheritance)으로 분류할 수 있다. 흔히 구현 상속을 서브클래싱(subclassing)이라고 부르고 인터페이스 상속을 서브타이핑(subtyping)이라고 부른다. 순수하게 코드를 재사용하기 위한 목적으로 상속을 사용하는 것을 구현 상속이라고 부른다. 211 | 212 | - >다형적인 협력을 위해 부모 클래스와 자식 클래스가 인터페이스를 공유할 수 있도록 상속을 이용하는 것을 인터페이스 상속이라고 부른다. 213 | 214 | - >상속은 구현 상속이 아니라 인터페이스 상속을 위해 사용해야 한다. 대부분의 사람들은 코드 재사용을 상속의 주된 목적이라고 생각하지만 이것은 오해다. 인터페이스를 재사용할 목적이 아니라 구현을 재사용할 목적으로 상속을 사용하면 변경에 취약한 코드를 낳게 될 확률이 높다. 215 | 216 | #### 인터페이스와 다형성 217 | 218 | - 구현은 공유할 필요가 없고 순수하게 인터페이스만 공유하고 싶을때 있습니다. 219 | - 이를 위해 C#과 자바에서는 인터페이스라는 프로그래밍 요소를 제공합니다. 220 | 221 | 222 | 223 | ### 05 추상화와 유연성 224 | 225 | #### 추상화의 힘 226 | 227 | 1. 추상화를 사용하면 세부적인 내용을 무시한 채 상위 정책을 쉽고 간단하게 표현할 수 있습니다. 228 | 229 | - 추상화를 이용해 상위 정책을 기술한다는 것은 기본적인 애플리케이션의 협력 흐름을 기술한다는 것을 의미합니다. 230 | 231 | - 재사용 가능한 설계의 기본을 이루를 디자인 패턴(design pattern)이나 프레임워크(framework) 모두 추상화를 이용해 상위 정책을 정의하는 객체지향의 메커니즘을 활용하고 있기 때문입니다. 232 | 233 | 2. 설계를 유연하게 만들 수 있습니다. 234 | 235 | 238 | 239 | #### 추상 클래스와 인터페이스 트레이드오프 240 | 241 | - 구현과 관련된 모든 것들이 트레이드오프의 대상이 될 수 있습니다. 242 | 243 | - 여러분이 작성하는 모든 코드에는 합당한 이유가 있어야 합니다. 244 | 245 | - 비록 아주 사소한 결정이더라도 트레이드오프를 통해 얻어진 결론과 그렇지 않은 결론 사이의 차이는 큽니다. 고민하고 트레이드오프해야 합니다. 246 | 247 | 249 | 250 | #### 상속 251 | 252 | - 상속은 객체지향에서 코드를 재사용하기 위해 널리 사용하는 기법입니다. 253 | 254 | - 하지만 두가지 관점에서 설계에 안좋은 영향을 미칩니다. 상속이 캡슐을 위반화한다는 것이고, 다른 하나는 설계를 유연하지 못하게 만든다는 것입니다. 255 | 256 | #### 합성 257 | 258 | - 인터페이스에 정의된 메시지를 통해서만 코드를 재사용하는 방법을 **합성**이라고 부릅니다. 259 | 260 | - 합성은 상속이 가지는 두가지 문제점을 모두 해결합니다. 261 | 262 | - 인터페이스에 정의된 메시지를 통해서만 재사용이 가능하기 때문에 구현을 효과적으로 캡슐화할 수 있습니다. 263 | 264 | - 또한 의존하는 인스턴스를 교체하는 것이 비교적 쉽기 때문에 설계를 유연하게 만듭니다. 265 | 266 | - 따라서 코드 재사용을 위해서는 상속보다는 합성을 선호하는 것이 더 좋은 방법입니다. 267 | 268 | 269 | ## 느낀점 270 | 271 | - 객체지향 프로그래밍을 직접 해보고 싶은 생각이 들었습니다. 272 | 273 | - 직접 설계와 구현을 하면 지금보다는 좀 더 와닿을거 같습니다. 😂 274 | 275 | 276 | 277 | 278 | 279 | 280 | 281 | 282 | 283 | 284 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter01.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 01 3 | ### Discussions 01 - 객체지향은 실제 세계의 모방이다? 4 | 5 | - 객체지향을 실제 세계의 모방이라고 하지만 잘못된 것 6 | - 실제 세계를 모방한 객체를 현실에서 찾기 어렵다 or 거의 없다 7 | - 그러나 실제 세계에 대한 비유가 객체지향의 다양한 측면을 이해하고 학습하는 데 효과적 8 | - 객체지향 설계의 핵심 사상인 '연결완전성'을 설명하는데 적합한 틀을 제공 9 | 10 | #### review 11 | 자세한 기억은 없지만 어디에선가 나도 `객체지향은 실제 세계를 컴퓨터 언어로 만든 것`이라는 말을 들은 적 혹은 본 적이 있다. 그리고 `객체지향 = 실제 세계의 디지털화` 라는 `고정관념`이 생겨버림 12 | 하지만 `현실 세계의 자동차 = 객체지향 세계의 자동차` 라고 생각하려니 이해할 수 없는 부분이 많아 왜?라는 의문이 끊임없이 생김. 같을 수 없는데 같다고 생각하니 계속 의문이 든 것 같다. 13 | 하지만 객체지향을 왜 실제 세계의 모방이라고 하는지, 그 것이 잘못된 부분이고 왜 잘못되었는지에 대한 내용을 읽고 나서는 객체지향을 실제 세계와 연결 시키는 이유는 객체지향 세계를 모두가 이해할 수 있도록 필요한 어떤 개념적인 것이라고 생각이 든다. 14 | 15 | ### Discussions 02 - 협력하는 사람들과 협력하는 객체 16 | - 사람들과 객체는 도움이 필요하다면 다른 사람,객체에게 연쇄적으로 요청한다. 17 | - 요청을 받은 사람과 객체는 해당 요청에 책임을 다하여 필요한 지식과 서비스를 응답한다. 18 | - 요청고 응답을 통해 복잡한 문제를 해결할 수 있는 공동체를 형성한다. 19 | 20 | #### review 21 | `객체가 협력한다`,`[공동체를 형성한다`는 약간 충격적이었다. 22 | 단 한 번도 객체가 협력하고 공동체를 형성한다는 생각을 한적이 없기 때문 23 | 객체는 정적인 코드 뭉텅이 그 이상,이하도 아니었는데 객체의 책임, 역할, 협력이라는 단어는 24 | 객체가 살아다는 생각이 들게함. 25 | 회사에서 구성원들이 본인의 position에서 업무를 주도적으로 진행하고 완료하여 상호작용을 하며 회사 서비스를 운영해나가는 모습이 애플리케이션을 실행시키는 객체들의 모습과 비슷해 보였다. 26 | 그리고 뜬금없지만 이 부분을 읽었을 때 스타크래프ß트가 생각났음 27 | ### Discussions 03 - 역할, 책임, 협력 28 | - 객체들은 기능을 구현하기 위해 역할과 책임을 수행하며 협력한다. 29 | - 협력의 핵심은 특정한 책임을 수행하는 역할들 간의 연쇄적인 요청과 응답을 통해 목표를 달성한다는 것 30 | - [어떤 객체도 섬이 아니다 -워드 커닝험, 켄트 백-] 31 | - 객체지향의 설계는 적절한 객체에게 적절한 책임을 할당하는 것에서 시작하고, 책임은 객체지향 설계의 품질을 결정하는 가장 중요한 요소이다. 32 | #### review 33 | 이 부분을 읽으며 `코드 먼저 치지 말고 문서를 작성하라`라는 멘토님이 항상 강조하는 말이 생각남 34 | 코드를 먼저 친다는 것은 객체에 대한 역할,책임을 생각 하지 않았다는 것 -> 따라서 설계 품질이 낮고 미래에는 결국 불분명한 애플리케이션이 됨 35 | (생각없이 코드부터 먼저 친다는 것은 굉장히 무서운 일을 하는 것이군........) 36 | ### Discussions 04 - 협력 속에 사는 객체 37 | - 객체는 `상태`와 `행동`을 갖는다. 38 | - 객체의 자율성이란 자신의 상태를 직접 관리하고 상태를 기반으로 스스로 판단한고 행동할 수 있음을 의미하며 이 것은 다른 객체가 무엇을 수행하는지 알 수 있지만 어떻게 수행하는지는 해당 객체 스스로만 알 수 있다는 뜻. 39 | - 객체가 수신된 메시지를 처리하는 방법을 메서드라 하고 메시지와 메서드의 분리는 객체간의 자율성을 증진시킨다. 40 | #### review 41 | 객체의 상태와 행동은 객체가 객체일수 있도록 해주고, 다른 객체와 협력할 수 있도록 해주는 뼈대라고 느낌 42 | 상태와 행동을 이제서야 중요한 부분이었구나라고 생각한것을 반성했다. 43 | 응답에 대해 '어떻게'가 붙으면 자율적이지 못하다라는 것은 이해가 되지만 44 | `어떤 메시지에 대해 객체는 스스로 판단하여 응답하는 것이 객체의 자율성이다`라는 부분이 잘 이해되지 않는다. 45 | 어떤 메시지에 대해 응답할 수 있도록 정해진 방법이 있을텐데 왜 자율적이라는 건지? 46 | 나는 `자율성 -> 랜덤` 이라고 생각하는 것 같음 47 | `자율성`이라는 단어의 개념때문에 이 부분의 이해가 어려운 것 같다고 느낌 48 | 49 | 50 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter02.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 02 이상한 나라의 객체 3 | ### Discussions 01 - 객체지향과 인지 능력 4 | - 인간은 선천적으로 인지능력을 이용해 세상에 존재하는 다양한 객체를 식별하고 분류함으로써 세상을 이해한다. 5 | - 인간의 기본적인 인지 능력에 기반을 두고 있기 때문에 객체지향이 직관적이고 이해하기 쉬운 패러다임이라고 말한다. 6 | - 인간은 개념, 추상적인 사물까지도 객체로 인식할 수 있다. 7 | - 세상을 더 작은 객체로 분해하는 것은 본질적으로 세상이 포함하고 있는 복잡성을 극복하기 위함 8 | 9 | #### review 10 | 사람은 태어날 때부터 객체지향적 사고를 갖고 있지만 너무 당연하고 자연스러워서 모르는 것 같다. 11 | 내가 나무를 나무로, 자동차를 자동차로, 시계를 시계로 인식하는 눈을 가져와서 그대로 객체지향의 세계에서 본다면? 12 | 그것이 객체지향적 사고이지 않을까라는 생각이 들었다. 객체지향 프로그래밍은 정말 어렵지만 또 생각하다 보면 단순해 보이기도 하는 것 같다. 13 | 책의 이 내용은 세 번째 읽는 것인데 처음엔 단순히 내용에 나오는 실험 이야기가 흥미롭군!이라고 생각하며 넘어간 기억이 난다. 그런데 책을 완전히 읽고 나서 세 번째로 보게 되니 처음과 다른 생각을 하게 되어서 놀랐다. 책을 보며 이렇게 놓친 부분이 많을 텐데 review를 진행하며 이런 부분을 집중해서 잘 찾아내야겠다 생각했다. booktalk의 좋은 순기능 중 하나인 것 같다. 14 | 15 | ### Discussions 02 - 객체 그리고 이상한 나라 16 | - 이상한 나라의 앨리스의 이야기를 통해 객체의 상태, 행동, 식별자, 캡슐화 등을 설명한다. 17 | - 객체의 행동은 상태를 변경시킨다. 이 것은 행동이 부수 효과(side effect)를 초래한다는 것을 의미한다. 부수 효과의 개념을 이용하면 객체의 행동을 상태 변경의 관점에서 쉽게 기술할 수 있다. 18 | - 어떤 객체도 섬이 아니다. 19 | - 현실세계의 음료수는 스스로 양을 줄일 수 없다 -> 하지만 객체지향의 세계에서 음료수는 스스로 양을 줄이는 자율적인 존재 20 | 21 | #### review 22 | 앨리스를 사용한 객체의 설명은 재밌어서 인상 깊었다. 이 부분을 읽고 정말 재밌었는지 한동안 눈에 보이는 것들을 객체로 바꾸는 상상을 했다. 일을 하다가 ui도 객체지향이 되지 않을까?!하고 생각해 봄 23 | 그렇다면 ui는 어떻게 객체지향을 하나 생각이 들어서 찾아본 결과 object oriented UI라는 것도 찾아보게 됨, object oriented UI는 서비스가 제공해야 할 기능에 필요한 객체들을 정의하고, 그 객체들이 서비스에서 어떤 행동을 해야 하는지 정의한 후 인터렉션과 레이아웃 등을 정의함 이런 부분에서 비슷하다고 생각했다. 24 | 25 | 어떤 객체도 섬이 아니라는 말을 계속 보는 것 같은데, 저자는 객체의 역할, 책임, 협력, 공동체를 정말 중요하게 생각하는 듯. 26 | `역할, 책임, 협력`은 책이 끝날 때까지 반복되는데 객체들이 상호작용을 하여 애플리케이션을 만드는 것을 아름답다 생각하는 것 같음 (나무들이 숲을 이루듯) 27 | 28 | 최근에 한국어와 영어의 차이점을 봤는데 한국어는 사람의 관점에서 이야기 하지만 영어는 사물을 의인화 시켜 사물의 관점으로 이야기한다는 점이다. `The traffic sign displays the word 'STOP'. -> The traffic sign says 'STOP'.` 이런 면에서 현실 세계와 객체지향의 세계의 차이점과 비슷해 보이는 느낌을 받았다. 29 | 앨리스가 물을 마셨을 때, 물병은 스스로 물의 양을 줄인다는 것은 사람의 관점에서는 이해가 안 되지만 객체지향 세계의 객체 관점에서는 당연한 것 -> 객체가 되어 생각해야 한다! 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter03.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 03 타입과 추상화 3 | ### Discussions 01. 다형성 4 | - 다형성이란 동일한 요청에 대해 서로 다른 방식으로 응답할 수 있는 능력을 뜻한다. 5 | - 동일한 메시지를 서로 다른 방식으로 처리하기 위해서는 객체들은 동일한 메시지를 수신할 수 있어야 하기 때문에 결과적으로 다형적인 객체들은 동일한 타입(또는 타입 계층)에 속하게 된다. 6 | 7 | #### review 8 | 다형성의 이해가 잘 되지않아 자바스크립트와 다른 언어들과 비교를 해서 생각을 해보았다. 9 | 자바스크립트는 다른 객체지향 언어들과는 다르게 타입을 선언하지 않아도 타입에러가 나지 않는다. -> 자유도가 높은 언어 -> 그래서 다형성 구현 문법이 따로 필요하지 않음? 10 | 그렇다면 타입에 종속되지 않는다는 것은 굉장히 자유롭다는 장점이 있을텐데, 왜 타입스크립트가 나왔을까!? 타입이 없어 자유도가 높다는건 단점인건가? 11 | 12 | ### Discussions 02. 정적모델과 동적모델 13 | - 객체를 생각할 때 우리는 두 가지 모델을 동시에 고려한다는 사실을 알 수 있다. 14 | - 객체지향 애플리케이션을 설계하고 구현하기 위해서는 객체 관점의 동적 모델과 객체를 추상화한 타입 관점의 정적 모델을 적절히 혼용해야 한다. 15 | 16 | #### review 17 | 동적 모델은 객체의 행동과 그에 따른 상태, 정적 모델은 객체의 추상화로 이해 18 | [적절히]라는 말의 [기준]이 무엇일까? 그리고 [동시에]라는 말이 약간 혼란스러움 19 | 나는 먼저 추상화가 되고 -> 행동과 상태를 결정해야 된다고 이해하고 있는데 그렇다면 적절히 혼용한다라는 문장보다는 20 | [개념관점인 정적 모델을 완성시키고 행동과 상태를 모델링한 동적 모델을 설정해야한다] 처럼 순서적인게 맞지않나? 생각이 듦 21 | 22 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter04.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 04 역할, 책임, 협력 3 | ### Discussions 01. 베르너 귀스 교수의 경제학 게임 실험 4 | 베르너 귀스 교수의 경제학 게임 실험은 예상하지 못한 결과라 읽으며 너무 흥미로웠다. 5 | 그런데 이 실험이야기가 객체지향을 설명할 수 있는 이야기인지는 이해가 잘 안된다. 6 | 객체의 협력과 조화, 자율성을 매력적으로 설명하고 싶은 내용인 것은 알겠으나, 7 | 사람이 자유의지를 통해 예측할 수 없는 선택을 하는 것과는 조금 다른이야기가 아닐까? 8 | 9 | ### Discussions 02. 다른 객체의 활동을 제어하거나 조절하는 것? 10 | 객체의 책임은 크게 하는 것, 아는 것 으로 나뉘어 지는데 그 중 하는 것에 '다른 객체의 활동을 제어하고 조절하는 것'이라고 쓰여져 있음 11 | 한 세번쯤 읽어보니 어떤 뜻인지 이해를 할 것 같았다. 다만 '활동을 제어하고 조절한다' 라는 워딩을 나같은 객알못(객체 지향을 잘 모르는 사람)이 보게 될 경우 12 | 객체의 상태를 제어하는 것 같은 느낌을 받을 수 있을 것 같다. 근데 딱히 다른 워딩이 생각나진 않는다. 13 | 14 | ### Discussions 03. 협력의 추상화, 대체 가능성, 객체의 모양을 결정하는 협력 15 | abstract, extends, interface, implements 단어를 사용하지 않고 추상화를 설명한다는 것은 정말 어려운 일 같은데, 16 | 이 파트에서는 위 단어를 사용하지않고 추상화를 설명하고 있는 것 같은 느낌을 받음. 17 | 18 | 블로그에서 복붙한 것 같은 같은 글들이 생각나 더 비교되며 책 내용이 더 재밌어짐 19 | 20 | 그런데 생각해보면 1도 모르는 객알못 상태에서 읽게 되면 너무나 동화같은 이야기로 받아 들일 수 있을 것 같지만, 21 | 22 | 다른 면으로는 기술적인 부분에만 치우치지 않고 본질적인 부분을 먼저 접할 수 있는 부분은 장점인 것 같음 -> 양날의 검 23 | 24 | 기술적인 기초 개념이 받쳐주면 다른길로 새지 않고 직관적으로 더 풍부하게 생각할 수 있을 것 같음 25 | 이 책은 1도 모르고 읽는게 좋을까 어느 정도 알고 읽는게 좋을까? 잘 모르겠다. 26 | 27 | ### Discussions 04. TDD 28 | tdd의 정의는 '만들고자 하는 어플리케이션의 결과를 명확하게 알고, 그러기 위해 적어놓고(문서화) 또한 그 결과를 내는 과정을 공고하게 해두는 것' 이라고 한다. 29 | 30 | 이 파트 내용에서도 비슷하게 설명하는 것 같음 -> 객체를 역할, 책임, 협력 관점에서 객체를 바라보고 이해해야 올바른 tdd가 가능하다. -> 기초 설계가 잘 되어야 한다. 31 | 32 | 잘 설계한대로만 하면 어려울 것 없다~ 이런 느낌. 33 | 프론트엔드는 로직도, UI도 모두 test해야하니 어렵고 힘들다. 우리나라 정서상...(우리나라 정서상 이라는 말을 진짜 많이 들었다)이라고 하는 개발자가 있었음 34 | 하지만 그렇기 때문에 변동성이 잦은 프론트엔드에서는 특히나 더 tdd가 필요할 것 같음. 35 | 36 | 다만 책에서도 말하는 것처럼 초보자에게는 쉬운일이 아닐듯 37 | 그렇다면 초보자도 tdd를 할 수 있는 방법은 토이프로젝트에서 개인적으로 시도해보는 방법일 뿐일까? 회사에서 주니어가 tdd개발 할 수 있는 환경이 있을까..혹은 pair programming 통해 주니어의 tdd개발을 돕는 환경이 활성화 된다면 우리나라 정서상..이라는 단어가 그래도 좀 덜 나오게 되진 않을까 싶다. 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter05.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 05 책임과 메시지 3 | ### Discussions 01. 너무 추상적인 책임 4 | 어디까지 추상해야하나? -> 3장 초반에 나왔던 지하철 노선도 작업을 생각하면 답이 나올 것 같다. 5 | 이 내용에서도 이야기 하듯 설계 목적이 선명하면 자연스럽게 어디까지 추상해야 하는지가 명확히 나올듯 6 | 7 | ### Discussions 02. 다형성, 인터페이스 8 | #### 02.1 같은 `메시지`를 수신하여 다른 `메서드`를 수행한다? 9 | ``` 10 | interface 동물 { 11 | 운다(){} 12 | } 13 | 14 | 돼지 implements 동물 { 15 | 운다(){ 16 | 꿀꿀 17 | } 18 | }; 19 | 강아지 implements 동물 { 20 | 운다(){ 21 | 멍멍 22 | } 23 | }; 24 | 닭 implements 동물 { 25 | 운다(){ 26 | 꼬끼오 27 | } 28 | } 29 | ``` 30 | 이렇게 운다는 `메시지`를 사용하여 자신만의 `메서드`로 서로 다른 행동을 하는 것을 말하는 것일까? 31 | 맞다면 interface, implements 라는 단어는 너무나 완벽한 직관적인 단어같다. 32 | 마치 설계를 위한 개념을 코드로 만들어놓은 느낌을 받았다)설계서를 만들어 의사소통하며 구조를 만들어나가는 과정으로 느껴짐) 만약 인터페이스가 단점으로 느껴진다면, 설계가 잘못된것은 아닐까..? 33 | 34 | 35 | #### 02.2 `대체 가능성`이란? 36 | ``` 37 | 동물 강아지 = new 강아지 38 | 강아지 돼지 = new 돼지 39 | 동물 닭 = new 닭 40 | 41 | 동물농장을 지켜라(동물 이면 누구든) { 42 | if(호랑이가 나타났다!) { 43 | 동물 이면 누구든.운다() 44 | } 45 | } 46 | 47 | 동물농장을 지켜라(강아지); 48 | 동물농장을 지켜라(돼지); 49 | 동물농장을 지켜라(닭); 50 | ``` 51 | 강아지지만 동물이 될 수 있고, 돼지지만 강아지가 될 수 있고, 52 | 이 모두가 동물이기 때문에 동물농장을 지킬 수 있는 것이 `대체 가능성`인가? 53 | 그렇다면 다형성의 '형'은 'type(개념)'이었구나..? 54 | 55 | #### 02.3 56 | 객체가 협력에 참여하기 위해 수행하는 메시지가 객체의 공용인터페이스의 모양을 암시한다. 이것은 앞에서 설명한 책임-주도 설계 방식의 what/who 사이클과도 관련이 깊다. 57 | 58 | -> 잘 생각해보면 객체가 어떤 일을 해야하는지 책임,행동을 정해놓고(interface) 행동을 구현하며(implements, overriding,) 행동에 맞는 데이터를 구성하는 것으로 보임. 59 | 60 | ### Discussions 03. 데이터주도설계, 책임주도설계 61 | 데이터-주도 설계가 나쁜 것인 줄 알았다. 레거시 코드처럼. 62 | 책임-주도 설계가 좋으니까 해야하는 줄 알았다. 요즘 TDD하니까 TDD해야해! 라는 것 처럼 63 | 그런데 생각해보면 데이터-주도, 도메인-주도, 책임-주도는 관점의 차이인 것 같다. 64 | 데이터-주도는 데이터에 초점을 맞추면 되는거고, 도메인-주도는 사용자가 사용함에 관점을 두는 것이고, 책임-주도는 객체가 협력함, 행동에 대한 책임에 관점을 맞추는 것, 65 | 어떤 한 설계만 옳다고 하는 것은 관점을 이해 하지 못하고 이야기하는 것은 아닐까? 66 | 처음에 잘못생각 했던 실수를 하지 않으려면 앞으로 절대 잘 알지 못한 상태로 스스로 판단하면 안되겠다는 생각을 했음 67 | 그거 별로야하는 사람을 봤을 때는 일단 믿지말고 스스로 왜 별론지를 찾아보자 68 | 69 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter06.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 06 객체 지도 3 | ### Discussions 01. 기능 설계 vs 구조 설계 4 | 요구사항이 변경될 가능성이 없다면 책에서 나온대로 어떻게 개발되어져도 상관없을 듯 5 | 미래의 변경될 요구사항에 유연하게 대처하기 위한 것이 소프트웨어이기 때문 6 | 하지만 미래를 대비한다? 지금도 나에게는 너무 어려운 부분.. 7 | 그래서 개발자들이 기획자들과 사전미팅을 진행할 때 변경될 요구사항을 파악하기 위해 8 | 그렇게 잡아먹을 것 처럼(?)하는 것인가 생각도 들었음 9 | 요구사항에 대한 변경을 미리 차단해버리면 좋지않을까? 하는 막연한 생각도 들었지만, 10 | 생각해보면 나중에는 결국 다 변경 되었던 것 같음 11 | 12 | ### Discussions 02. 기능 설계 vs 구조 설계 현실? 13 | 기능을 중요시하는 설계가 나쁜 것은 아니라고 생각, 다만 객체지향적인 코드와 소프트웨어의 가치를 14 | 위한다면 구조 설계와 기능 설계가 적절해야한다고 생각한다. 알고 있으나 현실에 치여 그렇게 하고 있지 못하는 사람들이라면 너무 안타깝지만 사실을 알고도 외면하는 사람들은 아주 큰 잘못을 하고 있다고 생각한다. 그야말로 소프트웨어의 가치를 폄하하는 것이라고 생각하기 때문 15 | 16 | ### Discussions 03. 설계 창조 ≠ 예술 17 | 요구사항을 만족시킬 수 있는 다양한 설계안들을 저울질하면서 그 결과로 단순하면서도 유연한 설계를 창조하는 것은 공학이라기보다는 예술에 가깝다. 18 | 19 | → 개념을 입히고, 객체를 생성하여 객체를 움직이며 내 머릿속에 있는 세계를 반영시키는 것은 너무나 멋지고 하나의 예술처럼 느껴진다. 하지만 나도 나만의 예술작품을 만들어 보겠어! 라고 생각하는 것은 위험하지 않을까? 왜냐하면 진짜 예술은 남들과 다르고 이해하기 어려울수록 가치가 있지만 20 | 코드는 그렇지 않기때문 취향차이로 남들과 다를수는 있겠지만 난해하진 않아야됨, 그래서인지 설계의 창조는 예술이다가 아닌 예술에 가깝다~라고 한 것 같기도 함 21 | 22 | ### Discussions 04. 도메인 모델 23 | 안정적인 재료와 불안정적인 재료 24 | 25 | → 안정적임과 불안정적임을 나누는 기준은 요구사항의 변경 가능성인데, 책에서도 안정적인 모델은 비교적 오래 유지한다고 함 즉 [변하지 않는 것] 이라고 생각하면 안될 것 같음. 도메인 구조가 잘 잡혀 있다면 이 구조를 기반으로 작업된 기능(요구사항이 변경될 가능성이 높은 불안정적인 재료)들은 자연스럽게 대처가 가능할 수 밖에 없다는 면에서 도메인 모델이 안정적인 재료라고 하는듯? 26 | 27 | 사용자의 관점을 반영하며, 반영된 관점은 그대로 소프트웨어 개발로 이어진다. 28 | 우리가 은유를 통해 투영해야 하는 대상은 무엇인가? 그것은 바로 사용자가 도메인에 대해 생각하는 개념들이다. 즉, 소프트 웨어 객체를 창조하기 위해 우리가 은유해야 하는 대상은 바로 도메인 모델이다. 29 | 따라서 소프트웨어 객체는 그 대상이 현실적인지, 현실적이지 않은지에 상관없이 도메인 모델을 통해 표현되는 도메인 객체들을 은유해야 한다. 이것이 도메인 모델이 중요한 이유다. 도메인 모델을 기반으로 설계하고 구현하는 것은 사용자가 도메인을 바라보는 관점을 그대로 코드에 반영할 수 있게 한다. 결과적으로 표현적 차이는 줄어들 것이며, 사용자의 멘탈 모델이 그대로 코드에 녹아 스며들게 될 것이다. 30 | 31 | → 도메인 모델은 견고한 애플리케이션이 될 수 있도록 하는 사용자와 개발자 모두를 위한 단계 32 | 33 | 영국의 한 할머니가 로마 숫자 변역을 하기 위해 구글 검색창에 이렇게 작성하였다 34 | ”Please translate these roman numberals mcmxcviii thank you” 35 | 실례지만 이 로마자 숫자를 변역해주시겠습니까? 감사합니다. 라는 뜻인데 36 | 할머니는 화면 반대편의 구글 본사에 검색을 담당하는 직원이 있을 것이라고 생각하여 37 | 공손하게 작성했다고한다. 38 | 이렇듯 누군가가 사용할 나의 서비스는 사용자의 멘탈 모델이 반영이 될 수 밖에 없고, 39 | 모든 것이 멘탈 모델과 이어지기 때문에 소프트웨어 설계와 구현 모든 면에서 가장 중요하다고 생각 40 | 이 사례가 얼마나 멘탈 모델이 설계 구조에서 중요한지 대표적으로 보여줌 41 | 42 | ### Discussions 05. 유스케이스 43 | 5. 유스케이스 44 | 그동안의 단계들은 객체들간의 내부 설계였다면 이 단계는 고객,사용자,클라이언트와의 외부의 상호작용의 느낌 어떠한 설계 기법도 들어가지 않은 비니지니스적인 단계인 것 같다는 생각이 들었다. 45 | 46 | 유스케이스 예제를 보고 감탄했던 부분은 책임과 협력을 만드는 과정을 교과서적인 단계 설명이 아니라 머릿속으로 상상하도록 유도시킨다는 점이다. 47 | 48 | 중도 해지 이자액 계산 유스케이스를 보며 테스트코드 작성시 만들었던 시나리오가 생각났다. 49 | 그렇다면 테스트케이스를 작성할 때 유스케이스를 기반으로 작성해도 되지 않을까? 50 | 51 | 요구사항에 대해 잘 정리된 문서가 있다면 유스케이스는 없어도 되지 않을까? 52 | 아니면 꼭 다이어그램이어야 할까? 나는 다이어그램을 보면 헷갈릴때가 많아서 53 | 오히려 표나, 글로 작성되면 더 좋을 것 같다는 생각이 들었다. 54 | 55 | 도메인 모델 + 유스케이스(혹은 사용자 관점으로 정리된 요구사항) 56 | 객체지향적 설계에서 외부에서 바라보는 관점과, 내부에서 바라보는 관점의 이해 수준이 높을 때 57 | 좋은 코드가 나올 것 같다는 생각이듦 -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/hyein/chapter07.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | ## Chapter 07 함께 모으기 3 | ### Discussions 01. 커피 전문점 Class 4 | 작은 범위의 모델이 구현되는데 Class가 5개가 나왔다. 뭔가 Class는 대빵 개념의 느낌이라 5 | 많아도 괜찮은걸까? 생각이 들었다. Class가 많은게 중요한게 아니라, Class의 책임이 한개씩이라는 것에 중점을 두고 봐야하는 것인가? 6 | 7 | ### Discussions 02. 인터페이스를 프로그래밍하라! 8 | 처음엔 이게 무슨 뜻일까 살짝 고민함 9 | 사용자와 상호작용을 하는 인터페이스? 코드의 interface? 어떤 것을 프로그래밍 하라는거지? 10 | 그런데 생각해보니 둘 다 해당하는 내용인듯 11 | 사용자와의 상호작용을 하는 인터페이스를 프로그래밍 한다면 견고하고 안정적인 설계가 되고 12 | 코드의 interface를 프로그래밍하면 유연한 구조의 구현이 가능할 것 같음 13 | 14 | ### Discussions 03. 마지막 챕터 15 | 약간의 코드와 함께 앞 챕터의 내용들을 총 정리한 것 같음. 깔끔한 마무리에 개운해졌다ㅎㅎ 16 | 읽는 내내 추상클래스의 구현상속보다는 인터페이스 상속에 대한 내용인 것 같은 느낌이 많이 들었음 17 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/appendixA.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Appendix A 4 | 5 | ### Discussion 01 - Abstraction 6 | 7 | 온전히 추상화 기법에 대한 걸 다루고 있다. 결국 추상화가 객체지향적인 방향으로 가는 것의 핵심적인 구현 방법이기 때문에 그런 것이라고 보는데 8 | 9 | - 분류와 인스턴스화 10 | - 일반화와 특수화 11 | - 집합과 분해 12 | 13 | 이렇게 언급했을 때, 각각 어떻게 구분할 수 있는지 얘기해 볼 수 있다면 부록에 있는 건 다 파악한 것이라고 본다. 14 | 15 | #### 분류와 인스턴스화 16 | 17 | - Type 18 | - Class 19 | 20 | #### 일반화와 특수화 21 | 22 | - Inheritance 23 | - Subtyping 24 | - Subclassing 25 | 26 | #### 집합과 분해 27 | 28 | - Composition 29 | - Package and module -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter01.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 01 4 | 5 | ### Discussion 01 - 새로운 세계의 창조? 6 | 7 | > 객체지향의 목표는 실세계를 모방하는 것이 아니다. 오히려 새로운 세계를 창조하는 것이다. 소프트웨어 개발자의 역할은 실세계를 소프트웨어 안으로 옮겨 담는 것이 아니라 고객과 사용자를 만족시킬 수 있는 신세계를 창조하는 것이다. 8 | 9 | 사실 어느 정도 실세계를 모방하고 추상화 작업을 거치기는 하는데, 새로운 세계를 창조한다는 것이 잘 이해가 안되긴 함 => 고객과 사용자를 만족시킬 수 있는... 이라고는 하는데 그냥 좋게 얘기한거 아닌가? 싶음 10 | 11 | 그러면 고객과 사용자를 만족시키는데 반드시 객체지향이어야 하는지 조금 생각해 볼 필요는 있음. 아름답고 단순한 UI가 객체지향이 아닐 수도 있는데, 조금 더 객체지향과 소프트웨어 개발과의 간극에 대해 생각해 볼 필요가 있어 보임. 12 | 13 | 객체지향 외적인 것은 논외로 한다면, 새로운 세계의 창조라는 얘기는 너무 객체지향 팬보이로서의 자세로 [미사여구](https://ko.wiktionary.org/wiki/%EB%AF%B8%EC%82%AC%EC%97%AC%EA%B5%AC) 인게 아닐까 싶음. 14 | 15 | ### Discussion 02 - Role, Responsibility, Collaboration 16 | 17 | 역할, 책임, 협력이라는 세 단어 사이에서 어떤 객체지향의 느낌이 다가오는지? 18 | 19 | 손님, 캐셔, 바리스타 간의 커피를 만들고 서비스 하기 위해 협력하는 걸 보고 이걸 객체지향적이라고 느낄 수 있기 까지 우리는 코딩을 많이 해봐야 하는 것인가? 아니면 정말 객체지향적인 생각을 위해 커피숍과 같은 일상 생활 공간에서 의도적으로 배워야 하는 것인가? 20 | 21 | 혹시 클래스, 상속, 다형성이 먼저 생각나지는 않는지? 그렇다면 우리는 왜 객체지향을 클래스, 상속, 다형성 이라는 교과서적인 내용 부터 배우기 시작해서 어렵게만 느끼고 있는지 생각해 볼 필요가 있음 22 | 23 | ### Disscussion 03 - 객체의 자율성 24 | 25 | > 자율적이라는 단어의 뜻은 자기 스스로의 원칙에 따라 어떤 일을 하거나 자기 스스로를 통제하여 절제하는 것 26 | 27 | 우리가 프로그래밍을 하면서 객체에 자율성에 대해 생각하고 그 자율성을 부여해서 코드를 작성했는지? 나도 그런적이 없는 것 같음 28 | 29 | 객체가 자율적인 존재라는 의미를 조금 더 생각해볼 필요는 있음. 왜냐하면 가끔 그렇게 작성한 코드가 있는데 의식을 하지 않은 부분이 있었기 때문. 30 | 31 | 어쩌면 객체를 지향한다는 의미에 매우 가까운 표현 중에 하나라고 봄. 32 | 33 | 그리고 이제 객체를 지향한다는 의미를 조금 더 되새겨 보고, 클래스 상속이라는 단어 부터 떠올려보지 않으려 노력해 볼 필요가 있음. 34 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter02.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 02 4 | 5 | ### Discussion 01 - 객체의 상태와 행동 6 | 7 | 객체를 왜 상태와 행동으로 표현하고 바라보고 싶은 것인지? 이상한 나라의 앨리스의 앨리스 객체는 사람이라서 쉽게 이해가 될 수 있지만 실제 코드를 작성해 봤을 때 이런 방식의 코드를 짜는게 얼마나 가능할지? 8 | 9 | 앨리스 객체가 음료에 메시지 전달, 음료가 자율적으로 행동을 처리해 음료의 양을 줄임, 그의 결과로 앨리스의 키가 변화. 이런 방식의 코드를 짜기 전에 먼저 설계가 필요할 것 같다. 이정도 범위라면 설계 없이 바로 코딩이 가능할 수 있긴 하지만, 우리가 정작 코드를 작성할 때는 객체 중심이기 보다는 클래스 중심이라 더 와닿는 표현일지는 의문임. 10 | 11 | ### Discussion 02 - 의인화 12 | 13 | 기계로서의 객체는 의인화를 배제하면 조금 더 쉬운 개념인 듯. 객체를 만든다면 메서드와 상태가 어떻게 만들어져야 하는지 가늠이 됨. 그런데 실제 실세계에서는 기계 혼자서 할 수 있는 일은 없음. 하지만 객체지향의 세계에서는 의인화를 통해 스스로 행동하고 상태를 변화시키는 객체로 바라볼 수 있다. 14 | 15 | 우리는 객체를 얼마나 의인화를 시키고 있는지 생각해 보면 좋을 듯. 단순 코드로 존재하고 동작하는 코드에 무슨 의인화냐? 라고 할 수 있지만, 다르게 생각해 봤을 때는 좋은 설계를 위한 관점이라고 보여짐. 16 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter03.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 03 4 | 5 | ### Discussion 01 - 추상화 6 | 7 | 바로 abstract 클래스나 메소드를 얘기하고 싶어진다. 하지만 내 생각에는 이런 사전적인 정의나 내용을 먼저 얘기하는건 진정한 객체지향이 아니라고 생각함. 8 | 9 | 왜 추상화여야 하는가에 대한 생각을 해보게 만드는 지하철 노선도의 예가 있다. 객체를 분류해서 추상화를 진행한다. 어떻게 보면 개발자의 능력치로 요구하는게 아닌 것처럼 느껴짐. 코드를 잘 짜는 능력의 뒷받침일 수 있음. 10 | 11 | ### Discussion 02 - 타입 12 | 13 | 타입의 개념. 크게 어렵지 않음. 객체의 타입 캐스팅이나 상속을 잘 떠올려 보면 이해가 됨. 추상화를 위해서 타입이 중요하고 한 객체의 다형성을 표현하는 중요한 포인트라고 봄. 또 이렇게 얘기하면 상속 부터 시작하는 잘못된 방향으로 갈 수 있기에 조심스럽게 타입이라는 얘기를 먼저 꺼낸게 아닐까? 싶다. 14 | 15 | 객체를 중심으로 추상화를 위해 타입을 가진다 (O) 16 | 17 | 클래스의 상속을 구현하면 다형성의 특징이 있다 (X) => 틀린말이 아니라 클래스 중심의 객체지향적이지 못한 교과서적인 내용이라 별로인 표현 18 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter04.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 04 4 | 5 | ### Discussion 01 - Again Role, Responsibility, Collaboration 6 | 7 | 왕과 토끼 모자장수의 재판 과정을 통한 조금 더 구체적인 설명. 8 | 9 | 다시 객체에 대한 역할을 잘 설명한 느낌, 메시지라고 얘기했지만 인터페이스의 느낌에 가까웠음. 실제 인터페이스에 대한 언급은 없지만 인터페이스를 통해 역할이 주어지면 객체가 변경되어도 역할은 동일하니까. 이걸 추상화라는 용어로 설명했지만 어쩌면 인터페이스로 생각하는 것도 잘못된 생각인걸까? 10 | 11 | 그리고 자바에는 없지만 C#에 있는 event가 어떻게 보면 협력, 메시지 전달, 메서드 수행의 단계를 설명한 게 아닐까? 하는 생각을 해봄 12 | 13 | event에서의 개념 정리 14 | 15 | - 협력: event handler를 등록, 서로간의 객체 자체를 알고 있는게 아니라 event라는 통로를 통해 연결 시킴 16 | - 메시지 전달: event invoke(), 실제 메시지를 전달 하는 과정임. 어떤 객체가 이 메시지를 받아 수행할지는 메시지를 받는 메서드(event handler)가 판단함 17 | - 메서드 수행: event handler, 전달 받은 메시지를 수행. event 호출로 수행하던 실제 메서드 호출로 수행하던 자율성, 캡슐화가 깨지지 않음 18 | 19 | ### Discussion 02 - Object Oriented Design 20 | 21 | 이제야 객체지향적인 설계에 대한 이해도가 높아진 듯 함. 조금 흩어져 있던 개념과 지식들이 잘 정리가 되었다. 아래 내용은 각각 엄청난 범위고 디자인 패턴과 TDD의 경우는 책으로도 또 있는 내용이라, 정말 이해가 되려면 엄청난 독서량, 실제 설계 경험, 그런 경험의 많은 반복이 요구되는 것 같다. 그냥 책 한권 읽고 알았다? 의 느낌은 절대 안올 듯. 22 | 23 | - Responsibility-Driven Design 24 | - Design Pattern 25 | - Test-Driven Development 26 | 27 | 책임 주도 설계에 대한 건 어렴풋이 기억을 하고 있긴 했지만, 실제로 일할 때 의식하고 설계하지는 못함. 어쩌면 자연스럽게 체득해서 진행을 하고 있었던 건데 의식을 진짜 못했음. 이제는 책임 주도 설계라고 얘기할 수 있는 확신이 생김 28 | 29 | 디자인 패턴은 지식으로 알아가기에는 이해의 문턱이 상당히 높다. 객체지향 언어 다룰 줄 알고 경력 좀 된다고 떠들고 다닐만한 주제가 아니라는 걸 composite 패턴을 통해 다시 알게 됨. 디자인 패턴 안다고 얘기하는 사람이 어떻게 보면 제일 무서운 사람인듯, 정말 알고서 얘기하는 것일까? 아니면 과시하려고 혹은 이상적인 지향점이라서 얘기하는 것일까? 30 | 31 | 내가 GoF의 디자인 패턴 책을 정말 아무것도 모르고 봤던 때가 2003년이다. 그리고 조금 코딩 잘할 줄 안다고 생각했던 2008년 즈음에도 한번 더 봤다. 이때는 확실히 몇 개의 패턴이 이해가 좀 됐고 인터페이스의 중요성을 알게 됐다. 이후 다시 여러 패턴들을 알려주면서 공부한다고 했던 2017년 에도 다시 봤다. 2021년 지금 와서 돌이켜 보면 많이 알고 있다고 자신있게 얘기할 수 있나 싶을 정도다. 30년 이상 된 선배들의 피, 땀, 눈물 그리고 진심으로 설계라는 걸 해보지 않았으면 영원히 이해 못할 내용인 듯 하다. 이걸 정말 이해해서 실무에 적용한걸 **자랑스럽게** 얘기할 수 있는 사람을 찾아보고 싶다 진심으로. 32 | 33 | TDD 역시 설계에 대한 근본적인 개념 없이 테스트 코드 짜는 거라고 생각하면 여지없이 실패한다. (뭐 테스트 코드조차 짜는 사람이 얼마나 될까?) 클래스 설계, 다시 말해 객체지향적인 설계가 없이 TDD를 하겠다고 덤벼들면 항상 왜? 라는 질문에 답을 못하기 때문. 결국 설계라는 걸 해본 적이 없이 TDD를 하면 이게 왜 좋은거지? 라는 스스로의 질문에 대답을 못해서 하는둥 마는 둥 하다 망함. 그리고 경험담인데, 이미 흉내내기로 해보다가 몇 번 망해본 적 있음. 34 | 35 | 10년전에 [테스트 주도 개발](http://aladin.kr/p/DFRsX)이라는 책 읽고 TDD 하는 방법에 대해서 알고자 했던 과거의 자신을 반성. 이제 TDD를 언급하려고 하면 반드시 설계에 대한걸 물어보고 시작해야 정상적인 객체지향 수련법이라고 보고 싶다. 36 | 37 | 그렇지 않다면 구현 코드를 짠 후에 unit test 적어 두고 TDD라고 주장하게 될테니까. 38 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter05.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 05, Responsibility and Message 4 | 5 | ### Discussion 01 - 자율성에 대한 리뷰 6 | 7 | 객체의 자율성에 대해 다시 한번 의미 되살려 보기. 8 | 아래 나열된 키워드들로 말을 만들어보면 어떨까? 9 | 10 | - 책임 11 | - 협력 12 | - 설계의 품질 13 | 14 | ### Discussion 02 - 책임과 추상화 15 | 16 | 왕이 모자장수에게 증언하라 라는 요청은 상당히 추상화된 내용이다. 모자장수에게 부여된 책임이 추상적일 수록 모자장수는 자율적으로 증언할 수 있게 된다는 내용인데, 여기서 왕이 요청한 메시지가 증언하라가 아닌 설명하라로 바뀌게 되면 추상화의 레벨(의도가 달라지는 차이의 표현)이 달라지므로 설계 중인 협력이 무엇인지에 따라 달라진다는 얘기를 아름답게 포장해서 다음과 같이 얘기하고 있다. 17 | 18 | `이런 모호함이 객체지향 설계를 난해하면서도 매력적인 예술로 만드는 이유다.` (145p) 19 | 20 | 추상화는 어느 수준까지 추상화여야 할까? 이게 정답이 없어 보이는데 알아서 추상화 하라는 얘기일까? 그래서 예제도 증언하라 vs 설명하라의 차이를 알려주긴 하는데 이건 예제일 뿐이고 실제는 어떻게 이 추상화의 레벨을 구분해 볼 수 있을까? 21 | 22 | ### Discussion 03 - how vs what 23 | 24 | 내가 평소에 상당히 좋아하는 말로 how 보다는 what, what 보다는 why에 집중하자라고 하는데, 코딩 레벨만 아는 사람한테 이런 얘기는 쓸데없는 얘기일 수 밖에 없다. 25 | 왜냐하면 최소한 what의 레벨에 가기 위해서는 설계에 대한 이해가 필수적이기 때문이라서 그렇다. 26 | 27 | 이것이 당연하고 자연스럽게도 객체의 자율성을 보장하는 책임으로 연결되는데, 평소에 what에 집중하지 못하고 how에 집중했을 때 어떻게 객체지향적이지 못한 결과가 초래되었는지 논의해 보면 좋을 듯. 28 | 29 | ### Discussion 04 - Message vs Method 30 | 31 | 원래 객체지향에 대해 잘 알고 있다고 하더라도 메시지(message)에 대한 부분은 생소하거나 이상하게 느껴질 수 있다. 왜냐하면 반대로 메서드(method)의 경우는 객체지향을 배우면서 너무도 당연하고 자연스럽게 그리고 쉽게 배울 수 있는 단어이기 때문에 그렇다. 32 | 33 | `메서드를 호출한다` 가 메시지로 받아들여지기 까지 나도 많은 생각을 하게 되었는데, 오히려 이렇게 생각의 전환을 하고 나니 책임과 협력에 대한 키워드의 구분이 더 명확해 진 것 같은 느낌이다. 34 | 35 | 메시지와 메서드가 어떻게 다른 것이었는지 처음에 생각했던 방식에 대해 논의해 보고, 이해해갔던 과정을 얘기해 보면 좋은 논의가 될 듯. 36 | 37 | ### Discussion 05 - Polymorphism 38 | 39 | 객체지향 얘기에 빼놓을 수 없는 중요한 키워드 다형성의 등장! 40 | 41 | 코드로 오버라이딩 정도를 설명하고 다형성이다라고 나오는 보통의 객체지향 책에서는 접할 수 없는 신선한 빌드업이라고 느껴짐. 왜냐하면 메시지와 메서드의 차이를 구분해놔야 비로소 진정한 다형성이 무엇인지 알게 되니까. 42 | 43 | 여기에 언급되는 다형성과 여태까지 알고 있었던 다형성의 차이가 어느 정도였는지 얘기해 보면 재미있는 논의가 될 수 있다고 봄. 44 | 45 | ### Discussion 06 - 송신자와 수신자를 약하게 연결하는 메시지 46 | 47 | 이걸 보고 인터페이스를 느꼈는데, 아직 인터페이스에 대한 강력한 문법적인 내용은 없다. 48 | 49 | 하지만 내용의 뉘앙스는 확실히 인터페이스 얘기가 맞는 것 같다. 이 단락의 내용이 인터페이스인지 아닌지 논의해볼 필요는 있어 보인다. 50 | 51 | 또 What/who 사이클 설명에 인터페이스를 언급하긴 하는데 약간 객치지향의 멋짐이 인터페이스임이라고 얘기하는 내용이 나온다. 52 | 53 | 여기서 인터페이스가 얼마나 중요한 대목인지 다시 한번 확인이 가능해진다. 이런 멋짐을 이해하기 위해서는 인터페이스가 무엇인지 다시 의미를 되살려 봐야 할 것 같다. 54 | 55 | `메시지가 결정된 후에야 메시지를 수신할 후보를 선택하는 것으로 초점이 이동한다. 멋지지 않은가?` (159p) 56 | 57 | ### Discussion 07 - interface 58 | 59 | 마지막 빌드업 인터페이스! 정리를 해 나가면서 메시지의 핵심이 인터페이스라는 걸 다시 언급함. 60 | 61 | 나 역시도 객치지향을 논할 때 가장 먼저 하는 질문은 아래와 같다고 보는 사람이다. 62 | 63 | `인터페이스가 뭔가요?` 64 | 65 | 인터페이스를 논할 수 없는 사람은 객체지향을 이해하지 못한 사람으로 간주해도 무방하다고 본다. 66 | 67 | 이후 인터페이스 내용은 (내 기준으로) 당연한 얘기이므로 앞서 discussino 06의 인터페이스에 대한 논의로 대체가 가능함. 68 | 69 | ### Discussion 08 - Encapsulation 70 | 71 | 캡슐화가 사실 public, private만 논하고 그칠만한 내용은 아닌데 너무 이쪽 설명에만 치중되어 있어 마음에 들지 않는 부분이 많았음. 72 | 73 | 뜻밖에도 인터페이스에서 연결되는 내용은 캡슐화라는게 놀라웠고 이게 인터페이스와 구현의 분리 원칙의 방향성을 설명해주는 것이라는 것에서 감탄함. 나 역시 이렇게 설명을 하지는 못했었으니까. 74 | 75 | ### Discussion 09 - 책임의 자율성이 협력의 품질을 결정한다 76 | 77 | 멋진 말이다. 이 멋진말을 다섯가지 이유로 너무 자세히 설명해서 당연했지만 감동 받았다. 사실 어느 누구도 이정도로 이유에 대해서 네 페이지에 걸쳐 설명하는 사람이 있을 수 있을까? 78 | 79 | 다섯가지 이유를 정리해 보며, 누군가 질문을 했을 때 나 역시 대답을 해볼 수 있게 적어본다. 80 | 81 | 책에 적혀 있는 당연한 얘기고 논의 거리는 아닐 수 있지만, 누군가 질문을 한다면 망설이지 않고 대답하고 싶다. 82 | 83 | - 첫째, 자율적인 책임은 협력을 단순하게 만든다. 84 | - **추상화**에 대한 설명을 할 수 있어야 한다. 85 | - 둘때, 자율적인 책임은 모자 장수의 외부와 내부를 명확하게 분리한다. 86 | - 메시지와 메서드의 차이, 인터페이스와 구현의 분리를 설명할 수 있어야 한다. 87 | - 셋째, 책임이 자율적일 경우 책임을 수행하는 내부적인 방법을 변경하더라도 외부에 영향을 미치지 않는다. 88 | - 내부와 외부 얘기는 캡슐화 이야기이고 캡슐화가 잘 되어 있다면, 외부와의 의존성이 분리가 가능하므로 결합도가 낮다는 설명이 가능해진다. 89 | - 넷째, 자율적인 책임은 협력의 대상을 다양하게 선택할 수 있는 유연성을 제공한다. 90 | - 협력의 대상을 다양하게 선택해도 책임은 자율적이어야 하므로 인터페이스를 통한 일관된 메시지 요청에 대한 응답이 가능해진다면 객체가 변경되어도 충분히 유연해질 수 있다. 91 | - 다섯째, 객체가 수행하는 책임들이 자율적일수록 객체의 역할을 이해하기 쉬워진다. 92 | - 자율성을 보장하면 역할을 수행하는데 문제가 없을 것이므로 역시 의존성이 낮고 결합도가 강한 객체간의 협력이 가능해 지게 된다. 93 | -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter06.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 06 - object map 4 | 5 | ### Discussion 01 - 지도에서의 은유: 구조적으로 갈것이냐 기능적으로 갈것이냐 6 | 7 | 지도의 은유 8 | 길을 찾는 방법에서 길을 물어서 간다는 것은 기능적인 측면에서 방향을 잡음 => 매번 길을 물어가면서 나가야 함 9 | 지도를 보고 구조적으로 이해하고 문제를 해결해 나가는 방향을 잡음 => 이미 구조적으로 그려놨으므로 길을 찾는 방법은 각자의 몫 10 | 11 | 소프트웨어 개발에서 요구사항은 끊임없이 변하기 때문에 이에 대응하기 위해 객체지향적인 방법을 사용. 그런데 구조적이라고 하는 것이 크게 이해가 되지 않는다. 왜냐하면 구조적인 프로그래밍 하면 객체지향 보다는 함수 지향적 프로그래밍이 먼저 떠오르기 때문. 12 | 객체지향을 이해하는데 안정적인 구조로 객체지향적인 설계를 한다고 하면 어떤 느낌이 드는지 얘기해보기. 13 | 14 | ### Discussion 02 - 요구사항의 변경 15 | 16 | 너무 멋진 말이고 진리에 가깝다고 느껴지는 부분의 인용 17 | 18 | > 소프트웨어 분야에서 예외가 없는 유일한 규칙은 요구사항이 항상 변경된다는 것이다. 19 | 20 | 프로젝트를 진행하면서 변경되는 요구사항으로 인해 겪었던 얘기 잠깐 해보기 21 | 22 | ### Discussion 03 - 계속되는 기능과 구조의 이야기 23 | 24 | 도메인 모델과 유스케이스 모델 <-> 구조와 기능 25 | 이것도 설계 이야기이므로 큰 범주 안에서는 설계에 관련된 이야기라고 볼 수 있다. 26 | 27 | 구조를 잡기 위한 도메인 모델의 이해, 이걸 보고 객체지향의 객체로 생각하기에는 은행 정기예금의 도메인 모델은 너무 좋은 예제를 가져다 놓은 것 같다. 28 | 29 | 다른 도메인 모델의 구조를 생각해 보고 그걸 객체지향 설계에서의 객체로 한번 생각해보면, 저자가 주장하는 범용적으로 만족시킬 수 있는 거의 유일한 모델링 패러다임인지 아닌지 논의해볼 수 있을 듯. 30 | 31 | 마침 스타크래프트 게임에 대한 OOP를 적용해 보고 있으므로 얘기해 보면 좋을 듯. 32 | 33 | ### Discussion 04 - 유스케이스의 함정 34 | 35 | 사용자 관점에서의 시스템 사용 목표를 표현함. 36 | 37 | 이게 설계 기법도 아니고 객체지향적인 방법도 아니라면 알아야 할 이유는? 38 | 책에서는 영감을 불러일으킬 수 있는 약간의 힌트가 들어있기 때문이라고 하는데, 그에 비해 유스케이스에 대한 설명은 너무 자세하게 해놨음. 39 | 40 | 기능과 구조를 각각 설명하면서 통합 얘기를 할 때 유스케이스가 양념 처럼 들어가면 좋다는 걸 염두해 두고 언급한게 아닌가 싶음. 41 | 42 | ### Discussion 05 - 가역성(reversibility)에 대해 43 | 44 | 이자 계산 기능을 변경하면서 이자율을 단리, 복리로 나누고 이것을 추상 클래스로 만들었는데 여기까지는 충분히 예상해볼만한 모델링이다. 45 | 46 | 그런데 가역성이라는 단어에 대한 이해를 하려면 설계 부분이 아니라 코드의 수정으로 인해 모델의 수정이 되고 이런 매끄러운 흐름을 가역성이라고 설명하고 있다. 47 | 48 | 사실 이런 일은 구현에 집중하고 있는 우리에게는 너무 빈번하게 일어나는 일인데, 이런 코드의 변경으로 인해 모델 혹은 설계 부분을 수정을 해서 가역성에 대한 내용을 반영해 본 적이 있는지 얘기해 볼 필요가 있음. 49 | 50 | 보통 처음 대충 설계한대로 코딩하다가 코딩이 어느 정도 진전이 있으면 그대로 계속 구현을 해 나가는데, 이때가 되면 이미 설계와 구현의 불일치성은 안드로메다로 향해 가기 때문에, 저자가 언급한 가역성에 대한 말을 실천해 봤으면 좋겠다는 생각도 든다. -------------------------------------------------------------------------------- /Booktalk/TheEssenseOfObjectOrientation/jongfeel/chapter07.md: -------------------------------------------------------------------------------- 1 | # 객체지향의 사실과 오해 (The Essense of Object-Orientation) Discussions 2 | 3 | ## Chapter 07 - 함께 모으기 4 | 5 | ### Discussion 01 - Perspective 6 | 7 | Conceptual, Specification, Implementation 등 관점에 따라 객체지향 설계를 진행 할 때 다양한 측면을 검토할 수 있게 된다. 8 | 9 | 뭔가 이런 식으로 생각해 본 적은 없지만, 그래도 책에 설명된 것에 맞춰서 다시 얘기해 보자면 10 | 개념 => 도메인 모델과 유사 11 | 명세 => 인터페이스에 대한 정의 12 | 구현 => 실제 수행하는 메소드와 속성에 대한 코딩 13 | 14 | 요렇게 보고 싶다. 15 | 16 | 이걸 순서대로 해야 한다는 건 아니지만, 주로 구현 관점에서만 공부하고 실제 일할 때도 그렇게 하므로 17 | 도메인 모델에 해당하는 개념 관점에 대한 이해도를 조금 더 높여야 할 필요가 있고 18 | 그에 따라 자연스러운 객체간의 협력이 진행될 수 있는 인터페이스를 설계해 나가는게 좋다고 생각한다. 19 | 20 | ### Discussion 02 - 커피 전문점 예제 21 | 22 | 책 처음에 언급했던 커피 공화국의 아침을 실제 도메인 모델을 통해 구현하는 부분을 다룬다. 23 | 24 | 다시 생각해 보면 이런 걸 보고 객체지향을 생각한다는 건 정말이지 대단한 일이 아닌가 싶기도 하다. 25 | 왜냐하면 이렇게 책으로 읽어 나가는 건 자연스럽지만, 이걸 생각해서 만들어낸 사람은 도대체 어떤 수준의 관찰력이 필요한지 가늠이 되지 않는다. 26 | 게다가 과하지 않게 설명도 그림과 함께 너무 직관적으로 잘 되어 있다. 27 | 28 | ### Discussion 03 - 구현 과정에 대한 리뷰1 29 | 30 | 드디어 200 페이지가 넘는 책을 읽어 나가면서 처음 코드가 나와서 신나겠지만 31 | 다시 잘 살펴보면 이 챕터의 설계와 구현 과정의 예제는 우리가 그토록 몰랐던 소프트웨어 공학과 그렇게 욕을 해댔던 폭포수 모델 개발 방식의 정석을 따르고 있다. 32 | 즉, 객체지향을 얘기하고 있지만 원래 소프트웨어 개발에서 해야 하는 요구사항 분석 내용이 있으며 33 | 설계 부분에서도 인터페이스 설계, 인터페이스를 통한 협력 즉 메시지 전달과 얻어야 하는 결과가 너무 충실하게 잘 만들어져 있다. 34 | 중요한건 인터페이스를 모두 정의하기 전에 코드가 나오지 않았다는 것이다. 35 | 소프트웨어 공학적인 측면에서 봐도 매우 흡족한 구성이다. 36 | 37 | ### Discussion 04 - 구현 과정에 대한 리뷰1 38 | 39 | 여기서! 40 | 우리는 한번 더 생각해야 할 필요가 있다. 41 | 코드를 작성하기 전 얼마나 개념적인 걸 생각해 봤고, 요구사항을 이해하고 있으며, 객체가 뭐가 나올 것이고, 어떤 인터페이스를 통해 데이터가 흘러 갈 것인지를. 42 | 그리고 막상 코드를 보면 별거 없다고 생각할 수 있는데, 그 코드를 짜고 못짜고가 중요한게 아님을 기억해야 할 것이다. 43 | 44 | ### Discussion 05 - 참고 부분에 대한 인용, 그리고 동감하는 부분 45 | 46 | > 구현하지 않고 머릿속으로만 구상한 설계는 코드로 구현하는 단계에서 대부분 변경된다. ... 47 | > ... 너무 오랜 시간을 쏟지 말고 최대한 빨리 코드를 구현해서 설계에 이상이 없는지, 설계가 구현 가능한지를 판단해야 한다. ... 48 | 49 | 이럴거면 설계를 왜 하나 싶겠지만, 책의 맥락을 잘 이해해야 한다. 50 | 어차피 변경될 설계 하지 말자는 뜻이 아니라, 그나마 구체적으로 설계가 되지 않고 대충 한 설계는 코드가 작성되면서 변경이 많이 일어난다는 뜻이다. 51 | 실제 책 예제는 인터페이스의 변경 정도였고 클래스나 메소드 이름의 변경 까지는 아니었다. 52 | 53 | 즉 동감하는 부분은 `설계를 잘 하자`가 아니라 `설계를 해야한다`이다. 그리고 구현하는 과정에서 변경이 일어나면 `설계를 변경해야 한다`가 정답에 가깝다고 본다. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Feel's software development mentoring 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OnlineSelfCodingGroup 2 | 3 | Online coding and study group at every saturday at 10:30 🕥 am. 4 | 5 | Join link: [Google meet](https://meet.google.com/jyx-mxnq-kpk) 6 | 7 | ## Inspired at GDG relay online mogagko(모각코) 8 | 9 | [GDG Online 모각코](https://sites.google.com/view/code-with-gdgkr/home) 10 | 11 | 모각코는 "모여서 각자 코딩"의 줄임말입니다. 12 | 13 | ## Motivation 14 | 15 | 2020년 9월 GDG 온라인 모각코를 몇 차례 참여하고 난 후에 여러가지 생각을 하게 됐습니다. 16 | 17 | - 역시 계획적인 시간 보내기는 뿌듯하다. 18 | - 언젠가 해야 하는 것들에 대한 자신의 게으름을 탓하지 않게 된다. 19 | - 내 멘토링의 철학인 시간 계획 + 목표 + 수행 + 결과 정리와 크게 다르지 않다. 20 | 21 | 그래서 저도 온라인 모각코 모임을 만들어 보게 되었습니다. 22 | 23 | ## Overview 24 | 25 | 매주 토요일 오전 10시 30분에서 12시 30분 까지 2시간 집중해서 오전에 공부를 하는 모임입니다. 26 | 공부를 해도 좋고 코딩을 해도 좋고 뭘 해도 좋습니다. 다만 회사일이나 개인적으로 마감 때문에 급하게 처리해야 하는 일은 최대한 자제해 주시면 좋겠습니다. 27 | 28 | 그런데 일로 하는건 둘째 치고 아무것도 안하는 것 보다 계획된 시간에 뭔가 한다는게 중요합니다. 그래서 이 모임이 의미가 있다고 생각하고 있습니다. 29 | 30 | ## Features 31 | 32 | - 참여는 자율입니다. 즉, 하기로 했는데 안와도 상관 없고, 아무 얘기도 안했는데 토요일 오전 10시 30분에 들어오셔도 상관 없습니다. 33 | - 아무 얘기도 안하고 들어왔을 경우라고 해도 아래 process에 대한 룰은 지켜야 합니다. 34 | - "XX 때문에 못와서 죄송합니다.", "다음에 꼭 참여할께요" 등 불필요한 변명은 안해도 됩니다. 자율 모임이라 누가 오던 안오던 상관 없는 모임입니다. 각자 알아서 하는 모임이니까요. 35 | 36 | ## 2025 2Q meetup list 37 | 38 | - [236th, 2025-05-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/447), will be open 39 | - [235th, 2025-05-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/444), joined 4 40 | - [234th, 2025-05-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/443), joined 4 41 | - [233th, 2025-05-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/441), joined 2 42 | - [232th, 2025-04-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/440), joined 3 43 | - [231th, 2025-04-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/439), joined 2 44 | - [230th, 2025-04-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/437), joined 6 45 | - [229th, 2025-04-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/435), joined 4 46 | 47 | ## 2025 1Q meetup list 48 | 49 | - [228th, 2025-03-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/432), joined 5 50 | - [227th, 2025-03-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/431), joined 4 51 | - [226th, 2025-03-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/429), joined 3 52 | - [225th, 2025-03-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/426), joined 4 53 | - [224th, 2025-03-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/425), joined 5 54 | - [223th, 2025-02-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/423), joined 5 55 | - [222th, 2025-02-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/418), joined 3 56 | - [221th, 2025-02-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/417), joined 5 57 | - [220th, 2025-02-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/416), joined 4 58 | - [219th, 2025-01-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/415), joined 6 59 | - [218th, 2025-01-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/409), joined 4 60 | - [217th, 2025-01-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/408), joined 7 61 | - [216th, 2025-01-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/407), joined 7 62 | 63 |
64 | Online meet up history 65 |

66 | 67 |

68 | 2024년 4Q 69 |

70 | 71 | - [215th, 2024-12-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/406), joined 5 72 | - [214th, 2024-12-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/405), joined 4 73 | - [213th, 2024-12-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/400), joined 2 74 | - [212th, 2024-12-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/399), joined 3 75 | - [211th, 2024-11-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/397), joined 5 76 | - [210th, 2024-11-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/395), joined 4 77 | - [209th, 2024-11-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/393), joined 4 78 | - [208th, 2024-11-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/391), joined 4 79 | - [207th, 2024-11-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/389), joined 2 80 | - [206th, 2024-10-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/386), joined 3 81 | - [205th, 2024-10-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/383), joined 3 82 | - [204th, 2024-10-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/382), joined 6 83 | - [203th, 2024-10-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/380), joined 6 84 | 85 |

86 |
87 | 88 |
89 | 2024년 3Q 90 |

91 | 92 | - [202th, 2024-09-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/379), joined 6 93 | - [201th, 2024-09-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/377), joined 6 94 | - [200th, 2024-09-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/375), joined 6 95 | - [199th, 2024-09-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/372), joined 4 96 | - [198th, 2024-08-31](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/371), joined 5 97 | - [197th, 2024-08-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/369), joined 5 98 | - [196th, 2024-08-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/367), joined 5 99 | - [195th, 2024-08-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/364), joined 5 100 | - [194th, 2024-08-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/362), joined 5 101 | - [193th, 2024-07-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/359), joined 5 102 | - [192th, 2024-07-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/358), joined 4 103 | - [191th, 2024-07-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/356), joined 5 104 | - [190th, 2024-07-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/354), joined 4 105 | 106 |

107 |
108 | 109 |
110 | 2024년 2Q 111 |

112 | 113 | - [189th, 2024-06-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/352), joined 4 114 | - [188th, 2024-06-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/349), joined 4 115 | - [187th, 2024-06-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/348), joined 6 116 | - [186th, 2024-06-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/346), joined 4 117 | - [185th, 2024-06-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/344), joined 5 118 | - [184th, 2024-05-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/342), joined 4 119 | - [183th, 2024-05-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/340), joined 5 120 | - [182th, 2024-05-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/338), joined 5 121 | - [181th, 2024-05-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/336), joined 7 122 | - [180th, 2024-04-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/334), joined 3 123 | - [179th, 2024-04-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/332), joined 6 124 | - [178th, 2024-04-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/330), joined 5 125 | - [177th, 2024-04-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/328), joined 6 126 | 127 |

128 |
129 | 130 |
131 | 2024년 1Q 132 |

133 | 134 | - [176th, 2024-03-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/326), joined 6 135 | - [175th, 2024-03-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/324), joined 7 136 | - [174th, 2024-03-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/321), joined 6 137 | - [173th, 2024-03-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/320), joined 5 138 | - [172th, 2024-03-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/315), joined 4 139 | - [171th, 2024-02-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/314), joined 4 140 | - [170th, 2024-02-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/313), joined 7 141 | - [169th, 2024-02-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/311), joined 5 142 | - [168th, 2024-02-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/309), joined 5 143 | - [167th, 2024-01-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/307), joined 6 144 | - [166th, 2024-01-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/305), joined 6 145 | - [165th, 2024-01-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/303), joined 5 146 | - [164th, 2024-01-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/301), joined 7 147 | 148 |

149 |
150 | 151 |
152 | 2023년 4Q 153 |

154 | 155 | - [163th, 2023-12-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/299), joined 3 156 | - [162th, 2023-12-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/297), joined 4 157 | - [161th, 2023-12-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/295), joined 2 158 | - [160th, 2023-12-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/293), joined 6 159 | - [159th, 2023-12-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/291), joined 5 160 | - [158th, 2023-11-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/288), joined 5 161 | - [157th, 2023-11-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/287), joined 5 162 | - [156th, 2023-11-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/285), joined 5 163 | - [155th, 2023-11-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/283), joined 4 164 | - [154th, 2023-10-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/281), joined 7 165 | - [153th, 2023-10-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/279), joined 5 166 | - [152th, 2023-10-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/277), joined 6 167 | - [151th, 2023-10-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/274), joined 2 168 | 169 |

170 |
171 | 172 |
173 | 2023년 3Q 174 |

175 | 176 | - [150th, 2023-09-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/272), joined 6 177 | - [149th, 2023-09-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/270), joined 4 178 | - [148th, 2023-09-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/268), joined 7 179 | - [147th, 2023-09-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/266), joined 7 180 | - [146th, 2023-09-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/264), joined 7 181 | - [145th, 2023-08-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/262), joined 8 182 | - [144th, 2023-08-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/260), joined 6 183 | - [143th, 2023-08-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/258), joined 4 184 | - [142th, 2023-08-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/256), joined 6 185 | - [141th, 2023-07-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/253), joined 5 186 | - [140th, 2023-07-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/252), joined 4 187 | - [139th, 2023-07-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/250), joined 3 188 | - [138th, 2023-07-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/248), joined 5 189 | - [137th, 2023-07-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/246), joined 6 190 | 191 |

192 |
193 | 194 |
195 | 2023년 2Q 196 |

197 | 198 | - [136th, 2023-06-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/243), joined 6 199 | - [135th, 2023-06-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/242), joined 2 200 | - [134th, 2023-06-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/239), joined 3 201 | - [133th, 2023-06-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/238), joined 5 202 | - [132th, 2023-05-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/236), joined 5 203 | - [131th, 2023-05-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/234), joined 6 204 | - [130th, 2023-05-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/232), joined 4 205 | - [129th, 2023-05-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/230), joined 6 206 | - [128th, 2023-04-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/228), joined 5 207 | - [127th, 2023-04-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/224), joined 5 208 | - [126th, 2023-04-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/223), joined 3 209 | - [125th, 2023-04-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/221), joined 3 210 | - [124th, 2023-04-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/219), joined 3 211 | 212 |

213 |
214 | 215 |
216 | 2023년 1Q 217 |

218 | 219 | - [123th, 2023-03-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/217), joined 6 220 | - [122th, 2023-03-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/215), joined 3 221 | - [121th, 2023-03-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/213), joined 3 222 | - [120th, 2023-03-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/211), joined 5 223 | - [119th, 2023-02-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/209), joined 5 224 | - [118th, 2023-02-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/207), joined 5 225 | - [117th, 2023-02-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/205), joined 5 226 | - [116th, 2023-02-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/203), joined 5 227 | - [115th, 2023-01-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/201), joined 6 228 | - [114th, 2023-01-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/199), joined 5 229 | - [113th, 2023-01-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/197), joined 8 230 | - [112th, 2023-01-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/195), joined 7 231 | 232 |

233 |
234 | 235 |
236 | 2022년 4Q 237 |

238 | 239 | - [111th, 2022-12-31](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/193), joined 5 240 | - [110th, 2022-12-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/191), joined 4 241 | - [109th, 2022-12-17 with home coming day 2022](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/189), joined 4 242 | - [108th, 2022-12-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/187), joined 4 243 | - [107th, 2022-12-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/185), joined 6 244 | - [106th, 2022-11-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/183), joined 5 245 | - [105th, 2022-11-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/180), joined 4 246 | - [104th, 2022-11-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/179), joined 3 247 | - [103th, 2022-11-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/177), joined 5 248 | - [102th, 2022-10-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/171), joined 4 249 | - [101th, 2022-10-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/170), joined 3 250 | - [100th, 2022-10-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/169), joined 5 251 | - [99th, 2022-10-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/167), joined 4 252 | - [98th, 2022-10-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/166), joined 2 253 | 254 |

255 |
256 | 257 |
258 | 2022년 3Q 259 |

260 | 261 | - [97th, 2022-09-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/161), joined 4 262 | - [96th, 2022-09-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/160), joined 2 263 | - [95th, 2022-09-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/158), joined 2 264 | - [94th, 2022-09-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/156), joined 2 265 | - [93th, 2022-08-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/155), joined 2 266 | - [92th, 2022-08-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/153), joined 4 267 | - [91th, 2022-08-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/150), joined 3 268 | - [90th, 2022-08-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/149), joined 4 269 | - [89th, 2022-07-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/148), joined 3 270 | - [88th, 2022-07-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/145), joined 3 271 | - [87th, 2022-07-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/144), joined 3 272 | - [86th, 2022-07-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/142), joined 2 273 | - [85th, 2022-07-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/140), joined 4 274 | 275 |

276 |
277 | 278 |
279 | 2022년 2Q 280 |

281 | 282 | - [84th, 2022-06-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/138), joined 3 283 | - [83th, 2022-06-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/136), joined 3 284 | - [82th, 2022-06-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/134), joined 3 285 | - [81th, 2022-06-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/132), joined 3 286 | - [80th, 2022-05-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/130), joined 2 287 | - [79th, 2022-05-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/128), joined 2 288 | - [78th, 2022-05-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/126), joined 4 289 | - [77th, 2022-05-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/124), joined 3 290 | - [76th, 2022-04-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/122), joined 4 291 | - [75th, 2022-04-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/120), joined 3 292 | - [74th, 2022-04-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/116), joined 4 293 | - [73th, 2022-04-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/114), joined 6 294 | - [72th, 2022-04-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/112), joined 2 295 | 296 |

297 |
298 | 299 |
300 | 2022년 1Q 301 |

302 | 303 | - [71th, 2022-03-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/110), joined 5 304 | - [70th, 2022-03-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/108), joined 5 305 | - [69th, 2022-03-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/107), joined 1 306 | - [68th, 2022-03-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/106), joined 3 307 | - [67th, 2022-02-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/105), joined 3 308 | - [66th, 2022-02-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/104), joined 6 309 | - [65th, 2022-02-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/103), joined 5 310 | - [64th, 2022-02-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/102), joined 7 311 | - [63th, 2022-01-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/101), joined 5 312 | - [62th, 2022-01-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/100), joined 5 313 | - [61th, 2022-01-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/99), joined 5 314 | - [60th, 2022-01-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/98), joined 4 315 | - [59th, 2022-01-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/97), joined 3 316 | 317 |

318 |
319 | 320 |
321 | 2021년 4Q 322 |

323 | 324 | - [58th, 2021-12-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/96), nobody 325 | - [57th, 2021-12-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/95), joined 4 326 | - [56th, 2021-12-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/94), 2명 참가 327 | - [55th, 2021-12-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/93), 2명 참가 328 | - [54th, 2021-11-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/92), 3명 참가 329 | - [53th, 2021-11-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/91), 4명 참가 330 | - [52th, 2021-11-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/90), 2명 참가 331 | - [51th, 2021-11-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/89), 3명 참가 332 | - [50th, 2021-10-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/88), 2명 참가 333 | - [49th, 2021-10-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/86), 3명 참가 334 | - [48th, 2021-10-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/85), 2명 참가 335 | - [47th, 2021-10-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/84), 4명 참가 336 | - [46th, 2021-10-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/83), 6명 참가 337 | 338 |

339 |
340 | 341 |
342 | 2021년 3Q 343 |

344 | 345 | - [45th, 2021-09-25](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/81), 2명 참가 346 | - [44th, 2021-09-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/80), 3명 참가 347 | - [43th, 2021-09-11](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/79), 4명 참가 348 | - [42th, 2021-09-04](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/78), 6명 참가 349 | - [41th, 2021-08-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/77), 3명 참가 350 | - [40th, 2021-08-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/76), 7명 참가 351 | - [39th, 2021-08-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/75), 8명 참가 352 | - [38th, 2021-08-07](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/74), 6명 참가 353 | - [37th, 2021-07-31](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/73), 8명 참가 354 | - [36th, 2021-07-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/72), 4명 참가 355 | - [35th, 2021-07-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/71), 3명 참가 356 | - [34th, 2021-07-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/70), 3명 참가 357 | - [33th, 2021-07-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/69), 3명 참가 358 | 359 |

360 |
361 | 362 |
363 | 2021년 2Q 364 |

365 | 366 | - [32th, 2021-06-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/68), 4명 참가 367 | - [31th, 2021-06-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/67), 4명 참가 368 | - [30th, 2021-06-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/66), 3명 참가 369 | - [29th, 2021-06-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/64), 5명 참가 370 | - [28th, 2021-05-29](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/63), 3명 참가 371 | - [27th, 2021-05-22](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/62), 4명 참가 372 | - [26th, 2021-05-15](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/61), 2명 참가 373 | - [25th, 2021-05-08](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/60), 3명 참가 374 | - [24th, 2021-05-01](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/59), 2명 참가 375 | - [23th, 2021-04-24](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/58), 4명 참가 376 | - [22th, 2021-04-17](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/57), 3명 참가 377 | - [21th, 2021-04-10](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/56), 4명 참가 378 | - [20th, 2021-04-03](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/47), 4명 참가 379 | 380 |

381 |
382 | 383 |
384 | 2021년 1Q 385 |

386 | 387 | - [19th, 2021-03-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/46), 4명 참가 388 | - [18th, 2021-03-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/41), 3명 참가 389 | - [17th, 2021-03-13](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/38), 3명 참가 390 | - [16th, 2021-03-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/32), 4명 참가 391 | - [15th, 2021-02-27](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/26), 4명 참가 392 | - [14th, 2021-02-20](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/23), 6명 참가 393 | - [13th, 2021-02-06](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/21), 3명 참가 394 | - [12th, 2021-01-30](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/20), 4명 참가 395 | - [11th, 2021-01-23](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/19), 3명 참가 396 | - [10th, 2021-01-16](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/18), 6명 참가 397 | - [9th, 2021-01-09](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/17), 4명 참가 398 | - [8th, 2021-01-02](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/15), 5명 참가 399 | 400 |

401 |
402 | 403 |
404 | 2020년 4Q 405 |

406 | 407 | - [7th, 2020-12-26](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/12), 4명 참가 408 | - [6th ,2020-12-19](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/11), 5명 참가 409 | - [5th, 2020-12-12](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/8), 3명 참가 410 | - [4th, 2020-12-05](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/7), 6명 참가 411 | - [3rd, 2020-11-28](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/5), 7명 참가 412 | - [2nd, 2020-11-21](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/3), 4명 참가 413 | - [1st, 2020-11-14](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/1), 5명 참가 414 | 415 |

416 |
417 | 418 |

419 |
420 | 421 | ## Ranking 422 | 423 | ### Ranking 2025, 216th to 267th 424 | 425 | Top 2, 3, 4 ranked winner get prize from home coming day 2025 426 | and participate more than 30 online meetup, get the chicken gifticon. 427 | 428 | |Ranking|Name|Count| 429 | |-------|----|-----| 430 | |1|[Kim Jong Feel](https://github.com/jongfeel/)|20| 431 | |2|[최지윤](https://github.com/chichoon/)|19| 432 | |3|[hyuncho](https://github.com/aquamagic9)|14| 433 | |4|[junmokang](https://github.com/moaoh)|12| 434 | |5|[Yeshin Lee](https://github.com/yeslee-v/)|10| 435 | |6|[Byeongguk Ahn](https://github.com/nonoaa/)|5| 436 | |7|[Jeongan Lee](https://github.com/fkdl0048/)|3| 437 | |8|[TaeWon](https://github.com/ytw9699/)|2| 438 | |9|[Park ChulHwan](https://github.com/Chul-Hwan)|1| 439 | |10|[Jaewoo Park](https://github.com/ohdair/)|1| 440 | 441 | ### All from first to present 442 | 443 | |Ranking|Name|Count| 444 | |-------|----|-----| 445 | |1|[jongfeel](https://github.com/jongfeel/)|232| 446 | |2|[최지윤](https://github.com/chichoon)|153| 447 | |3|[yeslee-v](https://github.com/yeslee-v/)|82| 448 | |4|[Jeongan Lee](https://github.com/fkdl0048/)|51| 449 | |5|[TaeWon](https://github.com/ytw9699/)|39| 450 | |6|[Joseph-Cha](https://github.com/Joseph-Cha/)|34| 451 | |7|[hyuncho](https://github.com/aquamagic9/)|33| 452 | |8|[Byeongguk Ahn](https://github.com/nonoaa/)|31| 453 | |9|[hi-hyein](https://github.com/hi-hyein/)|30| 454 | |10|[Jaewoo Park](https://github.com/ohdair/)|24| 455 | |11|[YeongKwonMo](https://github.com/momoci99/)|23| 456 | |12|[eunyeong-so](https://github.com/eunyeong-so/)|21| 457 | |13|[JSY8869](https://github.com/JSY8869/)|21| 458 | |14|[wjrmffldrhrl](https://github.com/wjrmffldrhrl/)|20| 459 | |15|[exgs](https://github.com/exgs)|19| 460 | |16|[fora22](https://github.com/fora22/)|19| 461 | |17|[TaeHyoungKwon](https://github.com/TaeHyoungKwon/)|17| 462 | |18|[soo:bak](https://github.com/soo-bak)|15| 463 | |19|[yoonucho](https://github.com/yoonucho/)|14| 464 | |20|[wisdom08](https://github.com/wisdom08/)|14| 465 | |21|[junmokang](https://github.com/moaoh)|13| 466 | |22|[hyunhye](https://github.com/zoepark21/)|12| 467 | |23|[Jiyun Yun](https://github.com/jeeyn)|12| 468 | |24|[ShimWooJeong](https://github.com/ShimWooJeong/)|11| 469 | |25|[ErigoLee](https://github.com/ErigoLee/)|11| 470 | |26|[ellen310](https://github.com/ellen310/)|11| 471 | |27|[Arat5724](https://github.com/Arat5724/)|8| 472 | |28|[IWON LEE](https://github.com/walnutpie314/)|5| 473 | |29|[진태영](https://github.com/jintaeyeong)|4| 474 | |30|[kimpitang](https://github.com/kimpitang/)|3| 475 | |31|[kiJiyeon](https://github.com/kiJiyeon/)|3| 476 | |32|[seoyoungit](https://github.com/seoyoungit/)|3| 477 | |33|[park7628](https://github.com/park7628/)|3| 478 | |34|[김지수](https://github.com/tttghost)|2| 479 | |35|[Park ChulHwan](https://github.com/Chul-Hwan)|2| 480 | |36|[kapitalismho](https://github.com/kapitalismho/)|2| 481 | |37|[yiy829](https://github.com/yiy829/)|2| 482 | |38|[yonii2](https://github.com/yonii2/)|2| 483 | |39|[mhjoon99](https://github.com/mhjoon99/)|1| 484 | |40|[CokeLee777](https://github.com/CokeLee777/)|1| 485 | |41|[zoops](https://github.com/zoops/)|1| 486 | |42|[silqwer](https://github.com/silqwer)|1| 487 | |43|[Nayun Kwak](https://github.com/nayunz/)|1| 488 | |44|[jhjgenius](https://github.com/jhjgenius/)|1| 489 | |45|[eunbbin](https://github.com/eunbbin/)|1| 490 | |46|[SooimChoi](https://github.com/leechoiswim1/)|1| 491 | |47|[cyhcyh100](https://github.com/cyhcyh100/)|1| 492 | |48|[3Cat-jaguar](https://github.com/3Cat-jaguar)|1| 493 | 494 | ### Ranking history 495 | 496 |
497 | 2024, 164th to 215th 498 |

499 | 500 | Top 2, 3, 4 ranked winner get prize from home coming day 2024 501 | 1. 최지윤 get prize starbucks e-gift set item. 502 | 2. Yeshin Lee get prize starbucks e-gift set item. 503 | 3. TaeWon get prize starbucks e-gift beverage item. 504 | 505 | Joined count over 30 from home coming day 2024 506 | 1. 최지윤 joined count is 45, then get prize BBQ chicken set item. 507 | 2. Yeshin Lee joined count is 39, then get prize BBQ chicken set item. 508 | 509 | |Ranking|Name|Count| 510 | |-------|----|-----| 511 | |1|[Kim Jong Feel](https://github.com/jongfeel/)|52| 512 | |2|[최지윤](https://github.com/chichoon/)|45| 513 | |3|[Yeshin Lee](https://github.com/yeslee-v/)|39| 514 | |4|[TaeWon](https://github.com/ytw9699/)|25| 515 | |5|[Jeongan Lee](https://github.com/fkdl0048/)|18| 516 | |6|[Byeongguk Ahn](https://github.com/nonoaa/)|18| 517 | |7|[hyuncho](https://github.com/aquamagic9)|16| 518 | |8|[Jaewoo Park](https://github.com/ohdair/)|12| 519 | |9|[Jiyun Yun](https://github.com/jeeyn)|10| 520 | |10|[YeongKwonMo](https://github.com/momoci99/)|8| 521 | |11|[진태영](https://github.com/jintaeyeong)|4| 522 | |12|[soo:bak](https://github.com/soo-bak)|2| 523 | |13|[김지수](https://github.com/tttghost)|2| 524 | |14|[Park ChulHwan](https://github.com/Chul-Hwan)|1| 525 | |15|[junmokang](https://github.com/moaoh)|1| 526 | 527 |

528 |
529 | 530 |
531 | 2023, 112th to 163th 532 |

533 | 534 | Top 2, 3, 4 ranked winner get prize from home coming day 2023 535 | 1. Ji Yoon Choi get prize chicken gifticon item. 536 | 2. Jeongan Lee get prize starbucks e-gift set item. 537 | 3. yeslee-v get prize starbucks e-gift beverage item. 538 | 539 | |Ranking|Name|Count| 540 | |-------|----|-----| 541 | |1|[Kim Jong Feel](https://github.com/jongfeel/)|52| 542 | |2|[Ji Yoon Choi](https://github.com/chichoon/)|49| 543 | |3|[yeslee-v](https://github.com/yeslee-v/)|25| 544 | |4|[Jeongan Lee](https://github.com/fkdl0048/)|23| 545 | |5|[TaeHyoung Kwon](https://github.com/TaeHyoungKwon/)|16| 546 | |6|[YeongKwonMo](https://github.com/momoci99/)|15| 547 | |7|[hyunhye](https://github.com/zoepark21/)|12| 548 | |8|[ohdair](https://github.com/ohdair/)|10| 549 | |9|[TaeWon](https://github.com/ytw9699/)|8| 550 | |10|[Arat5724](https://github.com/Arat5724/)|8| 551 | |11|[Byeongguk Ahn](https://github.com/nonoaa/)|8| 552 | |12|[IWON LEE](https://github.com/walnutpie314/)|5| 553 | |13|[JSY8869](https://github.com/JSY8869/)|5| 554 | |14|[soo:bak](https://github.com/soo-bak/)|4| 555 | |15|[park7628](https://github.com/park7628/)|3| 556 | |16|[yonii2](https://github.com/yonii2/)|2| 557 | |17|[Jiyun Yun](https://github.com/jeeyn)|2| 558 | |18|[Byun Jihye](https://github.com/wisdom08/)|1| 559 | |19|[silqwer](https://github.com/silqwer/)|1| 560 | |20|[Nayun Kwak](https://github.com/nayunz/)|1| 561 | |21|[jhjgenius](https://github.com/jhjgenius/)|1| 562 | |22|[eunbbin](https://github.com/eunbbin/)|1| 563 | |23|[SooimChoi](https://github.com/leechoiswim1/)|1| 564 | |24|[cyhcyh100](https://github.com/cyhcyh100/)|1| 565 | |25|[3Cat-jaguar](https://github.com/3Cat-jaguar)|1| 566 | 567 |

568 |
569 | 570 |
571 | 2022, 59th to 111th 572 |

573 | 574 | chichoon get prize chicken gifticon item. 575 | exgs, wisdom08 get prize starbucks e-gift item. 576 | 577 | |Ranking|Name|Count| 578 | |-------|----|-----| 579 | |1|[jongfeel](https://github.com/jongfeel/)|53| 580 | |2|[chichoon](https://github.com/chichoon)|42| 581 | |3|[exgs](https://github.com/exgs)|19| 582 | |4|[wisdom08](https://github.com/wisdom08/)|13| 583 | |5|[soobak](https://github.com/soo-bak)|9| 584 | |6|[Joseph-Cha](https://github.com/Joseph-Cha/)|9| 585 | |7|[yeslee-v](https://github.com/yeslee-v/)|9| 586 | |8|[fkdl0048](https://github.com/fkdl0048/)|8| 587 | |9|[JSY8869](https://github.com/JSY8869/)|6| 588 | |10|[fora22](https://github.com/fora22/)|6| 589 | |11|[wjrmffldrhrl](https://github.com/wjrmffldrhrl/)|5| 590 | |12|[seoyoungit](https://github.com/seoyoungit/)|3| 591 | |13|[aquamagic9](https://github.com/aquamagic9/)|3| 592 | |14|[eunyeong-so](https://github.com/eunyeong-so/)|3| 593 | |15|[kapitalismho](https://github.com/kapitalismho/)|2| 594 | |16|[ellen310](https://github.com/ellen310/)|2| 595 | |17|[yiy829](https://github.com/yiy829/)|2| 596 | |18|[CokeLee777](https://github.com/CokeLee777/)|1| 597 | |19|[ohdair](https://github.com/ohdair/)|1| 598 | |20|[TaeHyoungKwon](https://github.com/TaeHyoungKwon/)|1| 599 | 600 |

601 |
602 | 603 |
604 | 2021, 1th to 58th 605 |

606 | 607 | hi-hyein, Joseph-Cha, eunyeong-so get prize starbucks e-gift item. 608 | 609 | |Ranking|Name|Count| 610 | |-------|----|-----| 611 | |1|[jongfeel](https://github.com/jongfeel/)|57| 612 | |2|[hi-hyein](https://github.com/hi-hyein/)|30| 613 | |3|[Joseph-Cha](https://github.com/Joseph-Cha/)|25| 614 | |4|[eunyeong-so](https://github.com/eunyeong-so/)|18| 615 | |5|[wjrmffldrhrl](https://github.com/wjrmffldrhrl/)|15| 616 | |6|[yoonucho](https://github.com/yoonucho/)|14| 617 | |7|[fora22](https://github.com/fora22/)|13| 618 | |8|[ShimWooJeong](https://github.com/ShimWooJeong/)|11| 619 | |9|[ErigoLee](https://github.com/ErigoLee/)|11| 620 | |10|[JSY8869](https://github.com/JSY8869/)|10| 621 | |11|[ellen310](https://github.com/ellen310/)|9| 622 | |12|[ytw9699](https://github.com/ytw9699/)|4| 623 | |13|[kimpitang](https://github.com/kimpitang/)|3| 624 | |14|[kiJiyeon](https://github.com/kiJiyeon/)|3| 625 | |15|[mhjoon99](https://github.com/mhjoon99/)|1| 626 | |16|[wisdom08](https://github.com/wisdom08/)|1| 627 | |17|[zoops](https://github.com/zoops/)|0| 628 | 629 |

630 |
631 | 632 | ## Known rewards 633 | 634 | - 보통 인맥 네트워킹이 가장 크고 635 | - 그 다음에 서로 관심이 없더라도 어쩌다가 알게되는 기술적인 교류 636 | - 더 발전하게 된다면 마음 맞는 사람들 끼리의 팀 프로젝트까지 발전 가능합니다. 637 | 638 | ## Special rewards 639 | 640 | - 2시간을 다 채우고 인증이 완료된 분에게 참석 스탬프 1장을 드립니다. 641 | - [추가 업데이트) 2021-10-18](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/86) 642 | - 참석 하신 분이 한 분 혹은 두 분 이라면 그 분에게는 스탬프를 2장 드립니다! 643 | - 스탬프 4장을 모으신 분은 저의 사비를 털어 스타벅스 아메리카노 쿠폰을 드립니다. 644 | - 기념이 될 만한 회차 ([10회](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/18), [50회](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/88), [100회](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/169) 등)에 참여하신 분은 쿠폰이 업그레이드 됩니다! 645 | - 인증 절차 646 | - 아래 모든 내용은 제가 확인하고 진행합니다. 647 | - 10시 30분 ~ 10시 40분 사이 입장, 각자 자기 소개 혹은 할 내용에 대해 소개 하신 분 648 | - 12시 30분 ~ 12시 40분 사이 꺼뒀던 마이크를 켜고 자유로운 대화에 참여하신 분 649 | - 이후 진행한 내용에 대한 링크를 시작하기 전 작성한 issue에 업데이트: 다음 모각코 전까지 확인되어야 함 650 | 651 | ## Process 652 | 653 | ### Before join 654 | 655 | - 참석 여부에 대한 표시를 위해 이번 주 모각코 issue글에 스스로 assignee에 자기 자신을 할당한다. 656 | - 이번 모각코에서 뭘 할지에 대한 목표를 간략하지만 명확하게 2시간 분량의 양이라는 걸 이해할 수 있도록 모각코 issue 글에 코멘트로 적는다. 657 | - 좋은예) 수학과 함께하는 A.I 기초 책 챕터 2-2 부분 읽고 예제 파일 2개 코딩하고 github에 올리기 658 | - 안좋은예) 수학과 함께하는 A.I 기초 책 읽고 공부하기 659 | 660 | ### Joined 661 | 662 | - 매주 토요일 오전 10시 30분에 아래 google meet 링크를 통해 접속 663 | - [Google meet](https://meet.google.com/jyx-mxnq-kpk) 664 | - 공부 진행중에는 마이크는 반드시 꺼야 함 665 | - 모인 사람들이 진행할 내용에 대한 얘기를 듣기 위해 스피커를 켜 둬야 함. 666 | - 간단히 자기가 진행할 공부 내용에 대한 소개 진행 667 | - 자기 소개 포함 668 | - 새로온 멤버가 없다면 자기소개는 넘어갈 수 있음 669 | - 각자 알아서 공부 진행 670 | 671 | ### Finish 672 | 673 | - 12시 30분 이후 10분 정도 발언 시간 진행 674 | - 각자 진행했던 내용에 대해 공유나 얘기하고 싶으신 분, 없으면 생략 가능 675 | - 다른 사람이 한 내용 대해 관심 있거나 물어보고 싶으신 분 질문/답변 시간, 없으면 생략 가능 676 | - 제가 TMI 여서 10분이 너무 빨리 지나갑니다. 어색할 틈이 없어요. 677 | - 2시간 동안 한 분량에 대해 이번주 모각코 issue 글에 추가 코멘트로 정리, 모각코가 끝난 12시 30분 이후에 해도 상관 없음. 678 | - 작업 내용이 자신의 개인 github이나 블로그 등 다른 곳에 있다면 그 부분에 대한 링크 첨부 679 | - 책읽기의 경우 페이지 분량 표시 680 | - 유튜브 강의 시청이면 어떤 영상을 봤는지 링크 첨부 등 681 | - 구글 검색하고 삽질한거 밖에 없다고 해도 어떤 걸 검색했는지와 유용하다고 생각한 검색 결과 링크 첨부 682 | - 최종 확인이 완료되면 [스탬프 현황 페이지](/Stamp/)에 스탬프 1장 발급해 드립니다. 683 | 684 | ## Remind 685 | 686 | - 매주 같은 시간에 안할 경우가 있으므로 그 때는 미리 issue를 통해 변경 시간 확인 687 | - github에서 참여가 확인되면 최대한 빨리 메일을 통해 구글 캘린더 일정에 추가해 드립니다 688 | - 참여 수락한 이후, 해당 시간에 참여할 때 저의 참여요청 승인을 받지 않아도 자유롭게 입장할 수 있습니다. 689 | - 2021-02-21 추가) 만약 제가 10시 5분 이후에도 참석하지 않으면 늦잠을 자고 있는 것이므로 여러분들끼리 긴급 google meet 링크를 생성 후 진행해 주시면 좋겠습니다. 690 | - 이미 [사고](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/issues/23) 사례가 있기 때문에 미리 죄송하다는 말씀 드립니다. 691 | 692 | ## Questions 693 | 694 | - [discussions](https://github.com/ThinkAboutSoftware/OnlineSelfCodingGroup/discussions)에 자유롭게 질문 695 | -------------------------------------------------------------------------------- /Stamp/Black Glazed Latte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Black Glazed Latte.jpg -------------------------------------------------------------------------------- /Stamp/BlackRiceLatte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/BlackRiceLatte.jpg -------------------------------------------------------------------------------- /Stamp/Double Espresso Cream Latte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Double Espresso Cream Latte.jpg -------------------------------------------------------------------------------- /Stamp/IceChouxCreamLatte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/IceChouxCreamLatte.jpg -------------------------------------------------------------------------------- /Stamp/Iced Brown Sugar Oat Shaken Espresso.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Iced Brown Sugar Oat Shaken Espresso.jpg -------------------------------------------------------------------------------- /Stamp/LavenderBlondeStarbucksDoubleShot.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/LavenderBlondeStarbucksDoubleShot.jpg -------------------------------------------------------------------------------- /Stamp/Mango Dragonfruit with Lemonade Starbucks Refreshers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Mango Dragonfruit with Lemonade Starbucks Refreshers.jpg -------------------------------------------------------------------------------- /Stamp/MugwortCreamFrappuccinoWithColdBrew.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/MugwortCreamFrappuccinoWithColdBrew.jpg -------------------------------------------------------------------------------- /Stamp/Raspberry Pop Shaken Tea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Raspberry Pop Shaken Tea.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks French Vanila Latte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks French Vanila Latte.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_New_Year_Citrus_Tea.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_New_Year_Citrus_Tea.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_Strawberry_Dream_Malcha_Latte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_Strawberry_Dream_Malcha_Latte.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_Vanilla_Cream_Cold_Brew.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_Vanilla_Cream_Cold_Brew.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_americano.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_americano.JPG -------------------------------------------------------------------------------- /Stamp/Starbucks_americano_e-Gift_Item.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_americano_e-Gift_Item.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_cafelatte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_cafelatte.png -------------------------------------------------------------------------------- /Stamp/Starbucks_cafemocha.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_cafemocha.png -------------------------------------------------------------------------------- /Stamp/Starbucks_giftitem_wants.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_giftitem_wants.JPG -------------------------------------------------------------------------------- /Stamp/Starbucks_iceamericano.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_iceamericano.png -------------------------------------------------------------------------------- /Stamp/Starbucks_icecafelatte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_icecafelatte.png -------------------------------------------------------------------------------- /Stamp/Starbucks_iceddolcelatte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_iceddolcelatte.png -------------------------------------------------------------------------------- /Stamp/Starbucks_tarro_latte.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_tarro_latte.jpg -------------------------------------------------------------------------------- /Stamp/Starbucks_two_americano_two_cake.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/Starbucks_two_americano_two_cake.jpg -------------------------------------------------------------------------------- /Stamp/ToffeeNutLatte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/ToffeeNutLatte.png -------------------------------------------------------------------------------- /Stamp/approved.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/approved.png -------------------------------------------------------------------------------- /Stamp/approved_1Q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/approved_1Q.png -------------------------------------------------------------------------------- /Stamp/approved_2021_2Q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/approved_2021_2Q.png -------------------------------------------------------------------------------- /Stamp/approved_2021_3Q.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/approved_2021_3Q.png -------------------------------------------------------------------------------- /Stamp/starbucks_dessert_set.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/starbucks_dessert_set.png -------------------------------------------------------------------------------- /Stamp/starbucks_iced_caramel_macchiato.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ThinkAboutSoftware/OnlineSelfCodingGroup/50fe24ac817b4cef32d39260a8055651e2509967/Stamp/starbucks_iced_caramel_macchiato.png --------------------------------------------------------------------------------