shurain

Harmless stuff is for the weak.

Object Oriented Programming

Mar 05, 15

Q: OOP를 제대로 하는 방법을 몸에 익히고 싶어요! 어떤 방법이 있을까요?

A: 최소한 10년 정도는 열심히 노력하는 것이 가장 좋은 방법이라고 생각합니다.

Abstruse Goose | How to Teach Yourself Programming

Do a lot of recreational programming. Have fun hacking but remember to learn from your mistakes.

Interact with other programmers. Work on programming projects together. Learn from them.

무언가 배우고 싶다면 이를 사용하고, 실수하는 과정이 필수적입니다. Teach Yourself Programming in Ten Years의 일독을 권합니다.

일반론을 이야기해봅시다. 왜 Object Oriented Programming (OOP)를 익히고 싶은가요? 질문자의 의도는 모르겠으나 과거의 제가 만약 같은 질문을 던졌다면 프로그래밍을 더 잘하고 싶다는 욕구에서 비롯됐을 것 같습니다. 아마 저는 OOP 패러다임이 무엇인지 어떤 의도로 만들어졌는지, 프로그래밍을 잘 한다는 것이 무엇인지 잘 모르는 상황에서 질문을 던졌을 것 같네요.

저는 프로그래밍의 큰 목표 중 하나가 복잡도 제어라고 생각합니다. 이를 위해 추상화abstraction나 간접화indirection, 분해decomposition 등의 일반적인 개념을 활용합니다. 다양한 패러다임은 나름의 방식으로 이런 개념을 구현하게 되죠. 객체 지향 언어에서는 객체를 기본적인 구성 요소로 사용하고 함수형 언어는 함수를 기본적인 구성요소로 사용하는 셈이죠. 그렇기에 프로그래밍을 잘 하고 싶다는 욕구만 놓고 생각해보면 OOP 외의 다른 선택지도 많이 있습니다.

Monolithic pieces of code are a bad idea. And our solution to monolithic code in Python are classes.

Start Writing More Classes | Armin Ronacher's Thoughts and Writings

OOP의 이야기를 해봅시다. 객체 지향 프로그래밍 패러다임은 한데 얽혀서 복잡한 코드가 만들어지는 상황을, 객체object를 사용해서 풀고자 하는 패러다임이라고 생각합니다.

  1. Everything is an object.

  2. Objects communicate by sending and receiving messages (in terms of objects).

  3. Objects have their own memory (in terms of objects).

  4. Every object is an instance of a class (which must be an object).

  5. The class holds the shared behavior for its instances (in the form of objects in a program list)

  6. To eval a program list, control is passed to the first object and the remainder is treated as its message.

Alan Kays Definition Of Object Oriented

위는 Alan Kay가 Smalltalk를 만들 때 생각한 디자인 원칙이라고 합니다. 그 자체로 객체 지향의 정의는 아니지만 객체 지향적인 언어가 어떤 원칙을 지키면 좋을지에 대한 한 가지 지침으로 받아들일 수 있겠죠. 이런 원칙을 염두에 두고 프로그래밍 훈련을 하면 더 빠르게 객체 지향을 통한 복잡도 제어에 익숙해지지 않을까 조심스레 추측해봅니다. 프로그래밍인 훈련은 앞서 언급한 것처럼 다양한 프로그래밍 경험을 하고 실수로부터 배우며, 다른 사람들과 협업을 하면서 그 과정에서 계속해서 배움을 추구하는 것입니다.