들어가며
- 문득 궁금해 졌습니다. 객체 지향이란 무엇이며, 이를 채용하는 언어는 어떠한 특성이 있을까?
- 객체 지향이란 무엇이며 객체 지향 언어가 가지고 있는 특성이 무엇인지, 또 interface, abstract, 상속, implements 등 여러 특성에 대해 진지하게 또 깊게 알고싶어 졌음.
먼저, 누군가가 정의한 객체 지향의 정의
객체 지향 프로그래밍 이란 캡슐화, 다형성, 상속을 이용하여 코드 재사용을 증가시키고, 유지보수를 감소시키는 장점을 얻기 위해 객체들을 연결시켜 프로그래밍 하는 것
인용
이는 개인적인 의견이 아니라 객체지향 용어를 발명한 사람의 의견 입니다. Bjarne Stroustrup 은 그의 문서 Why C++ is not just an Object Oriented Programming Language: 섹션 3 에서 지금의 널리 사용되는 “객체지향” 이라는 용어를 제시하였습니다.
언어 또는 기술은 다음을 직접 지원 한다면 객체 지향 이다.
- 추상화 - 클래스나 객체를 제공한다.
- 상속 - 이미 존재하는 것으로 부터 새로운 추상화를 만들어 낼 능력을 제공한다.
- 런타임 다형성 - 수행 시간에 바인딩 할 수 있는 어떠한 폼을 제공한다.
OOP와 non-OOP
non-OOP
gist:ppzxc/5c2fcb64f6c4d9712a81d7f142af0d87#non-OOP.c
- 함수는 필요한 것을 가진 코드 블록으로 정의됨
- 각 함수 이름은 애플리케이션에서 유일한 이름
접근 방법
variable = function(arg1, arg2); // 직접 접근
함수는 기본적으로 상태를 가지지 않음
- 호출 될때 마다 새로운 실행으로 취급
- 지역 변수는 초기화
OOP
gist:ppzxc/5c2fcb64f6c4d9712a81d7f142af0d87#OOP.java
- 클래스 메소드는 클래스 정의에서 경계점으로 규정됨.
- 클래스 이름이 애플리케이션에서 유일해야 함
- 각각의 클래스 내에서는 유일한 이름을 가지는 다수의 함수를 가질 수 있음
공통 함수/메소드 이름을 허용하는 것은 다형성에서 필요로 하는 공유 능력을 위해 존재
접근 방법
variable = new SomeClass();
variable = variable.function(arg1, arg2); // 객체를 통한 간접 접
OOP는 다수의 복제본을 가짐
SomeClass var1 = new SomeClass();
SomeClass var2 = new SomeClass();
SomeClass var3 = new SomeClass();
OOP는 상태를 가짐
- Class 내부 변수로 상태를 가지며, 이는 모두 클래스 내부에서 저장되거나 컨트롤 됨
번역 글의 결론
많은 사람들이 OOP의 의미를 서로 다른 단어로 묘사합니다. 문제는 그 단어들이 오역되기 쉽다는 것이죠. 루이스 캐롤의 험프티-덤프티가 자칭한 유리창 너머로 볼때 처럼.
내가 이 단어를 사용할 때는 내가 선택한 뜻을 의미해, 더도 덜도 아니야
OOP의 창작자가 사용한 단어를 사용할 때, 그 단어에 다른 뜻을 적용한다면, 다른 사람은 여러분의 단어를 또 다른 뜻으로 적용합니다. 그것은 원래와 전혀 관계 없는 것으로 끝이 납니다.
객체지향과 비객체지향을 구별하는 데에느 단지 세가지 기능이 있습니다. 이것들은 캡슐화, 상속, 다형성 입니다. 이거 이외에는 헛소리 입니다. 객체지향 프로그래밍은 프로그래밍 언어에서 이 기능들을 이용하는 것입니다. 높은 재사용성과 낮은 유지보수 비용은 보장될 수 없습니다. 전적으로 이 기능들을 어떻게 구현하느냐에 달려 있습니다.
몇몇 사람들은 내가 OOP에 대해 너무 단순한 관점을 가졌다고 비난합니다. “필요이상으로 단순화 시켰다거나”, “필요이상으로 복잡화 했다 거나” 라고 하는 대신에 말이죠. KISS 원칙의 오래된 추종자로써 나는 다른 사람들을 가르치기 쉬운 더욱 적절한 관점을 알고 있습니다.
출처: http://vandbt.tistory.com/10 [소프트웨어 디자인- Design Software by vandbt]
객체 지향의 5가지 특성
Object
데이터를 가지고 있습니다.
- 데이터는 객체의 상태를 기술하는 정보를 저장합니다.
행위의 집합을 가지고 있습니다.
- 이 행위들은 메세지를 받았을 때 객체가 어떻개 해야하는지 알고 있는 것 입니다.
개체를 구분하는 아이덴티티를 가지고 있습니다.
- 어떠한 객체를 다른 객체와 구분하는 것을 가능케 합니다.
Class
클래스는 객체를 생성할때 사용하는 청사진
- 실제 객체에 대한 코드를 절대로 직접 작성할 수 없으며, 그저 객체를 만드는데 사용되는 패턴을 작성할 뿐이다.
Encapsulation, 통으로 참고
여러분의 객체는 속성과 메소드로 만들어져 있습니다. 일부 속성과 메소드는 객체의 외부에서 접근할 수 있고 이것을 인터페이스 interface 라고 합니다. 다른 속성,메소드는 객체 자신만의 사적인 용도로 예약되어 있고 이것을 구현 implement 이라고 합니다. 구현으로 부터 인터페이스를 분리하는 것은 객체-지향 프로그램을 설계할 때 가장 중요한 결정 입니다.
구현으로 부터 인터페이스를 나누는 일의 가치를 살펴보자면, 자동차를 연상하면 쉬울 것입니다. 자동차의 인터페이스는 핸들, 가속 페달, 브레이크로 간단하고 규격화 되어 있습니다. 운전방법을 한번 배우기만 하면 됩니다. 반면에 자동차의 내부 동작은 점화, 실린더, 연료 분사 등등 매년 역동적으로 변경됩니다. 여러분이 각기 다른 타입의 자동차의 점화 시스템을 직접 통제해야 한다면, 새차를 운전하기란 매우 어렵다는 걸 알게 될겁니다.
잘-설계된 클래스 Well-Designed Class 는 이런 특성을 가지고 있습니다. 인터페이스는 여러분의 클래스와 어떻게 상호작용 해야 하는지 완벽하게 묘사합니다. 그리고 클래스의 대부분의 속성은 감추어 진다는 것을 의미합니다. 사용자는 데이터를 수정하기 위해서 메소드를 사용할 것입니다.
출처: http://vandbt.tistory.com/39 [소프트웨어 디자인- Design Software by vandbt]
Inheritance
"상속의 진가는 강력한 추상 구조화 이다."
- 새로운 종류의 서브클래스를 작성하면, 여려분은 부모 super class 에 이미 내장된 기능들을 사용할 수 있습니다.
- 상속의 진가는 추상화를 구조화 한다는데 있습니다.
Polymorphism
다형성은 객체-지향 프로그래밍의 기반 원칙입니다. "많은 형태 many shapes" 라는 뜻을 가진 그리스어에서 유래한 말로, 다형성은 캡슐화, 상속과 함께 작동해서 객체-지향 프로그램의 흐름 제어 flow of control 를 단순화 합니다.
다형성으로 조건문을 제거하라 Replace Conditional with Polymorphism(293) 객체 전문용어 가운데 가장 멋지게 들리는 말 중의 하나가 다형성(polymorphism)이다. 다형성의 진가는 동작이 그 타입에 따라 변하는 객체를 가지고 있을 때, 명시적으로 조건문을 사용하지 않아도 되도록 한다는 데 있다. 리팩토링, 마틴 파울러 지음/윤성준,조재박 옮김, 대청, p.293 마틴 파울러의 리팩토링의 Replace Conditional with Polymorphism(293)
끝으로
멘붕