[CS] 객체 지향 프로그래밍 (Object Oriented Programming)
개인적으로 공부하면서 기록하는 공간으로
잘못된 정보는 댓글을 통해 알려주시면 감사하겠습니다 :-)
▪ ▪ ▪ ▪ ▪
공부를 하다가 굉장히 잘 정리되어 있는 깃허브를 발견했습니다 !
보기만 하면 잘 모를 것 같아서 제 입맛에 맞게 공부해보려고 해요
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
객체 지향 프로그래밍 (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
댓글