객체지향 프로그래밍 (Object-Oriented Programming)
- 많은 객체(Objcet)들이 모여서 상호 협력하면서 메시지를 주고 받으며 데이터를 처리하는 방식의 현실세계의 패러다임을 접목한 프로그래밍 방법입니다.
- 다형성을 통해 레고 블럭 조립하듯이 컴포넌트를 유연하고 변경이 용이하기 때문에 대규모 소프트웨어 개발에 많이 사용됩니다.
- 대표적으로 많이 알려진 Java언어를 포함하여 Ruby Python, C++, Objectivc-C, C#, Kotlin 등이 모두 객체지향 요소를 가진 언어입니다.
객체지향의 특징
- 캡슐화 : 접근제어 지시자를 통한 정보 은닉 ( public > protected > default > private )을 통해 여러가지 형태의 객체를 디자인 > ex) 싱글톤
- 상속 : 상위 클래스의 특징을 하위클래스에서 상속받아 코드의 중복 제거, 코드 재사용성 증대
- 추상화 : 모델링개념. 클래스 설계를 할때 공통적으로 묶일 수 있는 기능은 추상화 > 추상클래스 > 인터페이스 모델링해서 향후 다형성으로 확장할 수 있도록 설계
- 다형성 : OOP의 OOP답게 만들어 주는 가장 큰 특징
- 다형성을 통해 역할과(인터페이스) 구현을 분리해서 오버라이딩을 통해 서비스의 구현기능을 유연하게 변경, 확장이 가능
- 특히 스프링같은 DI컨테이너를 이용하면 다형성을 극대화 하여 OCP,DIP 설계 원칙을 잘 지키면서도 구현체를 편리하게 변경,확장이 가능
다형성의 실세계 비유
- 역할(interface)과 구현(implements)으로 세상을 구분
- 운전자-자동차 / 공연무대 / 키보드마우스 / 정렬알고리즘 / 할인정책
- 자동차의 구현을 분리한 건 운전자를 위함임! 차가 바뀐다고해서 운전자는 내부 구조를 알 필요가 없이 운전 가능!
- 클라이언트에 영향을 주지 않고 새로운 기능을 제공할 수있음!! 클라이언트를 바꿀 필요가 없는 것이 중요!!
역할과 구현을 분리
- 역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해진다.
- 장점
- 클라이언트는 대상의 역할(인터페이스)만 알면 된다.
- 클라이언트는 구현 대상의 내부 구조를 몰라도 된다.
- 클라이언트는 구현 대상의 내부 구조가 변경되어도 영향을 받지 않는다
- 클라이언트는 구현 대상 자체를 변경해도 영향을 받지 않는다.
- 자바 언어의 다형성 활용
- 역할 = 인터페이스
- 구현 = 인터페이스를 구현한 클래스, 구현 객체
- 객체를 설계할 때 역할과 구현을 명확히 분리!
- 객체 설계시 역할(인터페이스)를 먼저 부여하고, 그 역할을 수행하는 구현 객체 만들기!!
- 핵심은 구현보다 역할(인터페이스)가 더 중요하다!!
객체의 협력이라는 관계부터 생각
- 혼자 있는 객체는 없다.
- 클라이언트 : 요청, 서버 : 응답 - 수많은 클라이언트와 객체 서버는 협력관계를 가짐
자바 언어의 다형성
- 오버라이딩을 떠올려보자, 오버라이딩은 자바의 기본 문법 - 메서드 재정의
- 결국 오버라이딩 된 메서드가 호출 되는것 !
- 다형성으로 인터페이스를 구현한 객체를 실행시점에 유연하게 변경 가능. (상속도 가능)
- 다형성의 본질은 클라이언트를 변경하지 않고 서버의 구현기능을 유연하게 변경 가능
정리
- 실세계의 역할과 구현이라는 편리한 컨셉을 다형성을 통해 객체세상으로 가져옴
- 유연하고 변경이 용이
- 확장 가능한 설계
- 클라이언트에 영향을 주지 않는 변경
- 역할(인터페이스)를 안정적으로 설계하는 것이 중요하다!!!
Reference
'Program > Java' 카테고리의 다른 글
[Java] VM arguments(VM options) 추가, 조회 - IntelliJ, Eclipse (1) | 2022.04.14 |
---|---|
객체 지향 설계의 5가지 원칙 정리 (SOLID) (0) | 2022.03.31 |
[Java] StringBuilder,StringBuffer 마지막문자 지우기 (0) | 2022.02.23 |
[Java] List를 배열(Array)로 변환 하기 - Java버전별, 기본형 변환 (0) | 2022.01.21 |
[Java] 2차원 배열 정렬 (오름차순, 내림차순, 다중 조건) (0) | 2022.01.14 |