2022-12-10-TIL
2022-12-10-TIL
Today I Learned
객체지향 프로그래밍(OOP)의 기본 개념을 다시 정리했다. 다형성과 추상화를 따로 보고, 앨런 케이가 OOP라는 말을 만들 때 의도했던 의미를 함께 읽었다.
OOP
객체지향은 프로그램을 데이터와 그 데이터를 다루는 행동을 묶은 객체들의 협력으로 구성하는 방식이다. 흔히 캡슐화, 상속, 다형성, 추상화를 4대 특징으로 꼽지만, 이 목록 자체보다 “책임을 어느 객체에 둘 것인가”를 결정하는 기준으로 이해하는 편이 실무에서 더 쓸모가 있다.
디자인 패턴은 이런 객체 설계에서 반복적으로 나타나는 문제와 그 해결 구조에 이름을 붙인 것이다. refactoring.guru는 패턴을 그대로 복사해 쓰는 코드 조각이 아니라 상황에 맞게 변형해 적용하는 일반적인 설계 청사진으로 설명한다.
- https://fir-screen-46c.notion.site/2022-12-06-380cfc3c2a1948cbaa11e4d9cd6598e8
- https://refactoring.guru/ko/design-patterns/what-is-pattern
다형성(Polymorphism)
다형성은 같은 메시지를 보냈을 때 받는 객체의 실제 타입에 따라 다른 동작이 실행되는 성질이다. 자바에서는 주로 인터페이스나 상위 타입으로 변수를 선언하고, 런타임에 구현체의 메서드가 호출되는 동적 바인딩(오버라이딩)으로 드러난다. 오버로딩처럼 컴파일 시점에 결정되는 정적 다형성도 있다.
다형성의 실익은 호출하는 쪽이 구체 타입을 몰라도 된다는 데 있다. 조건문으로 타입을 분기하던 코드를 구현체별 메서드로 옮기면, 새로운 타입을 추가해도 호출부를 고칠 필요가 없어진다.
1
2
3
4
5
6
7
interface Discount { int apply(int price); }
class RateDiscount implements Discount { public int apply(int p) { return p * 9 / 10; } }
class AmountDiscount implements Discount { public int apply(int p) { return p - 1000; } }
int pay(int price, Discount discount) {
return discount.apply(price); // 어떤 할인인지 몰라도 된다
}
- https://tecoble.techcourse.co.kr/post/2020-10-27-polymorphism/
앨런 케이가 말하는 OOP의 본질
OOP라는 용어를 만든 앨런 케이는 2003년 이메일에서 자신에게 OOP는 메시징, 상태의 지역적 보존과 은닉, 그리고 “extreme late-binding of all things”뿐이라고 답했다. 클래스와 상속이 아니라 객체끼리 메시지를 주고받는 구조, 그리고 무엇이 실행될지를 최대한 늦게 결정하는 성질이 핵심이라는 뜻이다.
이 관점에서 보면 객체는 내부 상태를 직접 노출하지 않고 메시지에만 응답하는 작은 컴퓨터에 가깝다. 아래 글들은 이 메일을 번역하거나, 오늘날 자바식 OOP가 클래스 계층 중심으로 흘러간 과정과 케이의 의도를 비교한다.
- https://velog.io/@eddy_song/alan-kay-OOP
- http://mfadhel.com/lost-oop/
- https://ovid.github.io/articles/alan-kay-and-oo-programming.html
- https://johngrib.github.io/wiki/OOP-to-me-Alan-Kay/#:~:text=systems%20in%20which%20this%20is,m%20not%20aware%20of%20them.&text=%EC%9D%B4%20%EB%82%B4%EC%9A%A9%EC%9D%84%20%EB%B2%88%EC%97%AD%ED%95%98%EC%9E%90%EB%A9%B4,%EA%B7%B9%EB%8B%A8%EC%A0%81%EC%9D%B8%20%EC%A7%80%EC%97%B0%20%EB%B0%94%EC%9D%B8%EB%94%A9%20%EB%BF%90%EC%9E%85%EB%8B%88%EB%8B%A4.
- http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en
추상화란?
추상화는 대상에서 지금 문제에 필요한 성질만 남기고 나머지를 감추는 것이다. 코드에서는 공통 동작을 인터페이스나 추상 클래스로 뽑아내는 형태로 나타나며, 위의 Discount처럼 “가격에 할인을 적용한다”는 개념만 남기고 계산 방식은 구현체에 맡긴다. 추상화가 있어야 다형성이 성립하고, 캡슐화로 세부 구현을 숨길 수 있다.
- https://choi3950.tistory.com/25
댓글
아직 댓글이 없습니다