Skip to content

Latest commit

 

History

History
82 lines (58 loc) · 4.74 KB

File metadata and controls

82 lines (58 loc) · 4.74 KB

객체 지향 프로그래밍

객체란 현실 세계의 실체 및 개념을 반영하는 상태와 행위를 정의한 데이터의 집합을 의미합니다.
객체 지향 프로그래밍이란 각자의 역할을 지닌 객체들끼리 서로 메시지를 주고받으며 동작할 수 있도록 프로그래밍하는 것을 뜻합니다.
객체를 중심으로 프로그래밍하기 때문에 사람의 관점에서 프로그램을 이해하고 파악하기 쉬우며 재사용성과 확장성, 융통성이 높습니다.
하지만 객체 간의 정보 교환이 메시지 교환으로 일어나기 때무에 많은 오버헤드가 발생할 수 있고 객체의 상태에 따른 예상치 못한 부작용이 발생할 수 있습니다.

객체 지향 프로그래밍 5대 설계 원칙: SOLID

1️⃣ SRP(Single Responsibility Principle)
단일 책임 원칙으로, 한 클래스에 단 하나의 책임, 기능만 가져야 한다는 원칙입니다.

2️⃣ OCP(Open-Closed Principle)
개방-폐쇄 원칙으로, 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야 한다는 원칙입니다.
확장에 대해서는 개방적(open)이고, 수정에 대해서는 폐쇄적(closed)이어야 한다는 의미를 가집니다.

3️⃣ LSP(Liskov Substituition Principle)
리스코프 치환 원칙으로, 자식 클래스는 최소한 부모 클래스의 기능은 수행할 수 있어야 한다는 원칙입니다.
프로그램의 최신 버전에서도 구버전에서 작성한 프로그램을 열 수 있도록 해야한다는 의미를 가집니다.

4️⃣ ISP(Interface Segregation Principle)
인터페이스 분리 원칙으로, 인터페이스는 그 인터페이스를 사용하는 클라이언트를 기준으로 분리해야 한다는 원칙입니다.

5️⃣ DIP(Dependency Inversion Principle)
의존 역전 원칙으로, 의존 관계 성립 시 추상성이 높은 클래스와 의존 관계를 맺어야 한다는 원칙입니다.
고수준 모듈은 저수준 모듈의 구현에 의존해서는 안된다는 의미로, 예를 들어 사자가 아닌 동물과 의존 관계를 맺어야 한다는 의미를 가집니다.

객체 지향의 특징

1️⃣ 추상화 Abstraction

현실의 객체를 추상화하여 클래스를 구성하는 것으로, 객체에서 공통된 속성이나 기능을 추출하는 것을 의미합니다.
중요한 것, 관심 대상인 것만을 강조해서 추출함으로써 프로그램의 복잡도를 관리할 수 있으며, 관점에 따라 추상화의 결과가 달라질 수 있습니다.

2️⃣ 캡슐화 Encapsulation

데이터 은닉과 보호를 위해 데이터를 외부에 직접 노출시키지 않고 메서드를 이용해 보호하는 특징을 말합니다.
내부의 데이터나 함수를 외부에서 참조하지 못하도록 차단하는 개념을 정보 은닉(Information Hiding)이라 하고,
이를 위해 관심있는 데이터와 기능을 모아 패킹한 것을 캡슐화라고 합니다.

3️⃣ 다형성 Polymorphism

하나의 객체를 여러 가지 타입으로 참조할 수 있는 특징입니다.
같은 코드라하더라도 상항에 따라 다른 방식으로 동작하는 성질로 Java에서 대표적으로 Overriding과 Overloading이 있습니다.

Overriding
임의의 클래스 다른 클래스를 상속 받거나 인터페이스를 구현했을 때, 상위 클래스 또는 인터페이스에 정의되어 있는 메소드를 재정의하여 사용하는 것입니다.
메소드 호출 시 재정의되어 있지 않다면 상위 클래스의 메소드 호출됩니다. 인터페이스는 오버라이딩이 강제됩니다.

SuperClass object = new SubClass();
object.fun();

✅ Overloading
메소드에 주어진 인자에 따라 동작을 다르게 구현하는 것으로, 코드의 중복이 줄어들고 독성이 늘어납니다.
메서드 이름과 리턴 타입이 같고 파라미터의 개수, 순서, 타입을 다르게 하여 구현할 수 있게 됩니다.

main(blabla) {
  SuperClass object = new SubClass();
  fun(object);
}

fun(SuperClass super) {
  blabla....
}

fun(SubClass sub) {
  blabla....
}

4️⃣ 상속 Inheritance

부모 클래스의 자산을 물려받아 자식을 정의함으로써 코드의 재사용이 가능하다는 특징입니다.

💡 클래스
객체를 만들기 위해 상태(field)와 행위(method)를 정의한 틀

💡 메시지
객체 지향 프로그래밍에서 객체들끼리 주고받으며 상호작용하는 것으로, 임의의 객체에게 인자(parameter)를 전달하여 메소드를 호출하고 반환값을 받아 처리합니다.