Practical object in Kotlin
저번 글에서는 코틀린의 제어문과 반복문에 대해서 간략하게 알아보았습니다. 그렇다면, 당연히 자바를 기반으로 하는 언어, 코틀린의 다음 챕터는 객체 개념이 됩니다! 간략하게 OOP개념에 대해서 알아보도록 하겠습니다. 우선 객체 지향 언어는 그 언어의 문법에서 파생되는 모든 것들은 객체가 될 수 있다는 개념입니다. 물론 함수와 변수 등 모든 것들을 포함해서 말입니다. 우리는 코틀린의 객체 개념을 가볍게 알아가며, 배우고, 그 객체를 사용하는 방법에 대해서 알아볼 예정입니다. 우선 OOP의 개념을 설명드리겠습니다.
개념을 보게되면, 다형성, 상속 성, 캡슐화, 객체, 클래스, 추상화 등 많은 개념이 얽혀있는 것이 바로 객체 지향 프로그래밍의 개념입니다. 그렇기 때문에 처음에 객체를 다룰 때에 많은 시간이 걸릴 수 있습니다. 인스턴스의 개념을 이해하지 못하면, 이 부분을 절대로 짚고 넘어갈 수 없기 때문입니다. 하지만 프로그래밍에 있어서 강력한 현대적인 개념들이기 때문에 필수적으로 알아두셔야 합니다!!
코틀린에서 우선 기본적인 객체개념을 학습하기 위해선 아무래도 클래스로 시작하는 것이 일반적입니다. 우선 사용법의 형태는 아래와 같습니다.
1
2
3
|
class Foo{
// class abstraction function and variables
}
|
cs |
위 처럼 클래스와 클래스 네임을 선언해주면 클래스를 사용할 수 있습니다. 다른 언어들의 클래스 문법과 크게 차이가 나지 않는 모습입니다. 자바나 C++과 마찬가지로 코틀린 또한, 클래스의 여러 객체를 생성할 수 있으며, 클래스의 멤버와 멤버 펑션을 포함할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
class Foo{
public var name:String = "Bar"
private var number:Int = 12;
fun retVal(){
print("${name} and ${number}")
}
}
fun main(){
val foo = Foo()
foo.retVal()
}
|
cs |
위와 같은 방법으로 사용할 수 있습니다. name과 number처럼 클래스의 내부 프로퍼티를 초기화 선언하고, 아래 멤버 함수를 생성했습니다. 그리고 main()에서와 같이 객체를 생성합니다. 그리고 '.' 기호를 통해서 멤버 함수를 호출합니다.
Nested Class
중첩된 클래스라는 의미죠? 그러니까 클래스의 내부에 선언된 클래스라는 의미입니다. 많이 사용되기도 하지만, 사실 가독성의 문제도 있고, 유지보수 시에 너무 많은 중첩은 다른 프로그래머들의 머리를 아프게 하기 때문에 적절히 사용하는 것이 매우 중요한 포인트가 되겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Foo{
public var name:String = "Bar"
private var number:Int = 12;
class Nested{
public var name2:String = "Foo and Bar"
fun retVal2(){
print("${name2}")
}
}
fun retVal(){
print("${name} and ${number}")
}
}
fun main(){
val foo = Foo.Nested()
foo.retVal2()
}
|
cs |
위와 같이 클래스 내부에 클래스를 선언했습니다. 뭐 그냥 클래스 내부에 있는 클래스는 자신을 감싸고 있는 외부 클래스의 속성 객체 중 하나가 되겠죠?
Inner Class
클래스 내부에 있는 클래스 인데, 어라? 중첩 클래스와 다른 점이 뭘까요? 어 그건, 중첩된 클래스의 개념은 우선 맞습니다. 클래스 앞에 "inner"라는 키워드가 붙게 되면, 내부 클래스로 동작하게 되는데, 내부 클래스는 외부 클래스의 데이터 멤버 즉, 외부 클래스의 속성에서만 접근이 가능합니다. 아래 코드를 보면 더 자세히 알 수 있습니다.
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
|
class Foo{
public var name:String = "Bar"
private var number:Int = 12;
class Nested{
public var name2:String = "Foo and Bar"
fun retVal2(){
print("${name2}")
}
}
inner class NestedBar{
fun bar() = "I'm a inner class"
}
fun retVal(){
print("${name} and ${number}")
}
}
fun main(){
val foo = Foo().NestedBar();
println(foo.bar())
}
|
cs |
평소 글이라면, 코드를 제거하면서 작성하겠지만, 아무래도 중첩 클래스와 내부 클래스의 개념도 혼란스러우실테고, 객체 개념을 만약 잘 모르신다면, 헷갈리실 것 같아서 계속해서 비교를 통해서 학습을 진행하시라, 지우지 않고 진행합니다! 보시면, main()에서 Foo()의 인스턴스화를 진행하고 그다음 NestedBar()의 인스턴스를 진행한 모습입니다. 만약 그냥 작성해도 상관은 없지만, inner class의 경우에는 외부에서 중첩 클래스에 접근을 못합니다. 그렇기 때문에 외부 클래스를 인스턴스 화해야만 접근이 가능합니다!! 조금 개념이 어려우셨을 수 있는데, 정리하자면 중첩 클래스와 이너 클래스의 본질은 같습니다!!
Interface on Kotlin
코틀린에서의 인터페이스 개념은 아 정말 좋은 개념이죠, 자바에서도 인터페이스를 좀 많이 사용했던 것 같은데, 사실 자바를 거의 그냥 아 이렇게 쓰는구나 수준에서 끝마쳤기 때문에 잘은 모릅니다.ㅎ..
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
32
33
|
class Foo{
public var name:String = "Bar"
private var number:Int = 12;
class Nested{
public var name2:String = "Foo and Bar"
fun retVal2(){
print("${name2}")
}
}
inner class NestedBar{
fun bar() = "I'm a inner class"
}
fun retVal(){
print("${name} and ${number}")
}
}
interface Korea{
fun new2021()
}
fun main(){
var korea:Korea = object:Korea{
override fun new2021(){
print("Happy new Year")
}
}
korea.new2021();
}
|
cs |
위와 같이 인터페이스를 구현해서 main()에서 정의되어도 좋고, 사실 어디서든 정의할 수 있습니다만, 설명을 위해 계속 main()에서만 코드 작성을 이어나가는 점은 양해부탁드립니다. 보게 되면, 객체 개념을 바로 main()에서 생성하게 되는 걸 볼 수 있습니다. 그리고 override 키워드를 통해서 Korea가 가지고 있던 함수를 가져와 재정의 또한 저렇게 단순하고 간단하게 사용될 수 있다는 점입니다. 정말 좋네요 다시 봐도!
class Argument
사실 위까지 설명을 하려 했는데, 생각해보니 클래스의 생성과정에서 인자 받는 걸 보여드리지 않아 보여드리려고 합니다. 당연히 어느 언어와 동일하게
1
2
|
class Foo(val name:String = "default", var age:Int){
}
|
cs |
초기값을 줄 수 도 있고, 무조건 입력되는 값만 받아낼 수 도 있습니다. 그렇다면 사용 코드만 간략하게 보여드리고 설명 마치도록 하겠습니다.
1
2
3
4
5
6
7
8
9
10
11
12
|
class Foo(val name:String = "default", var age:Int){
public val myName:String = name;
public var myAge:Int = age;
fun retVal(){
println("${myName} and ${myAge}")
}
}
fun main(){
val foo = Foo("hong",12)
foo.retVal()
}
|
cs |
클래스 내부에서 constructor()를 이용해서 생성자를 생성하는 방법도 있지만, 이건 다음 글에서 이어나가도록 하겠습니다.
감사합니다!!!
글 잘 보셨다면, 공감 하트와 댓글 한 번씩 달아주시면 감사하겠습니다!!
댓글로 피드백, 문의, 질문 모두 환영합니다😜
'Kotlin' 카테고리의 다른 글
[Kotlin#6] Kotlin(코틀린) 접근 한정자 및 객체 확장(Visibility & Extension) by public, private, protected, companion (0) | 2020.12.22 |
---|---|
[Kotlin#5] Kotlin(코틀린) 클래스 상속 및 인터페이스(Inheritance & Interface) (0) | 2020.12.20 |
[Kotlin#3] Kotlin(코틀린) 제어 및 반복문(if, for, while) (0) | 2020.12.11 |
[Kotlin#2] Kotlin(코틀린) 데이터 타입 및 배열 (0) | 2020.12.06 |
[Kotlin#1] Kotlin(코틀린) 설치 및 기본적인 사용 방법 (0) | 2020.12.03 |
댓글