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