Programming/OOP 5

객체지향 생활 체조 원칙 9가지 정리!

최근에 우아한형제들에서 코드 리뷰를 객체지향 생활 체조 원칙를 기반으로 한다는 얘기를 처음 접했다. 객체지향 생활 체조 원칙에 대해 관심을 가지고 찾아봤고, 객체지향의 사실과 오해라는 책과 DDD 관련 책에서도 많이 언급하던 내용에 대한 가이드와 다른 좋은 개념도 많았다. 이번 포스팅에서는 객체지향 생활 체조 원칙에 대해서 작성한다. 객체지향 생활 체조 원칙 객체지향 생활 체조 원칙은 소트웍스 앤솔러지(ThoughtWorks Anthology) 라는 책에 나오는 원칙이다. 소트웍스 앤솔로지에서는 9가지 원칙을 준수하면서 객체지향을 추구할 수 있다고 한다. 한 메서드에 오직 한 단계의 들여쓰기(indent)만 한다. else 예약어를 쓰지 않는다. 모든 원시 값과 문자열을 포장한다. 일급 컬렉션을 쓴다. ..

Programming/OOP 2023.05.22

OOP - IS-A 관계, HAS-A 관계 차이 (상속)

IS-A 관계 (is a relationship) 상속 관계를 의미한다. 상속 관계에서는 '~은 ~이다.'가 성립한다. 아래의 예시에서 Student와 Person은 IS-A 관계가 성립한다. public class Student extends Person { private int studentId; } 여기서 Person은 추상화된 개념을 표현한 것이다. HAS-A 관계 (has a relationship) 포함 관계를 의미한다. 포함 관계는 '~은 ~를 가진다.`가 성립한다. 아래의 예시에서 Student와 Book은 HAS-A 관계가 성립한다. public class Student { private Book book; }

Programming/OOP 2022.08.08

OOP - 객체의 자율성 (+ 의존성, 결합도, 캡슐화, 응집도, 의인화)

예시. 티켓 판매 어플리케이션 시나리오: 소극장에서 이벤트를 통해 초대장을 분배하고 초대장이 있는 사람은 초대장을 티켓으로 교환한 후에 입장하고, 초대장이 없는 사람은 입장권을 구매한 뒤 입장한다. 구현한 클래스 다이어그램은 다음과 같다. 먼저 이벤트 당첨자에게 발송되는 초대장을 구현하는 것으로 시작하자. 초대장(Invitation)은 공연을 관람할 수 있는 초대일자(when)을 인스턴스 변수로 포함하는 간단한 클래스다. public class Invitation { private LocalDateTime when; } 공연을 관람하기 원하는 모든 사람은 티켓을 소지하고 있어야만 한다. Ticket 클래스를 추가하자. public class Ticket { private Long fee; public L..

Programming/OOP 2022.05.19

OOP - 객체지향이란 무엇인가?

객체지향 많은 분들이 객체지향 프로그래밍은 현실 세계의 모방, 추상화를 통해 프로그래밍에 반영하는 것이라고 말한다. 이러한 설명은 실용적인 관점에서 객체지향을 설명하기에 적합하지 않다. 가령 우리는 상속의 예시를 들 때 인간, 도형 등의 예시를 들고 추상화를 배울 때 동물, 타이어, 자동차 등의 예시를 들곤 한다. 이를 실제 소프트웨어에 접목할 수 있는가? 객체지향의 목표는 실세계를 모방하는 것이 아니다. 새로운 세계를 창조하는 것이다. 객체지향에서 가장 널리 퍼져있는 오해는 클래스가 객체지향 프로그래밍의 중심이라는 것이다. 객체지향은 객체를 지향하는 것이지 클래스를 지향하는 것이 아니다. 역할, 책임, 협력 객체지향이라는 말에서 어떤 단어가 먼저 떠오르는가? 많은 사람들은 클래스와 상속을 떠올린다. 하..

Programming/OOP 2022.05.16

직접 만든 예시로 보는 SOLID 원칙!

객체 지향 설계 5원칙 SOLID에 대해 알아보자. SRP: Single Responsibility Principle 단일 책임 원칙 Bad 아래 클래스가 있다. class UserData { String id; String username; } 그리고 아래와 같이 UserData 클래스를 무분별하게 사용한다. class UserController { UserData getUser() {} void postUser(UserData userData) {} } class UserService { UserData getUser() {} } 여기서 패스워드 변경 기능이 추가되면 UserData에 password 필드를 추가해야 한다. class UserData { String id; String username..

Programming/OOP 2022.04.25