객체지향 프로그래밍(OOP)
- 자바는 대표적인 객체지향 프로그래밍 언어이다,
- 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
- 눈에 보이는 모든것이 객체이다
객체란?
1) 눈에 보이는 모든것이 객체가 될수 있습니다.
2) 객체는 자신만의 고유한 특성을 가지며 다른 객체들에게 정보를 요청하거나 주고 받는
상호 작용을 할 수 있습니다.
3)객체는 속성(field) 과 동작(method) 으로 구성되어 있습니다
객체지향 프로그래밍 언어
대표적인 객체지향 프로그래밍 언어로는 JAVA,C#,C++,Python,Javascript,Ruby,Swift 등이 있습니다.
객체지향 프로그래밍 vs 절차지향 프로그래밍
절차지향 프로그래밍 언어
장점
- 처리 방식이 빠르다
- 실행속도가 빠르다
단점
- 유지보수가 어렵다
- 대규모 프로젝트에 부적합하다
- 코드를 짜는 순서가 정해져있다 (순서에 따라서 결과 값이 달라진다)
처리방식 : 문제를 여러개의 함수로 나누어서 처리하는 방식
프로그래밍 : C언어
객체지향 프로그래밍 언어
장점
- 코드 재사용이 용이하다
- 대규모 프로젝트에 적합하다
- 유지보수가 쉽다
단점
- 객체가 많으면 용량이 커진다
- 처리 속도가 상대적으로 느리다
- 설계에 많은 시간과 노력이 필요하다
- 난이도가 높다
처리방식 : 문제를 여러개의 객체로 나누어서 처리하는 방식
프로그래밍 : Java,C#,C++등등
객체지향 언어 특징
객체지향 언어의 특징으로는 캡슐화,상속,추상화,다형성 4가지로 이루어져 있습니다
1. 캡슐화(Encalsulation)
- 캡슐화란 필드와 메서드를 하나로 합쳐서 외부로 부터 정보를 숨기는 것 입니다 (구조+데이터)
- 낮은 결합도를 유지 할수있도록 설계하는 것입니다
- 외부에서는 공개된 메서드를 통해서 접근이 가능합니다
2. 상속(Inheritance)
- 상속이란 상위 클래스의 모든것을 하위 클래스가 이어받는 것 입니다
- 즉, 새로운 클래스가 기존 클래스의 데이터를 물려받아서 사용할수 있습니다
장점
1) 범용적인 사용이 가능하다
2) 재사용으로인한 코드가 줄어든다
3) 자료와 메서드의 자유로운 사용 및 추가 가 가능하다
단점
1) 상위클래스로 변경이 어렵다
2) 불필요한 클래스가 증가할수있다
3) 상속이 잘못 될 수 있다
3. 추상화(Abstraction)
- 추상화란 객체에서 공통된 속성과 행위를 추출하는 것 입니다
- 즉, 프로그램을 만들기 위해 객체의 공통된 특성을 파악하고 불필요한 정보를 숨기는 것 입니다
4. 다형성(Polymorphism)
- 다형성이란 하나의 변수명,함수명이 상황에 따라 다르게 표현 될수 있는 것 입니다
- 상위클래스의 동작을 하위클래스에서 다시 정의(Overriding) 하거나,
하나의 클래스에서 이름은 같지만 다르게 행동하는 메소드를 여러개 만드는(Overloading) 또한
다형성의 사례 라고 볼수 있습니다
SOLID (객체 지향 설계 원칙)
객체 지향적으로 설계하기 위해 SOLID 라 불리는 다섯 가지 원칙이 있습니다
단일 책임 원칙 (Single Responsibility Principle)
- 하나의 클래스는 단 하나의 책임만 가져야 한다
- 단일 책임 원칙을 지키지 않을 경우 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다
*단일 책임 원칙을 제대로 지키면 변경이 필요할 때 수정할 대상이 명확해진다
개방-폐쇄 원칙 (Open/Closed Principle)
- 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다
- 기능을 변경하거나 확장할 수 있으면서 기능을 사용하는 코드는 수정하지 않는다
리스코프 치환 원칙 (Liskov Substitution Principle)
- 프로그램 객체는 프로그램의 정확성을 깨뜨리지 않으면서 하위 타입의 인스턴스로 바꿀 수 있어야 한다
- 상위 타입의 객체를 하위 타입의 객체로 치환해도, 상위 타입을 사용하는 프로그램은 정상적으로 동작해야 한다
인터페이스 분리 원칙 (Interface Segregation Principle)
- 범용 인터페이스 하나보다 클라이언트를 위한 여러 개의 인터페이스로 구성하는 것이 좋다.
인터페이스는 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다.
- 클라이언트가 필요로 하는 인터페이스로 분리함으로써 각 클라이언트가 사용하지 않는 인터페이스에 변경이 있어도 영향을 받지 않도록 만들어야 한다.
*클라이언트에 따라 인터페이스를 분리하면 더욱 세밀하게 제어할수 있다
의존관계 역전 원칙 (Dependency Inversion Principle)
- 추상화에 의존해야지 구체화에 의존하면 안된다.
- 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 한다.