하드웨어 성능이 폭발적으로 성장하면서 소프트웨어에서 요구되는 기술이 점점 복잡하고 거대해지고 있습니다. 기존의 전통적인 절차지향 방법으로는 많은 어려움을 겪었습니다.
이러한 문제를 해결하기 위해 함수단위로 나누어 구조화하는 구조적 프로그래밍 방법이 대두되었습니다. 하지만 이러한 방법은 데이터를 처리하는 부분은 구조화할 수 있지만 데이터 자체는 구조화하지 못해 전역 네임스페이스 포화 문제(이름 짓기)를 야기합니다. 또한 데이터 상태에 따라 다르게 동작하는 함수들이 많아지면서 변수를 추적하는 것이 프로그램의 규모가 커질수록 어려워졌습니다.
{ Object-Oriented Programming }
이러한 문제를 해결하기 위해 객체지향 프로그래밍(Object-Oriented Programming)이 등장합니다.
객체지향은 큰 문제를 작게 쪼개는 방식이 아니라 작은 문제들을 해결할 수 있는 객체들을 만든 뒤, 조합해서 큰 문제를 해결하는 Bottom-up 방식을 지향합니다.
각각의 객체들은 독립적으로 운용이 가능하며 접근이 가능한 인터페이스를 제한하여 잘못 사용되어지는 경우를 최소화 할 수 있습니다.
public class dog {
name = 'cookie',
size = 'middle',
const shout = function() {
console.log('wal! wal!');
}
}
// public -> anyone
// private -> safe
// 강아지나 고양이의 공통적인 부분만 추상화한 클래스.
public class animal {
head = 1, // 머리는 하나
leg = 4, // 다리는 4개
ear = 2, // 귀는 2개
nose = 1, // ...이런식
tail = 1,
function shout(shout) {
console.log(shout);
}
// ...etc
}
class dog extends animal {
shout = animal.shout("wal wal");
// 출력.. wal wal
}
class cat extends animal {
shout = animal.shout("meow meow");
// 출력.. meow meow
}
이렇게 다형성을 사용하려면 오버라이딩과 오버로딩을 사용해야 한다.
class overLoading {
function over() {
console.log("Hello World");
}
function over(name) {
console.log("my name is" + name);
}
function over(name, age) {
console.log(`my name is ${name} and my age ${age}`);
}
}
이처럼 다형성은 같은 이름을 사용하여 메서드 이름을 낭비하지 않아도 되고 복잡하게 API를 늘릴 필요가 없게 만들어준다.
잘못된 표현이 있으면 댓글 달아주세요
Reference