[KOTLIN] 불필요한 객체 생성을 피하라

2022. 8. 3. 22:49·KOTLIN
728x90

객체 생성 비용 발생하는 경우

  • 64비트 JDK에서 객체는 8바이트의 배수, +_앞부분은 12바이트 헤더
  • 캡슐화된 객체는 함수 호출 비용이 발생하며 비용은 크지는 않지만 티끌모아태산임
  • 객체 생성시 비용이 발생함 

불필요한 객체를 제거할 방법

객체 선언

  • 객체를 재사용함

캐시를 활용하는 팩토리 함수

  • 팩토리 메서드를 가지면 캐시를 가질수 있음
  • 쓰레드풀, 커넥션풀 등 객체생성이 무겁고 동시에 여러 mutable 객체를 사용하는 경우 적합함
  • 모든순수 함수는 캐싱을 활용할 수 있음 (메모이제이션)적합
  • 캐싱처리하면 대신 메모리 사용은 증가, 적절하게 활용해야함
private val FIB_CACHE = mutableMapOf<String, Connection>()
//캐싱 처리해서 재사용 예시
fun fib(n: Int): BigInteger = FIB_CACHE.getOrPut(n) {
		if (n <=1) BigInteger.ONE else fib(n - 1) + fib(n - 2)
}

무거운 객체를 외부 스코프로 보내기

  • 무거운 연산을 내부에서 외부로 보냄
// as-is : max 연산이 element 수 만큼 수행됌
fun <T: Comparable<T>> Iterable<T>.countMax(): Int =
		count { it == this.max() }

// to-be : max 연산은 한번만 하면 됌
fun <T: Comparable<T>> Iterable<T>.countMax(): Int =
		val max = this.max()
		return count { it == max }
}

지연초기화

  • 지연초기화 하면 사용할 때 만들어지기 때문에 비용을 아낄 수 있음
  • 지연초기화 첫 호출시에는 객체 생성이 이루어지기 때문에 느릴 수 있음
class A {
	val b = B() // 엄청 무거움
	val c = C() // 엄청 무거움
	val d = D() // 엄청 무거움
}

// => A 클래스를 생성하는 일이 엄----청 무거움

class A {
	val b by lazy { B() } // 엄청 무거움
	val c by lazy { C() } // 엄청 무거움
	val d by lazy { D() } // 엄청 무거움
}

// A 클래스 생성해도 b,c,d 는 아직 생성하지 않아도 됌
// => A 객체 생성 과정이 가벼워졌다.

기본 자료형 사용하기

  • wrapper 자료형이 사용되는 경우는 nullable 타입 연산과 제네릭으로 사용할 때 사용이 됨
  • 숫자 연산인 경우 성능이 별차이 없을수 있지만, 굉장히 큰 컬렉션을 처리시 성능 차이가 발생할 수 있음
  • 최대한 기본형으로 사용하자
저작자표시

'KOTLIN' 카테고리의 다른 글

[KOTLIN] SEALED CLASS  (0) 2022.07.27
[KOTLIN] 멤버 확장 함수의 사용을 피하라 (이펙티브 코틀린)  (0) 2022.07.27
[KOTLIN] 복잡한 객체를 생성하기 위한 DSL을 정의하라 (이펙티브 코틀린)  (0) 2022.07.20
[KOTLIN] 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (이펙티브 코틀린)  (0) 2022.07.13
[KOTLIN] 제네릭 타입과 VARIANCE 한정자를 활용하라 (이펙티브 코틀린)  (0) 2022.07.10
'KOTLIN' 카테고리의 다른 글
  • [KOTLIN] SEALED CLASS
  • [KOTLIN] 멤버 확장 함수의 사용을 피하라 (이펙티브 코틀린)
  • [KOTLIN] 복잡한 객체를 생성하기 위한 DSL을 정의하라 (이펙티브 코틀린)
  • [KOTLIN] 일반적인 프로퍼티 패턴은 프로퍼티 위임으로 만들어라 (이펙티브 코틀린)
집한구석
집한구석
  • 집한구석
    tgyun615.info
  • 전체
    오늘
    어제
    • 카테고리 (183)
      • JAVA (38)
      • SPRING (15)
      • KOTLIN (23)
      • NETTY (1)
      • DEVOPS (3)
      • DOCKER (7)
      • KUBERNETES (2)
      • JAVASCRIPT (1)
      • SPLUNK (3)
      • ELK (7)
      • KAFKA (2)
      • GO (4)
      • ALGORITHM & DATA STRUCTURE (9)
      • IDE (5)
      • OS (16)
      • NETWORK (14)
      • GCP (2)
      • AWS (2)
      • DATABASE (10)
      • CLEANCODE (7)
      • OTHER (12)
  • 최근 글

  • 태그

    JPA
    ElasticSearch
    docker
    엘라스틱서치
    Kafka
    코틀린
    go
    이펙티브코틀린
    자바
    AWS
    splunk
    SQL
    IntelliJ
    프로그래머스
    Elk
    클린코드
    cleancode
    이펙티브 코틀린
    Spring
    java
  • 링크

    • github
    • linkedin
    • resume
  • hELLO· Designed By 정상우. v4.10.3
집한구석
[KOTLIN] 불필요한 객체 생성을 피하라
상단으로

티스토리툴바