개발 일기

[0718] 객체지향과 동적 바인딩 본문

TIL(Today I learned)

[0718] 객체지향과 동적 바인딩

flow123 2022. 7. 18. 22:33

Alan K가 주장한 객체 지향의 핵심이 뭐죠? 

 

갑자기 멘토님이 던지신 질문이었다. 

독립된 객체들끼리 메시지를 주고 받으면서 협력한다. 이렇게 답했는데, 하나 놓친 게 있었다. 다시 정리해보자. 

Alan K의 글을 보면, 흔히 객체지향은 캡상추다(캡슐화, 상속, 추상화, 다형성) 과는 조금 다르다. 

글을 보면 캡상추다는 나중에 나온 개념이고,

아래 Alan Kay가 객체 지향 프로그래밍에 대해 주고 받은 서신을 보면.

마지막 단락이 핵심이다. 

 

"OOP to me means only messaging, local retention and protection  and hiding of state-process, and extreme late-binding of all things."

 

"객체 지향은 객체 간의 메시징, 캡슐화, 그리고 동적 바인딩이다."

 

 

Dr. Alan Kay on the Meaning of "Object-Oriented Programming"

Dr. Alan Kay  on the Meaning of “Object-Oriented Programming” (To link to this page, please use the canonical URI "https://www.purl.org/stefan_ram/pub/doc_kay_oop_en" only, because any other URI is valid only temporarily.) E-Mail of 2003-07-23 Dr. Ala

userpage.fu-berlin.de

 

객체지향 프로그래밍은 아래 개념에서 시작한다. 

 

-모든 것은 객체가 될 수 있다. 

-독립된 객체들끼리 메시지를 주고 받으면서 협력한다.

*객체지향에서는 클래스로 추상화를 한다. 이렇게 하면 변경가능한 데이터를 공유하는 일은 없어지고, 독립된 개체가 서로 메시지를 주고받는 관계만 남는다. 

-지연(동적) 바인딩 

 

객체 지향 프로그래밍의 장점은? 

 

위의 세 가지 속성과 연결지어 보자. 

 

(1) private 키워드 등을 활용해서 변경이 가능한 공유데이터를 최소로 줄일 수 있다 (캡슐화)

다른 객체의 상태를 알아내거나 바꾸려면, 해당 객체가 정해놓은 형식으로 메시지를 보내야 하기 때문이다.

결합도 낮고 응집도 높다. 

 

(2) How를 쉽게 바꿀 수 있다. 

메시지를 받는 부분만 유지 된다면, 실제 처리하는 코드가 바뀌어도 실행에 문제되지 않는다 (즉, 클라이언트 입장에서 몰라도 된다) 고로 기능의 변경이 쉬워진다. 확장에는 열려있고 변경에는 닫혀있는 OCP 원칙이 가능해진다.

 

(3) 메시지를 실제로 처리하는 객체를 쉽게 바꿀 수 있다. 

동적 바인딩이 가능하기 때문이다. 

 

(4) 결합도가 낮고 응집도가 높다 (그럴 수록 좋다!)
결합도:  다른 모듈에 대해서 꼭 필요한, 알아야할 지식만 갖고 있는다. 인터페이스에 의존하면, 변경점이 생겼을 때
해당 인터페이스의 변경에 의존하면 되기 때문에 결합도가 낮다. 즉, 변경의 여파가 다른 객체에 영향을 주지 않는 것.


응집도: 모듈 내의 요소들이 하나의 목적을 위해 긴밀하게 협력한다면 그 모듈은 높은 응집도를 가진다.
모듈 내의 요소들이 서로 다른 목적을 추구한다면 그 모듈은 낮은 응집도를 가진다.
결합도/응집도 말이 비슷해서 헷갈리는데, 한 조직이 얼마나 똘똘 뭉쳐서 끈끈한가?라고 연상해보면 쉽게 기억날 것 같다.

 

동적 바인딩이란

-메시지를 보내는 코드는 컴파일 타임에 결정되지만, 실제 어떤 객체가 메시지를 받아서 처리할 때는 런타임에 결정된다는 것.

-동적 바인딩은 다용도 드라이버와 같다. 손잡이 - 드라이버의 연결부분은 통일 되어 있다. 그리고 여러 드라이버를 만들어주면, 작업 중에 바꿔가며 다용도로 쓸 수 있다. 

 

*정적 바인딩이란?

컴파일 시 이미 값이 확정 되어 있음. 실행시 효율이 높아지고, 값이 변하지 않아서 안정적이다. 

자바에서 static 으로 선언되는 것은 모두 정적 바인딩

참고: https://todayscoding.tistory.com/16

동적 바인딩의 장/단점

장점: 유연하고 값이 변할 수 있다. 

단점: 어떤 값이 들어올지 모름. 들어올 값보다 많은 메모리 공간 차지하고 있어서, 메모리 공간 낭비 됨. 

들어오는 값이 메모리 타입에 맞는지 확인하기 때문에, 속도가 늦어짐. 

 

참고

https://velog.io/@eddy_song/alan-kay-OOP

 

창시자 앨런 케이가 말하는, 객체 지향 프로그래밍의 본질

앨런 케이는 '객체 지향 프로그래밍'이라는 네이밍을 잘못 지었다고 인정했다.

velog.io

http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en

 

Dr. Alan Kay on the Meaning of "Object-Oriented Programming"

Dr. Alan Kay  on the Meaning of “Object-Oriented Programming” (To link to this page, please use the canonical URI "https://www.purl.org/stefan_ram/pub/doc_kay_oop_en" only, because any other URI is valid only temporarily.) E-Mail of 2003-07-23 Dr. Ala

userpage.fu-berlin.de

https://todayscoding.tistory.com/16

Comments