파게로그
[OOP] OOP, Class and Objects 본문
Kotlin Introduction to OOP
Kotlin은 함수형 프로그래밍과 객체지향형 프로그래밍을 모두 지원한다. higher-order functions, function types, lambdas를 지원하여 함수형 프로그래밍 스타일에서 일하는 좋은 환경을 제공한다. 덩달아 객체지향형 프로그래밍도 지원한다.
OOP에서는, 복잡한 문제는 객체를 생성함으로써 작은 문제로 쪼갤 수 있다. 이러한 객체는 두 개의 특성을 공유한다. state와 behavior이다. 예를 들면 다음과 같다.
예1) Lamp
는 객체이다.
▪ on
상태와 off
상태가 있다.
▪ turn on
행위와 turn off
행위가 있다.
예2) Bicycle
은 객체이다.
▪ current gear
, two wheels
, number of gear
등의 상태가 있다.
▪ braking
, accelerating
, changing gears
등의 행위가 있다.
OOP와 관련하여서 data encapsulation, inheritance, polymorphism 등을 학습할 것이다.
Kotlin Class
객체를 생성하기 전에, 클래스를 정의해야 한다. 클래스는 객체에 대한 청사진이라 할 수 있다. 따라서 하나의 클래스로부터 많은 객체가 생성될 수 있다. 클래스 정의를 위해서는, class
키워드가 사용된다.
class ClassName {
// property
// member function
// ...
}
아까 제시한 Lamp
를 예로 들면, 다음과 같다. Kotlin에서, property는 반드시 초기화되거나, 또는 abstract로 선언되어야 한다.
class Lamp {
// property (data member)
private var isOn: Boolean = false
// member function
fun turnOn() {
isOn = true
}
// member function
fun turnOff() {
isOn = false
)
}
한편, 클래스, 객체, properties, member functions 등은 visibility modifiers를 가진다. 예를 들어, isOn
property는 오직 Lamp
클래스 내부에서만 그 값을 변경할 수 있는 것이다. 이러한 visibility modifiers의 목록은 다음과 같다.
https://kotlinlang.org/docs/visibility-modifiers.html#classes-and-interfaces
▪ private
visible (can be accessed) from inside the class only
▪ public
visible everywhere
▪ protected
visible to the class and its subclass
▪ internal
any client inside the module can access them
visibility modifier를 명시하지 않으면, 기본값으로 public이 설정된다. 위의 예시에서 isOn
속성은 private인 반면, turnOn()
과 turnOff()
멤버 함수는 public이다.
Kotlin Objects
클래스가 정의되고 나면, 오직 객체의 구체적인 명세만이 정의된다. 메모리나 저장공간은 할당되지 않는다. 클래스 내부에 정의된 멤버들에 접근하고 싶다면, 객체를 생성해야만 한다.
fun main(args: Array<String>) {
val lamp1 = Lamp()
val lamp2 = Lamp()
}
멤버 변수나 멤버 함수에 대한 접근은 .
을 사용한다는 점에서 Java와 동일하다. 물론 접근 제한자에 따라서 Exception이 발생할 수도 있다.
'콤퓨타 왕기초 > Kotlin' 카테고리의 다른 글
[OOP] Getters and Setters (0) | 2021.06.11 |
---|---|
[OOP] Constructors (0) | 2021.06.10 |
[Basic] Tail Call, Tail Recursion (0) | 2021.06.10 |
[Basic] Default arguments and Named arguments (0) | 2021.06.09 |
[Basic] Infix Function Call (0) | 2021.06.09 |