최근에 함수형 프로그래밍에 대한 공부를 아주 잠깐 했었는데 생각해보니
객체지향 프로그래밍에 대해서 한번도 정리를 해본적이 없어서 정리를 해보려고한다.
컴퓨터 프로그래밍의 한 패러다임이다.
필요한 데이터를 추상화 시켜 상태(변수)와 행위(메서드)를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다.
그럼 객체지향 프로그래밍에서 말하는 클래스 & 객체란 무엇인가?
클래스란 객체의 속성과 행위를 정의하는 하나의 설계도 혹은 틀이다.
객체란 클래스를 기반으로 생성된 실체로써, 프로그래밍에서 데이터와 기능을
캡슐화한 프로그램 단위이다
변수를 통해 데이터를 저장하고 관리한다. -> 객체의 속성메서드를 통해 특정 기능을 수행한다 -> 객체의 동작추상화
핵심 기능만 드러내어 복잡성을 줄인다.추상클래스와 인터페이스를 통해 구현한다.// 추상화를 위한 인터페이스 정의
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
}
}
클래스와 상속의 개념을 통해서 코드의 재사용성을 높일 수 있다.캡슐화하여 관리하므로 유지보수에 용이하다.모듈화하여 관리하므로 대규모 프로젝트에 적합하다.이번에 정리를 하면서 객체지향에 대해 다시 한번 생각해볼 수 있었던거 같다.
이제 다시 함수형도 공부를 해야하는데..