Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

훌륭한 개발자가 되기 위하여

객체 지향 프로그래밍(OOP)에 대하여 본문

Kotlin

객체 지향 프로그래밍(OOP)에 대하여

jay20033 2024. 7. 28. 03:33

객제지향 프로그래밍(Object-Oriented Programming)이란?

데이터와 프로세스가 동일한 모듈 내부에 위치하도록 프로그래밍하는 방식

  • 객체 지향 프로그래밍코드를 추상화해 직관적으로 사고할 수 있다.
  • 객체 지향 프로그래밍에서 동물, 사람 등과 같은 현실 세계의 객체를 유연하게 표현할 수 있다.
  • 객체는 어떠한 특성을 가지고 있으며 특정 기능을 수행할 수 있다.
  • 동물은 객체이고 사냥, 수면, 이동과 같은 기능을 수행할 수 있다.

객체(object)란?

객체객체 지향 프로그래밍의 가장 기본적인 단위이자 시작점이다.

객체 지향 개념의 기본적인 전제는 실제 세계는 객체들로 구성되어 있으며, 모든 현상과 발생하는

모든 사건은 객체들 간의 상호작용을 통해 발생한다.

 

객체 지향 프로그래밍에서는 각각의 객체를 추상화시켜 속성(state)기능(behavior)으로 분류한 후에 이것을 다시 각각 변수(variable)함수(function)로 정의한다.

class Animal {
    var name: String = ""
    var species: String = ""
    var legCount: Int = 0
    
    fun sleep() {
        println("자는 중입니다.")
    }
    
    fun eatFood(food: String) {
        println("${food}을 먹는 중입니다.")
    }
    
    fun move() {
        println("이동 중입니다.")
    }
}

OOP의 등장배경

OOP의 등장 배경은 프로그래밍에서 발생하는 복잡성과 유지보수성 문제를 해결하기 위해서이다.

 

절차지향적 프로그래밍에서는 데이터와 함수가 분리되어 있었기 때문에 코드의 재사용성과 유지보수성이 낮았다.

 

객체지향 프로그래밍에서는 데이터와 함수를 하나의 단위인 객체로 묶어 처리하므로 코드의 재사용성과 유지보수성이 높아진다.

-> 코드를 수정해야할 때 어떤 코드에서 문제가 발생했는지 직관적으로 인지할 수 있으며 여러곳에 분산된 모든 코드를 수정해야하는 것이 아닌 해당 로직을 수행하는 코드만 수정하더라도 문제가 해결될 수 있다.


객체 지향 프로그래밍의 4가지 특징

1. 추상화(Abstration)

추상화의 객체의 공통적인 속성과 기능을 추출하여 정의하는 것이다.

 

추상화를 구현할 수 있는 문법 요소로는 추상 클래스(abstract class)인터페이스(interface)가 있다.

interface Food {
    fun eatFood()
    fun move()
    fun sleep()
}

 

인터페이스에는 추상 메서드나 상수를 통해서 어떤 객체가 수행해야 하는 핵심적인 역할만을 규정해두고, 실제적인 구현은 해당 인터페이스를 구현하는 각각의 객체들에서 하도록 설계한다.


2. 상속(Inheritance)

상속이란 기존의 클래스를 재활용하여 새로운 클래스를 작성하는 것을 의미한다.

상속은 클래스 간 공유될 수 있는 속성과 기능들을 상위 클래스로 추상화 시켜 해당 상위 클래스로부터 확장된 여러 개의 하위 클래스들이 모두 상위 클래스의 속성과 기능들을 간편하게 사용할 수 있도록 한다.

-> 클래스들 간 공유하는 속성과 기능들을 반복적으로 정의할 필요 없이 한 번만 정의해두고 간편하게 재사용할 수 있어 반복적인 코드를 최소화하고 공유하는 속성과 기능에 간편하게 접근하여 사용할 수 있다.

 

open class Animal {
    open var name: String = ""
    open var species: String = ""
    open var legCount: Int = 0

    open fun sleep() {
        println("자는 중입니다.")
    }

    open fun eatFoot(food: String) {
        println("${food}을 먹는 중입니다.")
    }

    fun move() {
        println("이동 중입니다.")
    }
}

class Monkey : Animal() {
    override var name: String = ""
    override var species: String = ""
    override var legCount: Int = 0

    override fun sleep() {
        println("내가 앞으로 전진합니다.")
    }
}

3. 다형성

다형성이란 어떤 객체의 속성이나 기능이 상황에 따라 여러 가지 형태를 가질 수 있는 성질을 의미한다.

어떤 객체의 속성이나 기능이 그 맥락에 따라 다른 역할을 수행할 수 있는 객체 지향의 특성을 의미한다.

대표적인 예) 메서드 오버라이딩(overriding), 메서드 오버로딩(overloading)

 

오버라이딩을 사용하면 같은 이름의 메서드가 상황에 따라 다른 역할을 수행한다.

 

오버라이딩 (Overriding)

 

  • 상속 관계의 클래스에서 메서드를 재정의.
  • 런타임 다형성을 구현.
  • 상위 클래스의 메서드를 하위 클래스에서 재정의하여, 하위 클래스의 인스턴스에서 해당 메서드가 호출될 때 다른 동작을 하도록 함.

오버로딩을 사용하면 같은 이름의 메서드가 서로 다른 매개변수 목록(타입, 개수, 순서) 을 가질 수 있으며, 상황에 맞게 다양한 방식으로 호출할 수 있다.

 

오버로딩 (Overloading)

 

  • 같은 클래스 내에서 같은 이름의 메서드를 여러 개 정의.
  • 컴파일 타임 다형성을 구현.
  • 메서드의 매개변수 목록(타입, 개수, 순서)이 달라야 함.

4. 캡슐화(Encapsulation)

캡슐화란 클래스 안에 서로 연관있는 속성과 기능들을 하나의 캡슐로 만들어 데이터를 외부로부터 보호하는 것을 의미한다.

  • 데이터 보호(data protection) : 외부로부터 클래스에 정의된 속성과 기능들을 보호
  • 데이터 은닉(data hiding) : 내부의 동작을 감추고 외부에는 필요한 부분만 노출

캡슐화를 구현하기 위한 방법

1. 접근제어자

클래스나 멤버들을 외부에서 접근하지 못하도록 접근을 제한하는 역할을 수행한다.

2. getter / setter 메서드


OOP의 장점

  • 코드의 재사용성과 유지보수성이 높다.
  • 코드의 가독성이 좋고, 디버깅이 쉽다.
    동작을 기준으로 프로그래밍을 진행하는 것보다 데이터를 중심으로 프로그래밍을 하게되면 코드의 덩치가 커지더라도 일관성을 유지하기 좋다.
  • 프로그램의 확장성과 유연성이 높다.
    이해하기 쉽고, 객체 내부의 변경이 객체 외부에 파급되지 않도록 제어할 수 있기 때문에 변경하기 수월하다.
  • 객체의 재사용이 가능하므로 개발 속도가 빠르다.

OOP의 단점

  • 초기 개발 비용이 높다.
    객체지향 프로그래밍은 매우 복잡한 시스템에서 사용할 때 가장 효과적이다. 하지만 복잡하지 않은 문제에 대해서는 코드를 작성하기가 더 어려울 수 있다. 또한 객체간의 관계를 모델링하기 위한 상속과 같은 개념들이 이해하고, 설계하는데 개발자의 코스트가 소모된다.
  • 객체 간의 상호작용이 많아질 경우 코드의 복잡성이 증가할 수 있다.
    상속을 사용하는 것은 코드를 복잡하게 만들어서, 유지 보수성을 떨어뜨릴 수 있습니다. 또한 자식 클래스가 부모 클래스의 기능을 오버라이딩 하면, 이전에 구현한 코드가 의도치 않게 동작할 수 있는 문제가 발생할 수 있다.
  • 성능 저하가 발생할 수 있다.
    객체 지향 프로그래밍은 일반적으로 더 많은 메모리를 사용하고 CPU 사용량이 높아지기 때문에 성능 저하가 발생할 수 있다.

'Kotlin' 카테고리의 다른 글

비동기 처리  (0) 2024.07.29
동기와 비동기, Thread와 Coroutine 그리고 여러 가지 패턴  (0) 2024.07.28
함수형 프로그래밍과 Sealed Class  (2) 2024.07.25
예외 처리란?  (0) 2024.07.15
컬렉션 타입과 람다  (0) 2024.01.18