순차적, 비구조적 프로그래밍 : goto문을 활용하여 이전에 작성했던 코드가 필요하면 그곳으로이동.
-> 규모가 커질 수록 불편

절차적, 구조적 프로그래밍 : 반복될 가능성이 있들을 재사용이 가능한 함수(프로시저)로 만들어 사용 
-> 추상적

 

객체지향 프로그래밍  : 특정한 개념의 함수와 자료형을 함께 묶어서 관리하기 위해 탄생
 객체 내부에 자료형(필드)와 함수(메소드)가 함께 존재, 가능한 모든 물리적, 논리적요소를 객체로 만는 것 

- 객체지향으로 구현하게되면 , 객체간의 독립성이 생기고 중복코드의  양이 줄어듦
- 독립성이 확립되어 유지보수에 도움

 

객체지향 프로그래밍 특징 

  1.추상화 (Abstraction) 
     필요로하는 속성이나 행동을 추출하는 작업

추상적인 개념에 의존하여 설계해야 유연함을 갖출 수 있음. 
즉 , 세부적인 사물들의 공통적인 특징을 파악한 후 하나의 집합으로 만들어내는 것 

 

  2.캡슐화 ( Encapsulation)
     낮은 결합도를 유지할 수 있도록 설계하는 것

한 곳에서 변화가 일어나도 다른곳에 미치는 영향을 최소화 시키는 것
(객체가 내부적으로 기능을 어떻게 구현하는지 감추는것) 
- 결합도를 낮도록 만들어야하는 이유?  객체들간의 의존도가 높아지면 객체지향으로 설계하는 의미가 없어짐
객체안의 모듈간의 요소가 밀접한 관련이 있는 것으로 구성하고, 응집도를 높이고 결합도를 줄여야 요구사항 변경에 대처하는 좋은 설계 방법임

정보은닉 > 외부에서 접근할 필요가 없는 것들은 private으로 접근하지 못하도록 제한을 둠

 

  3.상속
 일반화관계라고도하며, 여러 개체들이 지닌 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립하는 과정 

자식클래스를 외부로부터 은닉하는 캡슐화의 일종 
상속관계에서는 단순히 하나의 클래스 안에서 속성 및 연산들의 캡슐화에 한정되지 않음 
자식클래스 자체를 캡슐화하여, 외부에서 이러한 클래스들에 영향을 받지않게함.
- is-a관계가 성립할때 사용 
    *is-a는 추상화(형식이나 클래스와 같은)들 사이의 포함 관계를 의미하며, 한 클래스 A가 다른 클래스 B의 서브클래스(파생클래스)임을 이야기합니다. 다른 말로, 타입 A는 타입 B의 명세(specification)를 암시한다는 점에서 타입 B의 서브타입이라고도 할 수 있습니다.
- 재사용 관점이 아닌, 기능의 확장 관점일 때 사용 

- 상속 재사용의 단점
부모클래스의 변경이 어려워짐 / 불필요한 클래스 증가 / 상속이 잘못사용될 수 있음 
> 해결책 :객체조립 (컴포지션)  - 필드에서 다른 객체를 참조하는 방식으로 구현 

 

  4.다형성(Polymorphism)
     서로 다른 클래스의 객체가 다른 메세지를 받았을때 각자의 방식으로 동작하는 능력

 객체지향의 핵심과도 같은 부분 /  상속과 함께 할때 큰힘을 발휘함 
즉, 부모클래스의 메소드를 자식클래스가 오버라이딩해서 자신의 역할에 맞게 활용하는것 

 다형성을 사용하면, 현재 어떤 클래스 객체가 참조되는지 무관하게 프로그래밍하는 것이 가능 
상속관계에 있으면, 새로운 클래스가 추가되어도 부모클래스의 함수를 참조해오면 되게 때문에 다른클래스는 영향을 받지않음 

 

객체지향 설계과정

 - 제공해야할 기능을 찾고 세분화, 그 기능에 알맞은 객체에 할당
- 기능을 구현하는데 필요한 데이터를 객체에 추가 
- 그 데이터를 이용하는 기능을 넣는다
- 기능은 최대한 캡슐화하여 구현
- 객체간에 어떻게 메소드 요청을 주고받을지 결정 

 

객체지향 설계 원칙 (SOLID)

1. SRP(Single Responsibility) 단일책임원칙

클래스는 단 한개의 책임을 가져야한다. 클래스를 변경하는 이유는 단 한개 여야 한다. 
이를 지키지 않으면, 한 책임의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있음 

 

2. OCP (Open-Closed) 개방-폐쇄 원칙

확장에는 열려있어야하고, 변경에는 닫혀있어야함
기능을 변경하거나 확장할 수 있으면서, 그 기능을 사용하는 코드는 수정하지 않음 

 

3. LSP (Liskov Substitution) 리스코프 치환 원칙 

상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상작동해야함 
상속관계가 아닌 클래스들을 상속관계로 설정하면 이 원칙이 위배됨

4.ISP (Interface Segregation) 인터페이스 분리원칙

인터페이스는 그 인터페이스를 사용하느 클라이언트를 기준으로 분리해야함 
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 각 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야함

 

5.DIP (Dependency Inversion) 의존 역전 원칙

고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다 . 저수준 모듈이 고수준 모듈에서 정의한 추상타입에 의존해야한다. 즉, 저수준 모듈이 변경돼도 고수준 모듈은 변경할 필요 없음 

 

'개념정리' 카테고리의 다른 글

4. String, StringBuffer, StringBuilder 차이 및 장단점  (0) 2023.04.06
3. 자바 컴파일 과정  (0) 2023.04.05
2. 싱글톤패턴 (Singleton pattern)  (0) 2023.04.05
개념 정리  (0) 2023.04.05
복사했습니다!