[오늘 배운 내용]
-1- Singleton
- 싱글턴이란, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고, 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 것을 얘기한다.
- 어플리케이션의 시작부터 종료까지 1번의 생성으로 고정된 메모리 영역을 가지므로 메모리를 효율적으로 사용할 수 있다고 한다.
- kotlin 에서는 object,compainon object 키워드로 Singleton Pattern 구현 가능.
- 전에 시도 했던 개인프로젝트에서 클래스 마다 다른 값을 저장해서 메인에서 호출해보니, 내가 의도한 값을 확인할 수 없었는데 SIngleton Pattern으로 구현해서 그런 문제를 해결할 수 있다.
-2- Object
- 오브젝트 클래스는 일반 클래스처럼 프로퍼티, 매소드, 초기화 블록을 가질 수 있지만, 생성자는 가질 수 없다.
- 오브젝트 클래스는 모든 클래스의 상위에 존재한다.
- 클래스를 상속받을 수 있고, 인터페이스 또한 구현할 수 있지만 다른 클래스가 오브젝트 클래스를 상속 받을 수는 없다. ' : ' 뒤에 클래스, 인터페이스를 넣어 상속 받을 수 있다.
- 객체 선언 방법
object HelloWorld{
val hello = "Hello"
val world = "World"
override fun toString() = "$hello $world"
}
- object는 일반 클래스 선언시와 같이 클래스 외부에서 선언되며 방법은 다음과 같다.
- object로 선언된 클래스는 별도의 생성없이 바로 호출할 수 있다.
- 싱글턴 패턴으로 하나의 객체만 생성되기 때문에 생성자를 포함할 수 없다.
- object를 초기화하기 위해서는 init 블록을 사용하며 처음 객체가 생성될 때만 실행된다.
- 모든 클래스의 최상위에 위치하고 있기 때문에 클래스명.(함수/필드)로 호출이 가능하다.
- companion object는 클래스 내부에서 선언된다.
- companion object는 하나의 클래스 안의 모든 객체가 공유하는 매소드, 프로퍼티를 정의할 수 있다.
- companion object는 클래스 내부에 선언할 수 있으며, 하나의 companion object만 생성할 수 있다.
- 오브젝트와 마찬가지로 매소드,프로퍼티,초기화 블록은 생성할 수 있으나, 생성자는 만들 수 없다.
open class Menu (name:String, description:String){
var idx:Int
var description:String
var name : String
init {
this.idx = getNextIdx()
this.name = name
this.description = description
}
companion object {
var maxIdx = 1
fun getNextIdx():Int{
return maxIdx++
}
}
}
- companion object의 멤버는 클래스의 이름을 한정자로 사용하여 간단하게 호출할 수 있다.
- object 키워드로 인터페이스를 상속받을 때, 클래스 명을 정하지 않고 무명으로도 객체 반환할 수 있다. 객체 식을 정의하면 추상클래스나 인터페이스를 구현한 객체가 생성되고, 이 객체를 변수에 저장하여 재사용하는 것도 가능하다.
- 익명의 내부 클래스는 여러 개의 추상 클래스나 인터페이스를 구현할 수 있고, 익명 객체를 포함하는 함수나 클래스의 프로퍼티에도 접근이 가능하고, var 프로퍼티의 경우 값을 변경할 수 있다.
interface Bird {
fun fly()
}
class Sparrow : Bird {
override fun fly() {
println("참새가 날다")
}
}
class Dove : Bird {
override fun fly() {
println("비둘기가 날다")
}
}
fun main() {
val sparrow : Sparrow = Sparrow()
val dove : Dove = Dove()
val eagle = object :Bird {
override fun fly() {
println("독수리가 날다")
}
}
sparrow.fly() // 출력 참새가 날다
dove.fly() // 출력 비둘기가 날다
eagle.fly() // 출력 독수리가 날다
}
[오늘 복습한 내용]
1. 문자열 자르기, 분할하기
- 문자열 자르기는 .subString 함수를 통해서 자를 수 있다.
fun main() {
var a: String = "123456789"
// 인덱스 범위안의 내용 자르기
fun solution1(str: String, cut: Int): String {
return str.substring(0 until cut)
}
// 지정한 인덱스 까지의 내용 자르기
fun solution2(str: String, cut: Int): String {
return str.substring(cut)
}
// startIdx ~ endIdx 까지 내용 자르기
fun solution3(str: String, cut: Int): String {
return str.substring(2, cut)
}
println(solution1(a, 5)) // 출력 12345
println(solution2(a, 5)) // 출력 6789
println(solution3(a, 5)) // 출력 345
- 문자열 특정 문자로 분할하기는 .split() 함수를 통해서 분할할 수 있다.
// 문자열 특정문자로 분할하기 .split()
// 결과 값은 List값으로 반환 됨.
var splA = "+82 010-1234-6789"
fun split1() = splA.split(" ", "-") // " "과 " - " 로 나누기
fun split2() = splA.split("-") // " - " 로만 나누기
fun split3() = splA.split(" ", "-", limit = 2) // 최대 나누는 개수 설정
println(split1()) // 출력 [+82, 010, 1234, 6789]
println(split2()) // 출력 [+82 010, 1234, 6789]
println(split3()) // 출력 [+82, 010-1234-6789]
- 문자열 크기별로 분할하기는 .chunked() 로 분할할 수 있다.
// 문자열 크기별로 분할하기 .chunked()
// 결과 값은 List값으로 반환 됨.
var chunkA = "100200300400500600700"
fun chunked1() = chunkA.chunked(3)
fun chunked2() = chunkA.chunked(6)
println(chunked1()) // 출력 [100, 200, 300, 400, 500, 600, 700]
println(chunked2()) // 출력 [100200, 300400, 500600, 700]
[오류,에러 등등]
오늘도 문법공부 위주로 진행했다...
[느낀 점]
1. 문법 공부를 하고나면 직접 코드 작성을 해가면서 공부한 기능을 언제 어떻게 사용하면 좋을지 생각해보는 것이 좋을 것 같다.
2. 다른 사람의 코드를 보면서 특정 상황에 쓰인 코드가 왜 그렇게 쓰였는지에 대해서 의문을 갖고 공부하려는 자세를 갖는 것이 좋을 것 같다.
3. 최근에 집중하는 시간이 좀 줄어든 것 같다. 엉뚱한 데에서 스트레스 받지말고 집중 시간을 늘려서 TIL 작성내용을 늘릴 수 있도록 하자.
[reference]
https://kotlinlang.org/docs/object-declarations.html#companion-objects
https://developer.android.com/reference/java/lang/Object?hl=en
https://ko.wikipedia.org/wiki/%EC%8B%B1%EA%B8%80%ED%84%B4_%ED%8C%A8%ED%84%B4
'TIL' 카테고리의 다른 글
[TIL] 0817 람다 (0) | 2023.08.17 |
---|---|
[TIL] 0816 Enum Class (0) | 2023.08.16 |
[TIL] 20230808 5일차 (0) | 2023.08.08 |
[TIL] 20230804 - 4일차 (0) | 2023.08.05 |
[TIL]20230803 - 3일차 (0) | 2023.08.03 |