OOP에서 강조되는 상속과 조합을 OOP언어로 개발하는 안드로이드의 예시를 들어 설명해보겠다!
상속은 정말 익숙한 개념이다. 대학교 2학년 때부터니 벌써 2년 동안은 상속에 대해 지겹도록 봐온 것이다. 하지만 조합? 음.. 조합이 뭔데? 하는 나를 발견하여 이 글을 쓰게 되었다.
안드로이드 뿐만 아니라 개발을 하게 되면 클래스의 설계와 코드 재사용은 정말로 중요하다. 말로만 중요한 것이 아니라 even한 코드를 짜기 위해서는 정말 중요하다. 그래서 저 두가지를 잘하는 것이 정말 중요한데, 상속과 조합을 적재적소에 사용해서 해소할 수 있다.
상속은 클래스 간의 부모-자식 관계를 정의하며, 자식 클래스가 부모 클래스의 속성과 메서드를 물려받을 수 있도록 한다.
extends 키워드를 사용해 구현.class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}class CustomTextView(context: Context, attrs: AttributeSet) : TextView(context, attrs) {
init {
setTextColor(Color.BLUE)
}
}조합은 객체가 다른 객체를 포함(참조)함으로써 기능을 확장하거나 재사용하는 방식이다.
Custom Component 조합:
class MyCustomComponent(context: Context) {
private val textView = TextView(context)
private val button = Button(context)
fun setup() {
textView.text = "Hello"
button.text = "Click Me"
}
}
Delegation 사용:
class MyLogger {
fun log(message: String) {
println(message)
}
}
class MyComponent(private val logger: MyLogger) {
fun performAction() {
logger.log("Action performed")
}
}
| 특징 | 상속 | 조합 |
|---|---|---|
| 재사용성 | 부모 클래스의 모든 기능을 재사용 가능 | 필요한 기능만 선택적으로 사용 가능 |
| 결합도 | 높음 | 낮음 |
| 유연성 | 부모 클래스 변경 시 자식 클래스 영향 큼 | 독립적, 유연한 설계 가능 |
| 다중 기능 지원 | 단일 상속만 가능 | 여러 객체를 포함해 다중 기능 조합 가능 |
| 관계 | "is-a" 관계 | "has-a" 관계 |
공통 로직을 처리하기 위해 상속 사용.
open class BaseActivity : AppCompatActivity() {
fun setupToolbar() {
// 공통 툴바 설정
}
}
class MainActivity : BaseActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupToolbar()
}
}
조합을 사용해 독립적인 역할을 유지.
class UserRepository {
fun getUser(): User {
// 사용자 데이터 반환
}
}
class UserViewModel(private val repository: UserRepository) : ViewModel() {
fun getUser() = repository.getUser()
}
마사카!!! 난 이미 조합을 쓰고 있었던 것이다. 의존성으로 받는 행위가 다 !!!! 조합이었던 것이다~!!!

왜냐?? Viewmodel(repository)의 예시로 들면, 레포지토리의 메소드를 뷰모델 클래스 안에서 복붙해서 계속 만드는게 아니라, 레포지토리라는 클래스를 잘~ 만들어놓고, 필요한 곳에서 호출! 해서 쓰기 때문에 이것은 조합이다.