다시 생각해 보니 OOP를 3개의 요소로 정의할 수 있다는게 참으로 말이 된데는 것 같다.
===================================================================
오늘 갑자기 지하철 타고 집에 오는 길에 이것에 대해 고민을 해봤습니다. 요즘 회사에서 객체지향에 대해 공부하다 보니 여기에 대해서 조금씩 정리가 되기 시작했습니다. 이 느낌을 살려 이 때 정리해 두어야 겠다는 생각이 들어서 이 글을 씁니다.
일반적으로 OOP의 3대 요소를 캡슐화(encapsulation ), 다형성(polymorphism ), 상속성(Inheritance)이라고 합니다.
우선 캡슐화에 대해 설명해 보겠습니다. 사실 전 이 캡슐화라는게 OOP의 3대 요소에 들어 있다는데 의문입니다. 제 생각에는 캡슐화라는 용어보다 abstraction(추상화)이라는 용어가 더 절적하다고 생각합니다. (자바를 배운 사람이라면 abstraction 이라는 단어를 듣자마자 자바 키워드 abstract 생각날 것 입니다. 근데 그것만 연결하지 말고 생각해주기 바랍니다. 우리말 그대로 추상화라고만 생각해 주세요. )
추상이라는 단어 자체가 너무 추상적이라서 어렵게 느껴질 수도 있습니다. 우리가 보통 추상이라고 하면 그 자체의 본질에 대해 성찰하는 것을 의미합니다. 이 단어를 소프트웨어 공학에 적용해 본다면 겉으로 보이는 성질에 대해서만 성찰한다고 생각하면 됩니다. 더 쉽게 설명하자면 public 과 private를 분리해서 public 만 보겠다라고 생각하면 됩니다. 그리고 추상화의 도구를 캡슐화 라고 합니다. 캡슐화 의미 자체로는 private 인터페이스를 의미한다고 생각하면 됩니다. 이렇게 private 을 만들면 상대적으로 public 인터페이스는 줄어들게 됩니다. 그 결과 우리는 그 본질에 대해서 더 다가 갈 수 있습니다. 그래서 캡슐화를 추상화의 도구라고 생각할 수 있습니다.
다음은 상속에 대해서는 소스 재사용을 의미한다고 생각하면 됩니다. 상속 자체의 의미는 upcasting을 통한 다형성 이용이라는 의미도 있지만 여기서는 다형성을 3번째 요소로 보았기 때문에 소스 재사용을 의미합니다. 상속은 다른 말로 "Is a" 또는 "is a(an)" abstraction 이라고도 합니다. 이 개념에 대비되는 개념으로 "has a" 라는 용어가 있는데, 정식 용어는 아니고 더 정확한 용어로는 composition이라고 합니다.
마지막으로 다형성은 C++의 virtual 키워드 연결됩니다. (자바에서는 자동으로 virtual 이기 때문에 이 개념이 기본적으로 들어 있습니다. 그러나 이 동작은 시간이 걸리는 연산인데 C++은 "no use, no pay 라는 개념이 있기 때문에 사용을 원치 않을 때 제거할 수 있습니다. ) 또 interface 상속이라는 말도 이 다형성에 대한 개념입니다. 인터페이스만 맞으면 어떤 객체의 method든지 가리지 않고 사용하겠다는 개념입니다. 다시말해 method 이름과 형식이 같고 어떤 조건(자바에서 인터페이스만 상속하거나 C++이나 자바에서 parent class 가 그 method의 인터페이스를 정의하고 있을 때)을 만족하면 그 객체에 맞는 method를 알아서 부르겠다는 의미 입니다.
===================================================================
오늘 갑자기 지하철 타고 집에 오는 길에 이것에 대해 고민을 해봤습니다. 요즘 회사에서 객체지향에 대해 공부하다 보니 여기에 대해서 조금씩 정리가 되기 시작했습니다. 이 느낌을 살려 이 때 정리해 두어야 겠다는 생각이 들어서 이 글을 씁니다.
일반적으로 OOP의 3대 요소를 캡슐화(encapsulation ), 다형성(polymorphism ), 상속성(Inheritance)이라고 합니다.
우선 캡슐화에 대해 설명해 보겠습니다. 사실 전 이 캡슐화라는게 OOP의 3대 요소에 들어 있다는데 의문입니다. 제 생각에는 캡슐화라는 용어보다 abstraction(추상화)이라는 용어가 더 절적하다고 생각합니다. (자바를 배운 사람이라면 abstraction 이라는 단어를 듣자마자 자바 키워드 abstract 생각날 것 입니다. 근데 그것만 연결하지 말고 생각해주기 바랍니다. 우리말 그대로 추상화라고만 생각해 주세요. )
추상이라는 단어 자체가 너무 추상적이라서 어렵게 느껴질 수도 있습니다. 우리가 보통 추상이라고 하면 그 자체의 본질에 대해 성찰하는 것을 의미합니다. 이 단어를 소프트웨어 공학에 적용해 본다면 겉으로 보이는 성질에 대해서만 성찰한다고 생각하면 됩니다. 더 쉽게 설명하자면 public 과 private를 분리해서 public 만 보겠다라고 생각하면 됩니다. 그리고 추상화의 도구를 캡슐화 라고 합니다. 캡슐화 의미 자체로는 private 인터페이스를 의미한다고 생각하면 됩니다. 이렇게 private 을 만들면 상대적으로 public 인터페이스는 줄어들게 됩니다. 그 결과 우리는 그 본질에 대해서 더 다가 갈 수 있습니다. 그래서 캡슐화를 추상화의 도구라고 생각할 수 있습니다.
다음은 상속에 대해서는 소스 재사용을 의미한다고 생각하면 됩니다. 상속 자체의 의미는 upcasting을 통한 다형성 이용이라는 의미도 있지만 여기서는 다형성을 3번째 요소로 보았기 때문에 소스 재사용을 의미합니다. 상속은 다른 말로 "Is a" 또는 "is a(an)" abstraction 이라고도 합니다. 이 개념에 대비되는 개념으로 "has a" 라는 용어가 있는데, 정식 용어는 아니고 더 정확한 용어로는 composition이라고 합니다.
마지막으로 다형성은 C++의 virtual 키워드 연결됩니다. (자바에서는 자동으로 virtual 이기 때문에 이 개념이 기본적으로 들어 있습니다. 그러나 이 동작은 시간이 걸리는 연산인데 C++은 "no use, no pay 라는 개념이 있기 때문에 사용을 원치 않을 때 제거할 수 있습니다. ) 또 interface 상속이라는 말도 이 다형성에 대한 개념입니다. 인터페이스만 맞으면 어떤 객체의 method든지 가리지 않고 사용하겠다는 개념입니다. 다시말해 method 이름과 형식이 같고 어떤 조건(자바에서 인터페이스만 상속하거나 C++이나 자바에서 parent class 가 그 method의 인터페이스를 정의하고 있을 때)을 만족하면 그 객체에 맞는 method를 알아서 부르겠다는 의미 입니다.