본문 바로가기

TIL

[TIL] 20230809

[오늘 배운 내용]

-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://medium.com/depayse/kotlin-%ED%81%B4%EB%9E%98%EC%8A%A4-10-object-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%9D%98-%EC%82%AC%EC%9A%A9-d7fe736a3dcb

https://junyoung-developer.tistory.com/category/Kotlin/Kotlin%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D?page=3 

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