OOP : Object-Oriented Programming
컴퓨터 프로그래밍의 패러다임 중 하나로서, 현실 세계의 개념을 추상화를 통해서 상태와 행위를 가진 객체로 만들고 그 객체들 간의 유기적인 상호작용을 중심으로 프로그램을 구성하는 방법이다.
쉽게 말해, 객체를 만들고 그 객체들의 관계를 중심으로 프로그램을 구성하는 프로그래밍 방법인 것이다 :D
객체 지향 프로그래밍의 특징은 대표적으로 4가지가 있다.
복잡한 실세계를 프로그램으로 옮기는 과정에서, 불필요한 정보는 숨기고 공통된 특징만 강조함으로써 프로그램을 간단하게 만드는 것이다.
관련된 데이터와 메소드를 하나로 묶고, 외부로부터 내부를 감싸 은닉하는 것이다. 추상화를 통해 끌어낸 특성을 묶어내 감추는 (분류를 통해 여러 개의 캡슐로 만들어 두는) 과정이기에 '캡슐화'라고 한다.
특성을 끌어내는 것이 추상화, 끌어낸 특성을 묶어내 은닉하는[세부적인 내용을 감추는] 것이 캡슐화라고 이해하면 좋겠다 :>하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것을 말한다.
하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석될 수 있는 것이다. 즉, 오버라이딩과 오버로딩이 가능함을 말한다.
- 오버라이딩 : 상위 클래스의 메소드를 하위 클래스가 재정의
- 오버로딩 : 이름만 같고 매개변수의 개수/자료형이 다른 메소드를 정의
🎯객체 지향 프로그래밍과 절차 지향 프로그래밍?
절차 지향 프로그래밍은 '순차적 실행'에 초점을 맞추는 프로그래밍 방식이고, 객체 지향 프로그래밍은 객체와 그 '관계'에 초점을 맞추는 방식이다.
다음은 절차 지향 프로그래밍의 장점이다.
- 빠른 실행 속도 : 물이 흐르는 듯한 순차적인 처리 방식이 컴퓨터의 작업 처리 방식과 유사하기 때문에 객체 지향적 방식에 비해 빠르다.
여기서, 절차 지향 프로그래밍이라고 해서 객체를 다루지 않는 것이 아니고, 객체 지향 프로그래밍을 다루지 않는 것이 아니므로 객체 지향 프로그래밍과 절차 지향 프로그래밍은 반대 개념이 아님을 유의하자.
Single Responsibility Principle
하나의 클래스는 단 하나의 책임만 가져야 한다.
단일 책임 원칙을 지키지 않을 경우 한 책임[기능]의 변경에 의해 다른 책임과 관련된 코드에 영향이 갈 수 있다. 단일 책임 원칙에 따라 하나의 클래스가 오직 하나의 책임만 가진다면, 변경이 필요할 때 수정할 대상이 하나로 명확해진다.
Open/Closed Principle
소프트웨어 요소는 확장에 대해 열려 있고 수정에 대해 닫혀 있어야 한다. 즉, 기능의 추가[확장]는 기존의 코드를 변경하지 않고도 가능해야 한다.
Liskov Substitution Principle
상위 타입을 사용하는 프로그램에서, 상위 타입의 객체를 하위 타입의 객체로 치환(업캐스팅)해도 정상적으로 작동해야 한다.
이를 위해서, 자식 클래스는 언제나 부모 클래스를 대체할 수 있도록 상속받아야 한다. 즉, 부모 것을 대신해도 정상적으로 작동하게끔 상속받아야 하며, 그럴 수 없다면 상속받지 않도록 한다.
Interface Segregation Principle
하나의 일반적인 인터페이스가 아닌 여러 개의 구체적인 인터페이스로 분리해 사용해야 한다.
인터페이스 분리 원칙을 준수함으로써 모든 클라이언트가 자신의 관심에 맞는 인터페이스만을 접근하여 불필요한 간섭을 최소화할 수 있다.
Dependency Inversion Principle
더 일반적이고 추상적인 것에 의존해야 하며, (반대로) 구체적인 것에 의존해선 안 된다.
여기서 의존은 쉽게 말해 '다른 것을 가져와서 쓰는 것'이다. 예를 들어, Fruit를 상속받는 Apple, Orange 클래스가 있을 때 '간식'의 데이터 타입을 Apple이나 Orange로 정해둘 것이 아니라[하위 개념에 의존하지 않고] Fruit로 두는 것[상위 개념에 의존함]이 좋다!('간식'을 Apple에서 Orange로 변경할 경우 코드 자체를 수정하게 되는 일을 방지)