일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- securityconfig
- Session1이 그 모든 클라이언트의 저올
- HttpSecurity
- 스프링 #스프링 시큐리티 #spring security
- ㅇㅇㅇㄴㅇ
- ㅂ
- Spring Security
- WebConfigurerAdapter
- WebSecurity
- 스프링시큐리티
- Today
- Total
다오의 개발일지
객체 지향 프로그래밍 본문
객체 지향 프로그래밍
- 객체지향프로그래밍은 컴퓨터 프로그램을 명령어의 시각에서 벗어나 독립된 단위, 즉 객체들의 모임으로 파악하고자 하는 것이다 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.
- 프로그램을 유연하고 변경이 용이하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용된다.
객체지향의 특징
추상화, 캡슐화, 상속, 다형성
추상화
추상이라는 용어의 사전적 의미를 보면 “사물이나 표상을 어떤 성질, 공통성, 본질에 착안하여 그것을 추출하여 파악하는 것”이라 정의하고 있다. 여기서 핵심이 되는 개념은 “공통성과 본질을 모아 추출”한다는 것이다.
예를들어, 탈 것이라는 속성의 하위 속성에는 자동차, 배, 비행기 등이 속해있다. 이 하위 속성들의 추상화는 공통 속성인 탈 것이 되는 것이고 반대로 탈 것의 구현은 자동차, 배, 비행기가 되는 것이다.
즉 객체 지향 프로그래밍에서 의미하는 추상화는 객체의 공통적인 속성과 기능을 추출하여 정의하는것을 의미한다.
상속
상속이란, 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 자바의 문법 요소를 의미한다.
클래스 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 딱 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있도록 한다.
캡슐화
서로 연관있는 속성과 기능들을 하나의 캡슐(capsule)로 만들어 데이터를 외부로부터 보호하는 것을 말한다. 자바에서 제공하는 접근 제어자를 통해 클래스에 정의된 속성과 기능을 보호하고 필요한 정보만 getter/setter를 사용하여 외부에 노출될 수 있도록 할 수 있다. 또한 객체 간 결합도를 낮추어 하나의 객체가 다른 객체를 의존하는 것을 막을 수 있다.

참조
객체 지향 프로그래밍의 4가지 특징ㅣ추상화, 상속, 다형성, 캡슐화 -
객체 지향 프로그래밍은 객체의 유기적인 협력과 결합으로 파악하고자 하는 컴퓨터 프로그래밍의 패러다임을 의미합니다. 객체 지향 프로그래밍의 기본적인 개념과 그 설계를 바르게 하기 위
www.codestates.com
중요한 것은 다형성
운전자와 자동차로 비유를 해보자. 여기서 자동차를 인터페이스라고 가정하고. 운전자는 자동차를 운전할 수 있다. 자동차를 K3로 구현을 해서 만들거나 아반떼로 구현을 해서 만들거나 상관없이 운전자는 핸들과 엑셀 브레이크 기어조절로 운전을 할 수 있다.
즉 인터페이스에 대한 사용법만 알고 있다면 인터페이스를 구현 한 구현체에 대한 것은 전혀 신경 쓰지 않고 사용할 수 있다는 의미이다. 또한 사용자에게 영향을 주지 않고 새로운 구현체를 제공할 수 있다는 의미이기도 하다. 인터페이스 규격에 맞게 다양한 모습으로 구현을 할 수 있고 이를 사용자가 구현체에 상관없이 사용할 수 있는 것이 다형성이다.

역할과 구현을 분리
핵심은 클라이언트이다.
- 클라이언트는 인터페이스만 알면 된다.
- 클라이언트는 구현체의 내부 구조를 몰라도 된다.
- 클라이언트는 구현체의 내부 구조가 변경되어도 영향을 받지 않는다.
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
하지만 인터페이스 자체가 변하게 된다면 클라이언트와 서버 모두 큰 변경이 발생한다. 따라서 초기 인터페이스를 안정적으로 설계를 하는 게 무엇보다 중요하다.
스프링과 객체 지향
스프링은 위와 같은 다형성의 특징을 극대화해서 사용할 수 있게 도와준다. 스프링의 큰 특징 중 하나인 제어의 역전(IoC), 의존관계 주입(DI)은 다형성을 활용해 역할과 구현을 편리하게 다룰 수 있도록 도와준다.
좋은 객체지향 설계의 5가지 원칙 (SOLID)
클린코드로 유명한 로버트 마틴이 정의한 5가지 원칙을 정리한 것이다.
- SRP : 단일 책임 원칙
- 한 클래스는 하나의 책임만 가져야 한다.
- 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 따른 것이다.
- 예) UI변경, 객체의 생성과 사용을 분리
- OCP : 개방-폐쇄 원칙⭐
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
- 다형성을 활용해 기존의 코드 변경없이 인터페이스를 구현한 새로운 클래스로 새로운 기능을 구현한다.
예를 들어, MemberService 클라이언트가 있다고 가정할 때 이를 구현한 구현 객체를 변경하려면 결국 클라이언트 코드안에서 변경 해야하고 이는 OCP원칙에 위배가 된다. 해결하려면 어떻게 해야할까?
방법은 객체를 생성하고, 연관관계를 맺어주는 별도의 조립, 설정자(config)파일이 필요하다.
- LSP : 리스코프 치환 원칙
- 프로그램의 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다.
- 즉 인터페이스의 방향성에 맞는 기능이 주어져야 한다. 예를 들어, 자동차 인터페이스의 엑셀은 앞으로 가라는 기능이어야만 한다. 뒤로 가게 구현한다면 LSP 위반이 되는 것이다. 어쩌면 당연한 이야기.
- ISP : 인터페이스 분리 원칙
- 특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
- 인터페이스를 세부적으로 분리하더라도 클라이언트에게 영향을 주지 않는다.
- 인터페이스가 명확해지고 대체가능성이 높아진다.
- DIP : 의존관계 역전 원칙.⭐
- 프로그래머는 "추상화에 의존해야지, 구체화에 의존하면 안된다." 의존성 주입은 이 원칙을 따르는 방법 중 하나다.
- 구현 클래스에 의존하지 말고, 인터페이스에 의존하라는 의미이다.
실무적인 고민
이론적으론 모든 원칙을 준수하며 객체지향 설계를 하는 게 바람직하지만, 인터페이스 분리를 할 수록 추상화라는 추가 비용이 발생한다. 기능을 확장할 가능성이 없는 서버인 경우, 구현체 클래스를 직접 사용하도록 하고, 향후에 필요할 때 리펙토링해서 인터페이스를 도입하는 것도 방법이다.
'Spring > 스프링 핵심원리 기본편 | 김영한' 카테고리의 다른 글
스프링의 탄생과 하이버네이트 (1) | 2023.10.23 |
---|