객체 지향 프로그래밍은 객체를 최소단위로 하여 객체간 통신을 통해 프로그램을 구현하는 방법론을 의미합니다. 소프트웨어를 개발하는데 사이즈가 커지고, 비용이 증가하면서 소프트웨어를 구성하는 최소 단위를 객체로 정의하면서 빠르고 쉽게 프로그래밍이 가능해집니다.
객체 지향 프로그래밍
현실속 속성과 메소드가 결합된 형태로 객체를 구현합니다. 속성에 대한 기능을 담당하는 부분을 메소드로 표현하고, 데이터를 저장하는 변수를 멤버 또는 속성이라고 표현합니다.
속성 VS 메소드?
객체는 클래스 형태로 조직화되고, 인스턴스로 만들어 멤버와 메소드를 사용할 수 있게 됩니다.
장점
객체 지향 프로그래밍을 통해 프로그래밍 복잡도를 줄일 수 있습니다. 또한 객체를 재사용하면서 소프트웨어의 확장성과 유지보수를 용이하게 할 수 있습니다. 가장 좋은 점은 현실 세계와 거의 유사한 형태로 소프트웨어를 구성할 수 있다는 점입니다.
단점
객체 지향 프로그래밍을 사용할 경우 실행속도가 느려질 수 있고, 객체를 설계하는 작업의 난이도가 상승합니다.
객체 지향 프로그래밍 개념
클래스(Class)
객체의 타입을 정의하고 객체를 구성하는 하나의 틀입니다. 유사한 성격의 속성과 메소드를 한데 묶어 놓은 데이터 추상화 단위입니다. C 언어의 구조체를 발전시킨 개념이라고 이해하면 쉽습니다.
객체(Object)
클래스 단위로 추상화된 데이터들을 사용할 수 있는 대상의 총칭입니다. 객체 마다 고유한 속성을 가질 수 있고, 클래스에 정의된 메소드를 사용할 수 있습니다.
인스턴스(Instance)
특정 클래스를 구현한 객체를 의미합니다. 좁은 범위의 객체입니다.
객체 지향 프로그래밍 기술
① 캡슐화(Encapsulation)
속성과 메소드를 하나로 묶어 정보은닉을 가능하게 합니다. 정보은닉이란 클래스 내부에 속성과 메소드를 예상할 수 없는 외부의 side-effect로 부터 보호하는 개념입니다.
캡슐화를 통해 외부에 정보를 노출하지 않고, 객체를 구성할 수 있고, 코드의 재사용성을 높일 수 있습니다.
② 추상화(Abstract)
하위 클래스 구현을 위한 하나의 틀을 제공하는 개념입니다. 상세한 구현은 하위 클래스에서 작성합니다. 현실 세계를 추상화 단위로 구현할 수 있어 안정된 모델링이 가능해집니다.
추상화의 종류로는 기능 추상화 , 자료 추상화, 제어 추상화가 있습니다.
③ 상속(Inheritance)
상위 클래스의 속성과 메소드를 하위 클래스에서 사용할 수 있도록 확장하는 기술입니다. 상위 클래스의 데이터를 하위 클래스에서 구체화 하여 사용하면서 코드 재사용이 가능해집니다.
특히 동일 수준의 클래스를 동시에 상속하는 경우 다중 상속이라고 합니다.
④ 다형성(Polymorphism)
상위 클래스를 상속한 하위 객체들이 다른 형태를 가질 수 있는 기술입니다. 대표적으로 오버로딩과 오버라이딩 기술이 있습니다.
- 오버로딩(Overloading) : 같은 이름을 가진 메소드들을 매개변수의 타입과 갯수로 식별해 호출하는 기능입니다.
class User{
public String greeting(String data){
return data;
}
public Number greeting(Number data){
return data;
}
}
- 오버라이딩(Overriding) : 상속받은 클래스의 메소드 내부를 새롭게 정의해 사용할 수 있는 기능입니다.
class User{
public String greeting(String data){
return data;
}
}
class Person extends User{
public char _val = 'h';
public String greeting(String data){
return data + _val;
}
}
객체 지향 프로그래밍 철학
① 단일 책임(Single Responsibility)
하나의 클래스가 제공하는 모든 기능한 한개의 책임을 수행합니다. 클래스를 변경하는 이유가 여러가지가 아니라 단 하나여야 합니다. 소프트웨어를 구성하면서 클래스 별로 독립적인 기능을 부여하기 때뭉네 낮은 결합도, 높은 응집도를 구현해낼 수 있습니다.
② 개방 폐쇄(Open-Closed)
소프트웨어의 구성 요소들은 확장에는 개방적이지만 변경에는 닫혀 있어야 합니다. 소프트웨어의 안정성과 내구도를 높여주빈다.
③ 리스코프 치환(Liskov Substitution)
하위 클래스는 항상 상위 클래스로 호환 가능하지만 하위 클래스는 상위 클래스가 정의한 제약사항을 반드시 준수해야 합니다.
④ 인터페이스 분리(Interface Segregation)
사용하지 않는 인터페이스에 의해 시스템이 영향을 받아서는 안됩니다. 사용되지 않는 인터페이스는 구현 자체가 되면 안됩니다. 일반적인 목적으로 만들어진 인터페이스 하나보다 여러개의 독립적인 기능을 가진 인터페이스를 구현해야 합니다.
⑤ 의존성 뒤집기(Dependency Inversion)
하위 클래스 변경사항은 상위클래스에 영향을 줘서는 안됩니다. 복잡한 컴포넌트들의 관계를 단순화 시키고 효율적인 통신이 가능하게 합니다.
추상 클래스는 왜 쓰는 걸까?
추상 클래스(Abstract Class) 는 클래스의 전체적인 설계를 위해 사용됩니다. 구현부는 생략되고 선언부만 모아놓은 클래스로 추상 클래스에 선언되는 메소드들은 추상 메소드 입니다. 클래스 자체를 추상화시키면서, 기능을 독립시킬 수 있고, 객체지향 설계의 원칙인 단일책임, 인터페이스 분리의 철학을 지킬 수 있습니다.
추상 클래스를 상속하는 하위 클래스는 반드시 모든 추상 메소드들을 오버라이딩 해서 사용해야 합니다. 만약 상속한 하위 클래스에서도 구현부가 없는 추상 메소드가 있다면 인스턴스 생성이 불간으합니다.
추상 클래스를 구현할 때는 abstract 키워드를 사용합니다. 구현부는 비워둡니다.
인터페이스란?
인터페이스는 다중 상속을 지원하기 위해 도입된 개념입니다. 둘 이상의 클래스를 동시에 상속하는 경우 상속 관계가 복잡해지고, 사이드 이펙트가 발생하기 때문에 상위 클래스를 최대한 단순하게 만들어야 합니다.
인터페이스란 모든 메소드가 추상메소드로 구성되어 있는 추상 클래스 입니다. 일반적인 클래스와 달리 기능을 확장하는 개념 보다는 다형성을 주입하기 위해 사용됩니다.
인터페이스를 구현할 때는 extends로 상속하지 않고, implements 키워드를 통해 상속합니다. 인터페이스를 통해 단순화되고, 직관적인 상속 관계를 구현해 낼 수 있습니다.
🚀️ 도움이 되셨다면 구독과 좋아요 부탁드립니다 👍️
'Programming' 카테고리의 다른 글
GET POST 차이점 💡 (0) | 2022.10.14 |
---|---|
Typescript 인터페이스 타입 차이점? (0) | 2022.10.13 |
브라우저 주소창에 URL을 입력하면 어떻게 될까? (0) | 2022.10.12 |
Do it 타입스크립트 프로그래밍 후기 💡 (0) | 2022.10.11 |
Typescript로 express 1분만에 실행하기 (0) | 2022.10.10 |
댓글