객체지향처럼 생각하기
잘 정리된 References 블로그 글, 책 등이 많아서 읽어보면서 궁금한 점이나 배운 점을 정리하려고 한다.
Java | 객체 지향의 3가지 특징 - 캡슐화, 상속, 다형성
객체 지향 프로그래밍(Object Oriented Programming, OOP)은 각각의 기능들을 객체화(클래스화)시켜 메인함수에서는 객체화시킨 기능들을 호출해서 사용하는 프로그래밍 기법으로 캡슐화, 상속, 다형성의 특징을 가지고 있다.
캡슐화(Encapsulation)
→ 캡슐화란 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것을 말한다.
상속(Inheritance)
→ 자식 클래스가 부모(상위) 클래스의 모든 자원을 물려받는 것을 의미한다. 상속을 통해서 비효율적인 코드의 중복을 줄여주어 효율성을 올리고 개발 시간을 단축시키게 된다.
다형성(Polymorphism)
→ 다형성은 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질이다. 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현객체가 대입될 수 있다.
내용 출처 :
- 책 - 이것이 자바다. (신용권 - 한빛미디어)
- 지난 정리 내용 - 깃허브 summary.md file
GitHub - Moveuk/2021_Java: Learning about basic Java
Learning about basic Java. Contribute to Moveuk/2021_Java development by creating an account on GitHub.
github.com
생각하라, 객체지향처럼
1. 객체들을 분류하는 과정에서 동일한 상태와 동일한 행동을 가질 수 있는 객체는 같은 타입의 인스턴스로 분류할 수 있다.
- 이 때, 타입을 클래스로 이해하면 안된다.
클래스와 타입 사이의 차이는 꼭 이해해 두어야 합니다.
객체의 클래스는 그 객체가 어떻게 구현되느냐를 정의합니다.
클래스는 객체의 내부 상태와 그 객체의 연산에 대한 구현 방법을 정의합니다.
반면, 객체의 타입은 그 객체의 인터페이스, 즉 그 객체가 응답할 수 있는 요청의 집합을 정의합니다.
하나의 객체가 여러 타입을 가질 수 있고 서로 다른 클래스의 객체들이 동일한 타입을 가질 수 있습니다.
즉, 객체의 구현은 다를지라도 인터페이스는 같을 수 있다는 의미입니다.
— GoF의 디자인 패턴, p.46
→ 이해한 바를 풀어보자면 객체지향의 특징인 상속과 관련되어 타입은 캐스팅 될 수 있는 여러 객체들의 집합을 말한다고 이해한 것 같다. 그와 달리 클래스는 단순히 그 객체가 어떻게 구성이 되어있는가? 에 대한 이야기 같다.
2. 객체지향의 세계는 협력하는 자율적인 객체들의 공동체이다.
→ 아래 정리 글의 그림처럼 객체는 서로 유기적(?)으로 맞물려 있다.
정리글 마지막 부분 발췌
- 메시지가 객체를 결정한다는 말의 의미
→ 기능(메시지)을 행사(처리)해야하는 객체를 결정해야한다.
- 책임을 따라 설계가 이뤄지는 과정
→ 기능(메시지)에 대한 책임을 객체에게 줘야한며 그에 따라 설계가 이루어진다.
- 인터페이스와 구현의 분리
→ 인터페이스는 인터페이스 대로 정의하고나서 그 후에 구현을 한다
→ Open Closed Principle 개방 폐쇄의 원칙 준수
읽은 글 : [생각하라, 객체지향처럼](https://techblog.woowahan.com/2502/)
생각하라, 객체지향처럼 | 우아한형제들 기술블로그
{{item.name}} 2년차 쪼랩이가 객체지향을 처음으로 접하고 공부를 하면서 나름대로 정리해보았습니다. 시작 인사 안녕하세요. B2B시스템개발팀 김승영입니다. 먼저, 이 글은 지난 02월에 작성되어
techblog.woowahan.com
객체지향 프로그래밍(OOP)과 절차적 프로그래밍(PP)
머리 속에서 따로 생각해보지 않았었던 개념들을 정리하는 기회였던 것 같다.
1. 특정 언어가 특정 지향을 지원하는 것은 아니다.
- 예를 들어 자바는 객체지향 언어지만 알고리즘을 풀 때는 절차적 프로그래밍으로 해결할 수 있다.
- OO지향은 코딩하는 방식 또는 방법론의 차이이지 특정 언어를 통해서만 OO지향을 할 수 있는 것은 아니다.
2. 왜? 언어별 프로그래밍의 지향(방향성, 방법론)이 달라지는가?
- 언어가 지원하는 기능과 특징에 차이가 있기 때문이다. 대개 객체지향 언어는 다음과 같은 기능을 지원한다.
- 캡슐화, 다형성, 클래스 상속을 지원하는가?
- 데이터 접근 제한을 걸 수 있는가?
3. 객체란 무엇인가?
- 객체란 것을 객체지향 프로그래밍을 자바 처음 공부할 때부터, 생활코딩 선생님을 통해 OOP 관련 영상을 볼 때부터 들었지만, 잘 정리가 안되었던 것 같다. 해당 블로그의 말에 따르면 서양 문화에 기반을 두어 발전한 단어인 객체는 철학적 패러다임의 변화에 따라 발전하였고, 곧 `실체`를 의미한다.
- 객체를 요약하자면 `인간 중심에서 객관적으로 인지할 수 있는 대상들이 객체(Object)다.`
읽은 글 : [객체지향(OOP)과 절차적 프로그래밍(PP)](https://st-lab.tistory.com/151)
객체지향(OOP)과 절차적 프로그래밍(PP)
오늘은 프로그래밍에서 중요한 개념 중 하나인 객체지향 프로그래밍(Object Oriented Programming)과 절차적 프로그래밍(Procedure Programming)에 대해 알아보고자 합니다. 대개 객체지향 프로그래밍 언어를
st-lab.tistory.com
좋은 코드란?
좋은 코드란, 낮은 비용으로 변화할 수 있는 코드이다.
이 말은 1. 캡슐화, 2. 추상화(다형성 지향)로 이루어 낼 수 있다.
절차 지향적 코드는 진행될수록 스파게티 코드가 될 확률이 있다.
객체 지향적 코드는 객체가 제공하는 기능(메서드)이 중심이 되어 설계하는 것이다.
- 호출, 리턴, 익셉션 등의 메세지의 교환
- 데이터 클래스(VO, DTO) 객체가 아니다. 객체의 기능이 없이 값에만 접근하기 때문.
캡슐화의 규칙
- 데이터를 요구하는 것이 아닌 데이터 처리를 요구할 것.
if(member.getAge() > 19)- if(member.isAdult())
- 메서드에서 생성한 객체의 메서드만 호출할 것.
- 파라미터로 받은 객체의 메서드만 호출할 것.
- 필드로 참조하는 객체의 메서드만 호출할 것.
- >> 연속적인 메서드 호출이 아닌 객체에 있는 하나의 메서드로 처리.
- ex ) 사용실적 우수자 체크 + 추가 쿠폰 주기 = > 열혈 고객에게 Benefit 주기
내용 출처
- 객체 지향 프로그래밍 입문(최범균)
- 인프런에 강의도 있네요!
- 인프런 - 객체 지향 프로그래밍 입문 강의
객체 지향 프로그래밍 입문 - 인프런 | 강의
잘 하는 개발자가 되기 위해서는 유연한 코드를 작성할 줄 알아야합니다. 객체 지향을 이용해서 변경하기 좋은 유연한 코드를 만드는 방법을 알아보세요., - 강의 소개 | 인프런...
www.inflearn.com
SOLID 원칙 중 OCP
→ 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
클래스 위에 같은 기능을 하는 집합을 모으는 interface를 두어 각 클래스에서 구체화하면 객체 변경시에 도움이 되고 확장성이 좋아진다고 이해하고 있다. 인프런 강의에서 김영한 님의 Spring 강의에서 Repository를 갈아끼는 등의 과정에서 비교적 자주 보고 느끼는 원칙 중 하나이다. 다만 내가 직접 무엇인가를 설계할 때는 항상 어려웠던 개념같다. 블로그에서도 말하지만, `무엇이 변하는 것인지, 무엇이 변하지 않는 것인지` 가끔 구별을 못할 때가 있기 때문이었다.
읽은 글 : [](https://nesoy.github.io/articles/2018-01/OCP)
OCP(Open Closed Principle)이란?
nesoy.github.io
끝으로..
오래전 공부했었던 JAVA 책과 함께 깃허브()에 정리했었던 리드미를 보면서 객체지향과 특징들(캡슐화, 상속, 다형성)들에 대해서 다시 한번 정의와 의미를 생각해보려한다.
작년에는 자바 문법 익히느라 바빠서 그런 것인지 개념을 읽고 이해한 것 같았으나 정확하게 이해를 못했었던 것 같다. 예를 들어 캡슐화, 다형성 등을 코드와 함께 설명해보라는 말을 듣고 `어버버..` 댔던 것을 생각해보면 그때는 그냥 한글을 이해했던 것 같다.
이노베이션 캠프의 객체지향 Spring 과제(과제에 정답이 있는건지 모르겠다.)를 만들어보면서 객체지향의 의미와 특징들을 곱씹어 봐야겠다.