∞. 기술 면접/7. 자바

05. 기술면접 - 자바 - OOP 의 4가지 특징과 OOP 5가지 설계 원칙

THE HEYDAZE 2021. 10. 20. 14:39
공부목적으로 다른 블로그의 글을 그대로 따라치면서 작성되었습니다. 저작권 문제 시, 비공개 처리하겠습니다

OOP 란

- OOP는 현실 세계의 사물및 개념들을 객체로 보고, 그 객체들을 조립하여 프로그래밍 하는 기법이다
- 절차지향적 프로그래밍에서 있었던 코드의 재사용성과 중복제거가 가장 큰 목적으로 만들어진 기법

절차지향 프로그래밍
- 실행하고자 하는 절차를 정하고, 이 절차대로 프로그래밍하는 방법
- 목적을 달성하기 위한 일의 흐름에 중점을 둔다.

객체지향 프로그래밍
- 실세상의 물체를 객체로 표현하고, 이들 사이의 관계, 상호 작용을 프로그램으로 나타낸다.
- 객체를 추출하고 객체들의 관계를 결정하고 이들의 상호 작용에 필요한 함수(메서드)와 변수(필드)를 설계 및 구현하다.
- 객체 지향의 핵심은 연관되어 있는 변수와 메서드를 하나의 그룹으로 묶어서 그룹핑하는 것이다.
- 사람의 사고와 가장 비슷하게 프로그래밍을 하기 위해서 생성된 기법 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 서로 다른 행동을 하게 된다.
즉, 하나의 클래스여러 개의 인스턴스가 될 수 있다는 점이 객체 지향이 제공하는 가장 기본적인 재활용성이라고 할 수 있다.

1. 추상화
  - 목적과 관련이 없는 부분을 제외해서 필요한 부분을 포착하는 기법
  - 객체의 공통된 속성들 중 필요한 부분을 포착해서 클래스로 정의하는 설계 기법
  - 구체적인 사물들의 공통적인 특징을 파악해서 이를 하나의 개념(집합)으로 다루는 것

2. 캡슐화
  - 외부에 노출할 필요가 없는 정보들은 은닉 (정보은닉)
  - 정보 은닉(information hiding): 필요가 없는 정보는 외부에서 접근하지 못하도록 제한하는 것
  - 높은 응집도, 낮은 결합도를 유지하여 유연함과 유지보수성 증가
  - ex) 마트에서 구매자는 상품명과 가격만 알면될 뿐, 뒤에 원재료와 재질각 종 다양한 정보는 몰라도 된다
        필요한 정보만 보여주게끔 설계해야 된다는 의미

3. 상속화
  - 부모 클래스가 자손 클래스에게 속성을 물려주는 것
  - 코드의 재사용
  - 여러 개체들이 가진 공통된 특성을 부각시켜 하나의 개념이나 법칙으로 성립시키는 과정

4. 다형화
  - 같은 형태이지만 다른 기능을 하는 것
  - 서로 다른 클래스의 객체가 같은 메시지를 받았을 때 각자의 방식으로 동작하는 능력
  - 오버라이딩(Overriding) 은 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용
  - 오버로딩(Overloading) 은 이름의 메서드 여러개를 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술

https://private.tistory.com/25

객체지향(OOP)의 장점

- 객체를 중심으로 프로그래밍하기 때문에
    - 사람의 관점에서 프로그램을 이해하고 파악하기 쉽다
    - 강한 응집력과 약한 결합력을 가진다 (관계는 있지만 없어도 대체해서 동작시킬 수 있는 유연함이 있다는 말)
    - 재사용성, 확장성, 융통성이 높다

*응집력(cohesion) ↑ : 프로그램의 한 요소가 해당 기능을 수행하기 위해 얼마만큼의 연관된 책임과 아이디어가 뭉쳐있는지를 나타내는 정도. 프로그램의 한 요소가 특정 목적을 위해 밀접하게 연관된 기능들이 모여서 구현되어 있고, 지나치게 많은 일을 하지 않으면 그것을 응집력이 높다고 표현한다. (지나치게 많은 일을하면 응집력이 낮은 것이다)
-> SRP 와 연관되어 있다
-> 클래스가 1개가 요청과 응답과 DB CRUD 작업과 오류 처리 같이 모든 일을 다 해서는 안된다
-> 위 과정 중 1개의 일만 해야한다는 의미로 생각하면 된다
-> 쉽게 말해 유사한 기능(메소드)들은 같은 클래스 안에 있어야 하고 다른 기능은 분리되어야 한다

*결합력(coupling) ↓ : 프로그램 코드의 한 요소가 다른 것과 얼마나 강력하게 연결되어 있는지, 얼마나 의존적인지를 나타내는 정도. 결합력이 낮다는 것은 한 요소가 다른 요소들과 관계를 크게 맺고 있지 않은 상태를 의미한다.
-> OCP, DIP 와 관련이 있다
-> 기존에 ShinhanCardService(신한카드) 라는 비즈니스 로직을 처리하는 클래스가 있었다고 가정하자
-> 나중에 WooriCardService(우리카드) 라는 클래스를 만들어야 하는데
-> 이 ShinhanCardService 에서 호출하는 쪽에서 코드의 변경이 일어난다면 의존성이 높은 것 이다 (확장에 닫혀있음)

*OOP의 경우 클래스에 하나의 문제 해결을 위해 데이터를 모아 놓은 객체를 활용한 프로그래밍을 지향하므로 응집력을 강화하며, 클래스 간에 독립적으로 디자인함으로써 결합력을 약하게 할 수 있다.
객체지향(OOP)의 단점

1. 객체지향은 객체와 클래스를 사용하여 각 모듈의 높은 독립성을 권장합니다.
   그래서 여러 클래스를 상속해서 사용해 중복코드를 최소화하고, 유지보수확장성을 높입니다. -> 실행 속도가 느리다.
2. 객체가 많으면 프로그램 용량이 커질 수도 있다.
3. 설계에 많은 시간이 투자된다.
4. 설계 실패 시, 다시 처음부터 시작해야 한다.
5. 객체가 상태를 갖기 때문에 예상치 못한 부작용이 발생할 수 있다. 변수가 존재하고 이 변수를 통해 객체가 예측할 수
   없는 상태를 갖게되어 애플리케이션 내부에서 버그를 발생시킬 수 있다 -> 이는 함수형 프로그래밍 등장의 패러다임
   이다

SOLID 설계 원칙
S SRP, Single Responsibility Principle
단일 책임 원칙
  객체는 단 하나의 책임만 가져야 한다
O OCP, Open Close Prinicple
개방 폐쇄 원칙
  기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계가
  되어야 한다
L LSP, Liskov Substitution Principle
리스코프 치환 원칙
  일반화 관계에 대한 이야기며, 자식 클래스는 최소한 자신의 부모 클래스
  에서 가능한 행위는 수행할 수 있어야 한다
I ISP, Interface Segregation Principle
인터페이스 분리 원칙
  인터페이스를 클라이언트에 특화되도록 분리시키라는 설계 원칙
D DIP, Dependency Inversion Principle
의존 역전 원칙
  고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.
  의존 관계를 맺을 때 변화하기 쉬운 것 또는 자주 변화하는 것보다는
  변화하기 어려운 것, 거의 변화가 없는 것에 의존하라는 것이다

 

참고

https://trello.com/c/MujQDOvD/36-oop%EB%9E%80

 

OOP란 on 기술면접 정리

[ OOP: Object Oriented Programming(객체 지향 프로그래밍) ] * 현실 세계의 개체를 기계의 부품처럼 하나의 객체로 생성 * 객체들을 조립해서 프로그래밍 하는 기법 코드의 재사용성과 중복제거가 가장

trello.com

 

https://mangkyu.tistory.com/88

 

[기술면접] CS 기술면접 질문 - 프로그래밍 공통 (1/8)

1. 프로그래밍 공통 [ OOP란 ] OOP는 현실 세계를 프로그래밍으로 옮겨와 현실 세계의 사물들을 객체로 보고, 그 객체로부터 개발하고자 하는 특징과 기능을 뽑아와 프로그래밍하는 기법입니다. OOP

mangkyu.tistory.com

 

https://mangkyu.tistory.com/88

 

[기술면접] CS 기술면접 질문 - 프로그래밍 공통 (1/8)

1. 프로그래밍 공통 [ OOP란 ] OOP는 현실 세계를 프로그래밍으로 옮겨와 현실 세계의 사물들을 객체로 보고, 그 객체로부터 개발하고자 하는 특징과 기능을 뽑아와 프로그래밍하는 기법입니다. OOP

mangkyu.tistory.com