면접 단골 질문이자, 개발자라면 꼭 알아야 할 객체 지향 프로그래밍에 대한 포스팅입니다.
객체 지향 프로그래밍이란?
객체 지향 프로그래밍(Object-Oriented Programming, OOP)은
프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체
로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법
기본 구성 요소
- 객체 지향 프로그래밍은 기본적으로
클래스
, 객체
, 메서드
로 구성된다.
클래스란?
클래스(Class)는 같은 종류의 집단
에 속하는 속성(attribute)
과 행위(behaviour)
를 정의
한 것이다.
- 객체 지향 프로그램의 기본적인 사용자 정의 데이터형이다.
- 클래스는 다른 클래스 또는 외부 요소와 독립적으로 디자인해야 한다.
객체란?
객체(Object)는 클래스의 인스턴스에 할당된, 즉 실제로 메모리 상에 할당된 것
으로 고유의 속성(attribute)
를 가진다.
- 객체는 클래스에서 정의한 행위(behaviour)를 수행할 수 있다.
- 객체의 행위는 클래스에 정의된 행위에 대한 정의를 공유함으로써 메모리를 절약할 수 있다.
메서드란?
메서드(Method)는 클래스로부터 생성된 객체를 사용하는 방법
으로, 객체에 명령을 내리는 메시지라고 할 수 있다.
객체 지향 프로그래밍 언어
- Swift, C++, C#, Java, Python, JavaScript, Ruby, 등
객체 지향 프로그래밍의 특징
- 객체 지향 프로그래밍은 크게
추상화
, 캡슐화
, 상속
, 다형성
의 네 가지 특징을 가진다.
1. 추상화(Abstraction)
- 객체에서
공통된 속성과 행위
를 추출하는 것
- 공통의 속성과 행위를 찾아서
타입을 정의
하는 과정
- 불필요한 정보는 숨기고
중요한 정보만을 표현
함
- e.g)
김밥, 비빔밥, 떡볶이는 모두 ‘한식’에 해당하며,
’한식’ 이라는 추상화 집합을 만들어두고 한식이 가진 공통적인 특징을 정의하여 활용한다.
추상화가 필요한 이유
- 새로운 객체가 추가되는 상황에서 공통된 특징을 가진 추상화 집합이 존재하면,
코드의 수정 없이
해당 집합에서 새로운 객체의 필요한 부분만 추가
해줄 수 있다.
- e.g)
’불고기’라는 새로운 음식을 추가하는 경우, ‘한식’ 이라는 집합이 구현되어 있다면, 해당 집합의 특징은 그대로 두고 불고기의 특징만 추가하면 된다.
2. 캡슐화(Encapsulation)
데이터 구조
와 데이터를 다루는 방법
들을 결합
시켜 묶는 것
- 클래스의 외부에서는 노출된 특정 메소드에만 접근이 가능하고 내부에서 어떤 식으로 처리되는지 알지 못하도록 설계
캡슐화가 필요한 이유
- 관련된 기능과 특성을 한 곳에 모아 분류하기 때문에, 코드를 재수정 없이 재활용 할 수 있다.
- 접근제어자(private, public 등)를 통해 외부에 노출하지 않아야 할 정보 또는 기능을 은닉할 수 있다.
3. 상속(Inheritance)
- 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것
- 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능
상속의 장단점
장점 | 단점 |
---|
재사용으로 코드를 줄일 수 있다. 범용적으로 사용이 가능하다. 변수와 메서드를 자유롭게 사용 및 추가할 수 있다. | 상위 클래스의 변경이 어렵다. 불필요한 클래스가 많아져 복잡해지거나 메모리가 낭비될 수 있다. 상속을 오사용하여 문제가 생길 수 있다. |
4. 다형성(Polymorphism)
- 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것
- 메서드를 동일 클래스 또는 하위 클래스에서 재정의 하여 사용
오버라이딩
- 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의하여 사용하는 것
오버로딩
- 같은 이름의 메서드가 매개변수 또는 자료형에 따라 다른 기능을 하는 것
객체 지향 프로그래밍의 장단점
장점
- 클래스 단위로 모듈화하여 개발하기 때문에 업무 분담이 편하고 대규모 소프트웨어 개발에 적합하다.
- 클래스 단위로 수정이 가능하기 때문에 유지보수가 편하다.
- 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하다.
- 보다 직관적인 코드 분석을 가능하게 한다.
단점
- 처리 속도가 상대적으로 느리다.
- 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
- 설계 시 많은 시간과 노력이 필요하게 될 수 있다.
참고
객체지향의 개념에 대해서 잘 정리해주셨네요 😄 SOLID 원칙에 대해서도 다뤄주시면 감사하겠습니다 !