<오브젝트 object>
클래스는 인스턴스 객체를 만들기 위한 틀이기 때문에 내부에 있는 속성이나 함수를 사용하려면
생성자를 통해 실체가 되는 인스턴스 객체를 만들어야 했는데요,
그러나 여러개의 인스턴스 객체가 필요하지 않고 단 하나의 객체만으로 공통적인 속성과 함수를 사용해야 하는
코드에서는 굳이 클래스를 쓸 필요없이 오브젝트를 사용하면 됩니다
오브젝트는 *싱글톤 패턴 (Singleton Pattern)을 언어 차원에서 지원하는 것이라고 볼 수 있습니다!
*싱글톤 패턴: 클래스의 인스턴스를 단 하나만 만들어 사용하도록 하는 코딩 아키텍쳐 패턴
코드 아무데서나 호출하여 호출한 횟수를 카운팅하거나 초기화 할 수 있는 Counter라는 object를 만들어보겠습니다
fun main() {
println(Counter.count)
Counter.countUp()
Counter.countUp()
println(Counter.count)
Counter.clear()
println(Counter.count)
}
object Counter {
var count = 0
fun countUp() {
count++
}
fun clear() {
count = 0
}
}
/* 출력
0
2
0
*/
object라는 키워드를 쓴 후 이름을 Counter로 정한 후 중괄호 안에 필요한 내용을 적어줍니다
오브젝트는 따로 인스턴스를 생성하지 않고 그 자체로 객체이기 때문에 생성자는 사용하지 않습니다
실제 카운팅한 개수를 저장하는 count라는 변수를 만들어 초기값을 0으로 설정해두고
count 갯수를 하나 늘려주는 countUp 함수,
count 값을 0으로 초기화 해주는 clear 함수를 만들어줍니다
그리고 main 함수에서 사용할 때 object는 별도의 인스턴스를 생성하지 않기 때문에
object 이름에 직접 참조연산자를 붙여 사용하면 됩니다
먼저 초기 count 값을 찍어보고 countUp 함수를 2번 호출하였습니다
그리고 다시 Counter의 count값을 찍어줍니다
이후 Counter의 count를 초기화 하기 위해 clear 함수를 호출하고
다시 Counter의 count 값을 확인하도록 하였습니다
이제 출력 결과를 확인하면 순서대로 0 , 2 , 0 이 출력되는 것을 확인할 수 있습니다
object로 선언된 객체는 '최초 사용시' 자동으로 생성되며 이후에는 코드 전체에서 '공용으로 사용'될 수 있으므로
프로그램이 종료되기 전까지 공통적으로 사용할 내용들을 묶어 만드는 것이 좋습니다
(싱글턴으로 구현되었기 때문에 여러번 호출해도 객체는 한번만 생성됩니다!)
그런데 기존 클래스 안에도 object를 만들 수 있는데요!
바로 Companion Object 입니다
<Companion Object>
클래스의 인스턴스 기능은 그대로 사용하면서 인스턴스 간에 공용으로 사용할 속성과 함수를 별도로 만드는 기능입니다
기능적으로는 기존의 언어들이 가진 *Static 멤버와 비슷하다고 볼 수 있습니다
*Static 멤버: 클래스 내부에서 별도의 영역에 고정적으로 존재하여 인스턴스를 생성하지 않아도 공용으로 사용 가능한 속성이나 함수
짜장과 짬뽕 중 어느것이 좋은지 선택하는 설문조사 예제를 보도록 하겠습니다
(짜장과 짬뽕에 각각 투표할 때마다 개별적인 투표수와 총 투표수가 동시에 집계 되도록 만들었습니다)
fun main() {
var a = FoodPoll("짜장")
var b = FoodPoll("짬뽕")
a.vote()
a.vote()
b.vote()
b.vote()
b.vote()
println("${a.name}: ${a.count}")
println("${b.name}: ${b.count}")
println("총계: ${FoodPoll.total}")
}
class FoodPoll (val name: String) {
companion object {
var total = 0
}
var count = 0
fun vote() {
total++
count++
}
}
/* 출력
짜장: 2
짬뽕: 3
총계: 5
*/
FoodPoll 클래스에서 생성자로 음식 이름을 받고 있습니다
그리고 companion object 라고 써준 후 그 안에 total 이라는 총 투표수를 저장하는 속성을 만들어 0을 할당해 두었습니다
개별 투표수를 저장하는 count라는 속성도 만들어 주었는데요
count는 짜장과 짬뽕이 각각 따로 사용하는 속성이기 때문에 companion object의 바깥에 만들어주어야 합니다!
마지막으로 vote라는 함수를 만들어 total과 count를 1씩 증가시키도록 해주었습니다
이제 main 함수에서 a라는 변수에 FoodPoll의 짜장 인스턴스를, b라는 변수에는 FoodPoll의 짬뽕 인스턴스를 생성하였습니다
그리고 a에는 2번 투표를 하기 위해 a.vote()를 두번 호출하였고
b에는 3번 투표를 하기 위해 b.vote()를 세번 호출하였습니다
투표를 하고 출력되는 값을 확인해보면 짜장:2, 짬뽕: 3, 총계: 5 로 나오는 것을 볼 수 있는데요
이는 서로 다른 인스턴스 임에도 companion object 내에 있는 total을 공유하고 있기 때문에
모든 인스턴스에서 투표수를 누적할 수 있음을 알 수 있습니다
<오브젝트> 포스팅은 여기서 마치도록 하겠습니다!
'Kotlin' 카테고리의 다른 글
[Kotlin] 클래스의 다형성 (0) | 2023.08.03 |
---|---|
[Kotlin] 익명객체와 옵저버 패턴 (0) | 2023.07.28 |
[Kotlin] 스코프 함수 (0) | 2023.07.26 |
[Kotlin] 고차함수와 람다함수 (0) | 2023.07.25 |
[Kotlin] 변수, 함수, 클래스의 접근범위와 접근제한자 (0) | 2023.07.24 |