(이펙티브 코틀린) 불공변성(invariance), 공변성(covariance), 반공변성(contvariance)

- 불공변성은 어떤 타입도 모두 허용한다.

- 공변성은 자신과 부모타입만 허용한다. produce, 생산의 개념, read-only

- 반공변성은 자신과 서브타입만 허용한다. consume, 소비의 개념, write-only

 

type-safe 한 코틀린의 경우 제네릭 사용 시 위 개념을 적용하면 좀 더 유연하고 안정적인 코드 작성이 될 수 있다고 한다. 디테일한 예시는 깃헙에 정리해두었다.

 

 

(이펙티브 코틀린) equals 에는 두가지가 있다. 구조적 동등성과 레퍼런스적 동등성

- 구조적 동등성은 클래스 내 멤버필드가 동일하게 작성되었는가를 판단한다. 코틀린에서 '==' 를 사용한다.

- 레퍼런스적 동등성은 비교 대상이 되는 두 개의 클래스가 가리키는 객체가 동일한지 판단한다. '===' 를 사용한다.

data class Player(
    val name: String,
    val age: Int,
    val gender: Gender
) {
    enum class Gender {
        M, W
    }
}

fun main() {
    val player1 = Player("park", 10, Player.Gender.M)
    val player2 = Player("park", 10, Player.Gender.M)
    val player1Reference = player1

    // 구조적 동등성 : ==
    println("구조적 동등성")
    println(player1 == player2) // true
    println(player1 == player1Reference) // true

    // 레퍼런스적 동등성 : ===
    println("레퍼런스적 동등성")
    println(player1 === player2) // false
    println(player1 === player1Reference) // true

    val player3 = player1.copy(name = "kim")
    println("테스트")
    println(player1 == player3) // false
    println(player1 === player3) // false
}

 

 

base64/base32

바이너리 데이터를 텍스트로 변환하는 인코딩 기법이다. 이 때 인코딩에 이용되는 문자열은 정해진 US-ASCII 64개의 문자열을 가지고 인코딩을 수행한다. source 의 바이너리 데이터를 6비트씩 잘라서 64개의 문자열에 매핑시켜서 인코딩을 수행한다. 하지만 바이너리 데이터가 큰 경우에 위키피셜, 33~37% 정도의 데이터 오버헤드가 발생한다고 한다.

 

데이터 오버헤드가 발생되는 이유는 크게 두 가지가 존재한다.

  • base64 인코딩은 6비트씩 잘라서 처리가 된다. 하지만 바이너리 데이터는 8비트씩 잘라서 처리되기 때문에 base64 인코딩 시에는 기존 바이너리 데이터 대비 더 많은 문자가 사용되기 때문이다.
  • base64 인코딩 데이터는 각 라인 끝에 줄바꿈 문자가 추가될 수 있다. 6bit 를 명확하게 끝내기 위해서 '=' 문자가 추가된다.

 

base32 인코딩은 무엇인가? 5비트씩 잘라서 32개의 문자열에 매핑된 인코딩을 의미한다.  base64 인코딩 관련된 추가적인 내용을 깃헙에 정리해두었다.

 

'Interest > 개발' 카테고리의 다른 글

2024-04 개발 : 자투리기록  (1) 2024.04.10
2024-02 개발 : 자투리 기록  (1) 2024.02.20
2024-01 개발 : 자투리 기록  (0) 2024.01.21
2023-11-25 개발 : 자투리 기록  (0) 2023.11.25
2023-11-19 개발 : 자투리 기록  (0) 2023.11.19
Posted by doubler
,