본문 바로가기

[CS] 객체 지향 프로그래밍 (Object Oriented Programming)

안자매 2022. 8. 23.
반응형

 

개인적으로 공부하면서 기록하는 공간으로
잘못된 정보는 댓글을 통해 알려주시면 감사하겠습니다 :-)

▪ ▪ ▪ ▪ ▪

 

공부를 하다가 굉장히 잘 정리되어 있는 깃허브를 발견했습니다 !

보기만 하면 잘 모를 것 같아서 제 입맛에 맞게 공부해보려고 해요

 

 

GitHub - JaeYeopHan/Interview_Question_for_Beginner: Technical-Interview guidelines written for those who started studying progr

:boy: :girl: Technical-Interview guidelines written for those who started studying programming. I wish you all the best. :space_invader: - GitHub - JaeYeopHan/Interview_Question_for_Beginner: Techn...

github.com

728x90

 


 

객체 지향 프로그래밍 (Object Oriented Programming)

객체 지향 프로그래밍이란 컴퓨터 프로그래밍의 패러다임 중 하나로 모든 것이 객체로 이루어져있다는 원리를 기반으로 한다. 즉, 프로그래밍에서 필요한 데이터를 모두 추상화시켜(abstraction) 상태(attribute)와 행위(method)를 가진 객체(object)를 만들고 그 객체들이 서로 맞물려 기능(encapsulation)합니다.

 

장점

① 이미 작성한 코드에 대한 재 사용성이 높음

→ 자주 사용하는 코드를 라이브러리로 만들어 두면 개발 생산성이 높아짐

② 중복되는 코드의 양이 줄어듬

③ 객체 단위로 코드가 나눠져 작성되기 때문에 디버깅이 쉽고 유지보수에 용이하

 

단점

처리속도가 상대적으로 느림

객체가 많아지면 저장공간을 많이 차지

 

객체 지향 프로그래밍의 4가지 특징

1. 추상화 (Abstraction)

- 객체들이 공통적으로 필요로 하는 속성이나 동작을 하나로 추출해내는 작업

- 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는것

 

2. 캡슐화 (Encapsulation)

- 정보 은닉화를 통해 높은 응집도, 낮은 *결합도를 유지할 수 있도록 설계하는 것 

→ 한 곳에서 변화가 일어나도 다른 곳에 미치는 사이드 이펙트를 최소화 시키는 것을 의미

*결합도 어떤 기능을 실행할 때 다른 클래스나 모듈에 얼마나 의존적인지를 나타내는 지표 

- 외부에서 접근할 필요가 없는 것들은 접근 지정자 private을 사용하여 접근을 제한

 

3. 상속

- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것

→ 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종

- 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능 

 

장점

자식 클래스를 캡슐화해두면, 외부에선 개별적인 자식 클래스들과 무관하게 개발 가능

② 상위 클래스의 구현을 활용함으로써, 코드 재사용성이 용이

 

단점

부모 클래스의 변경이 어려움 → 의존하는 자식 클래스들이 영향을 받음

② 불필요한 클래스의 증가 

③ 잘못된 상속 사용 → 상속받는 클래스가 부모클래스와 IS-A 관계가 아닐 때 발생

* 상속은 재사용 관점에서 사용하면 안됨

 

4. 다형성 (Polymorphism)

- 서로 다른 클래스의 객체가 같은 동작을 수행할 때, 각자의 특성에 맞는 방식으로 동작하는것

- 객체 지향 프로그래밍은 하나의 클래스 내부에 같은 이름의 행위를 여러 개 정의하거나 상위 클래스의 행위를 하위 클래스에서 재정의하여 사용할 수 있음

오버라이딩 : 상위 클래스가 가지고 있는 메소드를 하위 클래스가 재정의해서 사용하는 것
오버로딩 : 같은 이름의 메서드가 인자의 개수나 자료형에 따라 다른 기능을 하는 것

 

5가지 설계원칙, SOLID 

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

: 클래스는 단 한 개의 책임을 가져야하며 클래스를 변경하는 이유는 단 하나의 이유이어야 함

→ 한 기능의 변경에 의해 다른 기능과 관련된 코드에 영향을 미칠 수 있음

 

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

: 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 함

기존의 코드를 변경하지 않고 기능을 수정하거나 추가할 수 있도록 설계

개방-폐쇄 원칙은 추상화와 상속을 통해 구현해낼 수 있음

 

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

: 상위 타입의 객체를 하위 타입의 객체로 치환해도 상위 타입을 사용하는 프로그램은 정상적으로 동작해야함

→ 상속 관계에서는 일반화 관계가 성립해야함

상속 관계가 아닌 경우 클래스들을 상속관계로 설정하면 원칙에 위배 됨

리스코프 치환 원칙을 지키지 않으면 개방 폐쇄 원칙을 위반하게 됨

 

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

: 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야함

각 클라이언트가 필요로 하는 인터페이스들을 분리하여 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야됨

 

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

: 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안됨

구체화된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야함 

 

 

Reference

https://velog.io/@haero_kim/객체지향-프로그래밍-이해하기

 https://velog.io/@haero_kim/SOLID-원칙-어렵지-않다

https://velog.io/@nayeon/객체-지향-프로그래밍-OOPObject-Oriented-Programming

 

 

 

 

 

댓글