객체지향 프로그래밍이란?
프로그래밍 패러다임 중 하나로, 함수와 자료형을 함께 묶어 객체를 만들고 그 객체를 이용해 프로그래밍을 하는 프로그래밍 기법을 뜻한다.
그렇다면 패러다임이란 무엇일까?
정의: 패러다임이란 어떤 한 시대 사람들의 견해나 사고를 지배하고 있는 이론적 틀이나 개념의 집합체.
라고 한다.
그렇다면 이전에는 어떤 패러다임이 있었을까?
1. 순차적 / 비구조적 프로그래밍
이전에는 그냥 단순하게 계속 순서대로 추가해가며 구현하는 방식이 있었다.
그러다가 이전에 작성했던 코드가 필요해지면 goto문을 사용해서 되돌아갔다.
그러나 규모가 커지면 goto문을 무분별하게 사용하게 되고, 코드가 꼬이게 된다. 코드가 어떻게 연결되어 있는지 파악하기 어려워 진다.
2. 절차적 / 구조적 프로그래밍
반복될 가능성이 있는 것들을 재사용이 가능한 함수로 만들어 사용한다.
그러나 이 방식도 문제점이 있다. 너무 추상적이라는 것이다.
예를 들어 도서관리 프로그램을 구현한다고 하면, 책에 해당하는 자료형을 구현해야한다. 또, 책에 관한 함수도 구현해야한다. 구조적 프로그래밍에서는 이 둘을 따로 만들어야 한다. 결국 많은 데이터를 만들어야 할 때, 구분하기 힘들고 비효율적으로 코딩할 가능성이 높아진다.
그래서 이를 한번에 묶기 위해 발생한 패러다임이 바로 객체지향 프로그래밍이다.
객체지향 프로그래밍에서는 특정한 개념의 함수와 자료형을 묶어서 객체를 만들고 이 객체를 사용해서 프로그래밍을 한다.
객체지향으로 구현하게 되면, 다음과 같은 장점이 있다.
- 코드 재사용이 용이하다. (남이 만든 클래스를 가져와서 이용할 수 있고 상속을 통해 확장해서 사용할 수 있다)
- 생산성이 높아진다. (내부적으로 어떻게 동작하는지 몰라도 개발자는 라이브러리가 제공하는 기능들을 사용할 수 있다)
- 디버깅이 쉽고 유지보수가 용이하다. (객체 단위로 코드가 나눠져 작성되기 때문)
다만,
- 설계시 많은 노력이 필요하다. 설계가 어렵다.
는 단점도 있다.
특징
객체지향 프로그래밍에는 다음과 같은 4가지 특징이 있다.
- 추상화
- 캡슐화
- 상속
- 다형성
1. 추상화
추상화란 「공통의 속성이나 기능을 묶어서 이름 붙이는 것」이다.
객체지향에서 추상화란 객체들의 공통적인 property와 method를 뽑아내는 작업, 또는 코드상에서 구현을 제외한 선언 부분만 설계하는 것을 말한다.
2. 캡슐화
캡슐화란 「비슷한 역할을 하는 속성과 메소드를 모아 클래스라는 캡슐에 넣는 것」을 의미한다.
캡슐화에 속하는 개념중에 정보 은닉이라는 것이 있는데, 캡슐 내부의 로직이나 변수들을 감추고 외부에는 기능만을 제공하는 것을 의미한다. 이때, private, public, protected 같은 접근제한자를 사용한다.
3. 상속
상속이란 「부모 클래스의 속성과 메소드를 그대로 이어받아 사용할 수 있게 하고 기능의 일부분을 변경하는 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 하는 것」을 말한다.
4. 다형성
다형성이란 「하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있는 것」을 말한다.
다형성에는 오버로딩과 오버라이딩이 있는데,
- 오버로딩 : 같은 이름의 함수를 여러개 정의하고, 매개변수의 타입과 개수 등을 다르게 해서 매개변수에 따라 다르게 호출할 수 있도록 하는 것
- 오버라이딩 : 부모클래스의 메소드를 자식클래스에서 재정의 하는 것
객체 지향적 설계 원칙 (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) : 의존 역전 원칙
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다.