먼저 객체란 어떠한 물체나 대상을 나타내고 그것들을 모두 객체라고 한다.
사람도 한명 한명 다 객체고 지금 우리 주변에 있는 모니터, 키보드 ,노트, 펜 등 모두 객체라고 할 수 있다.
OOP는 어떠한 언어나 특정 라이브러리를 지칭하는 것이 아닌 객체의 관점에서 프로그래밍을 하는 것을 말한다.
프로그램을 유연하고 변경이 용이하게 만들고 개발과 보수를 간편하게 만든다. 또한 직관적인 코드 분석을 가능하게 한다.
스마트폰 공장을 예로 들어보자
만약 새로운 스마트폰을 만들때 마다 공장을 새롭게 지어야 된다고 생각해봅시다. 너무 귀찮고 비효율적일 것 같지 않나요?
코드로 작성했을 때도 같은 느낌일 것입니다!
const 아이폰6공장 = {
name : '아이폰6',
size : 4.7,
camera : 'single',
make : function() {
console.log(`${this.name}을 생산합니다`)
}
}
const 아이폰x공장 = {
name: '아이폰x',
size : 5.5,
camera : 'dual',
make : function() {
console.log(`${this.name}을 생산합니다`)
}
}
const 아이폰12공장 = {
name: '아이폰12',
size : 6,
camera : 'triple',
make : function() {
console.log(`${this.name}을 생산합니다`)
}
}
한눈에 봐도 너무 비효율 적이고 중복되는 부분이 많지 않나요? 자세히 보면 셋의 성격은 모두 다르지만 생산 방식은 똑같은걸 확인 할 수 있습니다.
그럼 어떻게 해야 스마트폰이 출시 할때 마다 쉽고 간단하게 찍어 낼 수 있을까요.
class를 이용하면 간단할 것 입니다!
class 스마트폰공장 {
constructor(name, size, camera){
this.name = name;
this.size = size;
this.camera = camera
}
make(){
console.log(`${this.name}을 생산합니다.`)
}
}
const 아이폰6 = new 스마트폰공장('아이폰6', 4.7,'single') // {name: "아이폰6", size: 4.7, camera: "single"}
const 아이폰15 = new 스마트폰공장('아이폰15', 7,'penta')
아이폰6.make() // 아이폰6을 생산합니다
많이 간편해지지 않았나요? const 이름 = new 스마트폰공장(name, size, camera)
으로 어떤 스마트폰이라도 간편하게 찍어 낼 수 있게 되었습니다.
OOP는 캡슐화 (Encapsulation)
, 추상화 (Abstraction)
, 상속 (Inheritance)
, 다형성 (Polymorphism)
의 4가지 특징을 가지고 있다.
복잡도를 줄여주고 재사용성을 늘려주고 노출 시킬 필요가 없는 정보를 은닉할 수 있다는 장점이 있다.
추상화는 관련없는 부분을 제거하고 필요한 부분만 표현하기 위한 개념이다.
상속은 부모 클래스를 가져와 같은 속성과 행위를 재사용하는 것을 의미합니다.
새로운 기능을 추가하고 싶을 때도 사용합니다!
위와 같이 예를 들어 아이폰과 갤럭시는 서로 다른 스마트폰이지만 서로 같은 속성을 가지고 있는 부분도 많기 때문에 만약 아이폰공장을 토대로 갤럭시공장을 짓는다면 갤럭시공장은 아이폰공장과 겹치는 속성을 상속받아 재사용할 수 있을 것 같습니다.
다향성은 형태가 다른데 다른 기능을 하는 것을 의미하고 부모 클래스로부터 상속을 받은 속성에 대해, 자식 클래스에서 물려받은 속성을 재정의 할 수 있다.
예를 들어
만약 갤럭시공장이 아이폰공장을 상속해 온다면 아이폰공장의 브랜드속성도 가져오게 될텐데 아이폰공장의 브랜드는 애플일 것이다. 이를 갤럭시공장에서 삼성으로 재정의 하는것을 오버라이딩이라고 한다.