객체지향 프로그래밍 (Object-Oriented Programming, OOP)
정의
객체지향 프로그래밍(OOP)은 데이터와 그 데이터를 처리하는 메서드를 포함하는 객체들을 기반으로 소프트웨어를 설계하고 구현하는 프로그래밍 패러다임이다. 이 방식은 소프트웨어의 재사용성, 확장성 및 유지보수의 용이성을 증대시키는 데 초점을 맞추고 있다.
SOLID 원칙
SOLID 원칙은 객체지향 설계의 다섯 가지 핵심 원칙으로, 견고하고 유지보수가 용이한 소프트웨어를 설계하는 데 목표를 두고 있다.
-
Single Responsibility Principle (단일 책임 원칙):
- 한 클래스는 하나의 책임만 가져야 한다.
- 클래스가 변경되는 이유는 하나여야 하며, 이는 클래스의 기능을 명확하게 구분짓는 데 도움을 준다.
-
Open/Closed Principle (개방-폐쇄 원칙):
- 소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다.
- 기존의 코드를 변경하지 않고도 시스템의 기능을 확장할 수 있어야 한다.
-
Liskov Substitution Principle (리스코프 치환 원칙):
- 프로그램에서 부모 클래스의 인스턴스 대신 하위 클래스의 인스턴스를 사용할 수 있어야 한다.
- 하위 클래스는 그들의 기본 클래스와 대체 가능해야 한다.
-
Interface Segregation Principle (인터페이스 분리 원칙):
- 클라이언트는 그들이 사용하지 않는 인터페이스를 구현하도록 강제되어서는 안 된다.
- 인터페이스는 구체적이고 클라이언트에 특화되어야 한다.
-
Dependency Inversion Principle (의존 역전 원칙):
- 고수준 모듈은 저수준 모듈에 의존해서는 안 되며, 둘 다 추상화에 의존해야 한다.
- 추상화는 구체적인 사항에 의존하지 않아야 하며, 구체적인 사항은 추상화에 의존해야 한다.
다형성 (Polymorphism)
정의
다형성은 객체가 여러 가지 형태를 가질 수 있는 능력을 의미하며, 같은 인터페이스나 메서드 호출이 다른 실행 결과를 가져올 수 있도록 한다.
동적 다형성 (Dynamic Polymorphism)
- 실행 시간에 결정되며, 메서드 오버라이딩을 통해 구현된다.
- 예: 자바에서
Animal
클래스를 상속받는 Dog
와 Cat
클래스가 speak()
메서드를 다르게 구현하여 사용할 때.
정적 다형성 (Static Polymorphism)
- 컴파일 시에 결정되며, 메서드 오버로딩을 통해 구현된다.
- 예: 같은 이름의 함수지만 다른 파라미터를 받아 다르게 동작하는 경우.
오버로딩과 오버라이딩
-
오버로딩 (Overloading):
- 동일한 함수명을 여러 번 정의하지만, 매개변수의 유형이나 개수가 다른 경우.
- 컴파일 시간에 결정되며, 다형성의 한 형태를 제공한다.
-
오버라이딩 (Overriding):
- 상속받은 메서드의 기능을 하위 클래스에서 변경하는 것.
- 실행 시간에 다형성을 제공하며, 상위 클래스의 메서드를 하위 클래스가 구체화한다.
클래스와 객체지향 언어
- 모든 클래스가 있는 언어가 객체지향 언어는 아니다. 예를 들어, C는 구조체를 통해 제한적인 객체지향 기능을 사용할 수 있지만, 객체지향 언어로 분류되지는 않는다.
- 반면, 객체지향 프로그래밍을 지원하는 언어들은 클래스를 기반으로 하여 인스턴스화 가능한 객체와 상속 구조를 제공한다.