객체지향 프로그래밍(OOP)

김정현·2024년 4월 25일

최근에 함수형 프로그래밍에 대한 공부를 아주 잠깐 했었는데 생각해보니
객체지향 프로그래밍에 대해서 한번도 정리를 해본적이 없어서 정리를 해보려고한다.

객체지향 프로그래밍(OOP)

컴퓨터 프로그래밍의 한 패러다임이다.
필요한 데이터를 추상화 시켜 상태(변수)와 행위(메서드)를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.

클래스와 객체

그럼 객체지향 프로그래밍에서 말하는 클래스 & 객체란 무엇인가?
클래스객체의 속성과 행위를 정의하는 하나의 설계도 혹은 틀이다.

객체클래스를 기반으로 생성된 실체로써, 프로그래밍에서 데이터기능
캡슐화한 프로그램 단위이다

  • 객체는 변수를 통해 데이터를 저장하고 관리한다. -> 객체의 속성
  • 객체는 메서드를 통해 특정 기능을 수행한다 -> 객체의 동작

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

추상화

  • 복잡한 객체의 핵심적인 특성만을 추출하여 만드는것이다
  • 불필요한 세부사항을 숨기고 핵심 기능만 드러내어 복잡성을 줄인다.
  • 추상클래스인터페이스를 통해 구현한다.
// 추상화를 위한 인터페이스 정의
interface Shape {
    fun calculateArea(): Double
}

// Shape 인터페이스를 구현하는 구체적인 클래스
class Circle(val radius: Double) : Shape {
    override fun calculateArea(): Double {
        return Math.PI * radius * radius
    }
}

class Rectangle(val width: Double, val height: Double) : Shape {
    override fun calculateArea(): Double {
        return width * height
    }

Shape 인터페이스는 도형의 넓이를 구하는 메서드를 정의하고 각 클래스에서 해당 메서드를 구현하고 있다.

캡슐화

  • 객처의 데이터와 메서드를 하나의 단위로 묶어서 관리한다.
  • 객체 내부의 복잡성을 숨기고 외부에서 접근할 수 있는 메서드만 공개한다.
  • 데이터 보호정보 은닉을 통해 객체의 무결성을 보장한다.
class Circle(private var radius: Double) {
    // 반지름을 설정하는 메서드
    fun setRadius(newRadius: Double) {
        if (newRadius >= 0) {
            radius = newRadius
            println("반지름이 $newRadius로 변경되었습니다.")
        } else {
            println("반지름은 음수일 수 없습니다.")
        }
    }
}

fun main() {
    val myCircle = Circle(5.0)

    // 반지름을 직접 수정하는 것을 막고, 메서드를 통해 수정
    myCircle.setRadius(7.0)

    // 잘못된 값으로 설정하는 것을 막음
    myCircle.setRadius(-3.0)
}

Circle 클래스의 setRadius 메서드를 통해서만 클래스 내부의 radius에 접근할 수 있다.

상속

  • 기존 클래스의 속성과 메서드다른 클래스에서 사용할 수 있으면서 동시에 새로운 기능을 추가할 수 있게 한다.
  • 코드의 재사용성을 높이고 계층적 관계를 표현할 수 있다.
open class Animal(val name: String) {
    open fun makeSound() {
        println("The animal makes a sound")
    }
}

class Dog(name: String) : Animal(name) {
    override fun makeSound() {
        println("The dog barks")
    }
}

class Cat(name: String) : Animal(name) {
    override fun makeSound() {
        println("The cat meows")
    }
}

open 키워드를 사용하여 상속이 가능하도록 만들고 Dog, Cat 클래스는 Animal을 상속 받아 메서드를 오버라이드하여 사용한다.

다형성

  • 하나의 객체가 여러 형태를 가질 수 있는 특성이다.
  • 같은 이름의 메서드가 상황에 따라 다르게 동작할 수 있다
  • 오버로딩오버라이딩을 통해 구현한다
    오버라이딩상속관계에서 자식 클래스에서 메서드를 재정의하는것을 말한다.
    오버로딩은 같은 이름의 메서드에서 매개변수 또는 개수에 따라 다르게 정의하는것을 말한다.
class Calculator {
    fun add(x: Int, y: Int): Int {
        return x + y
    }
	// 매개변수의 타입을 다르게하여 add함수 정의
    fun add(x: Double, y: Double): Double {
        return x + y
    }
}

객체지향프로그래밍의 장.단점

장점

  • 클래스상속의 개념을 통해서 코드의 재사용성을 높일 수 있다.
  • 데이터와 기능을 캡슐화하여 관리하므로 유지보수에 용이하다.
  • 복잡한 시스템을 모듈화하여 관리하므로 대규모 프로젝트에 적합하다.

단점

  • 객체 간 메세지 전달 및 메서드 호출 등의 과정으로 처리 속도가 느려질 수 있다.
  • 객체의 생성 및 관리로 인해 메모리 사용량이 증가할 수 있다.

마치며

이번에 정리를 하면서 객체지향에 대해 다시 한번 생각해볼 수 있었던거 같다.
이제 다시 함수형도 공부를 해야하는데..

profile
안녕하세요 반갑습니다

0개의 댓글