내일배움캠프 40일차

김재현·2024년 4월 23일
post-thumbnail

오늘은 튜터님께 코드 리뷰를 받고 삽질만 했다...흑

  1. singleton 구현방식 비교해보기

  2. DetailActivity, MainActivity

  • onCreate 구현부 관련 로직 메서드로 묶기
    ex) initView(), initBinding(), initClickListener()

  • decimalformat extention or util 패키지로 빼서 관리

  1. MultiViewAdapter
    - holder.setisRecyclable(false) 구현부 삭제

- ViewHolder 클래스 inner class -> nested class로 선언부 변경

  1. singleton 구현 시 companion object와 object로 만드는 차이

오늘은 fragment에서 암시적 인텐트 구현한다고 하루종일 찾다가 삽질만하여 공부는 많이 못하였다 ㅠㅠ (가능하다는건 확인했으니 내일도 삽질해야제!)

holder.setIsRecyclable(false)

  • 먼저 3번 holder.setIsRecyclable(false) 구문을 검색해보았다.
    재활용을 막는 코드라고 하는데 데이터 꼬임 문제를 해결할 수는 있지만 재활용을 하기 위해 recyclerview를 사용하기에...사실 의미없는 구문이었다.

    바로 깔끔하게 지워서 해결했다. 다음부터는 모르는 구문은 꼼꼼히 검색해야겠다...ㅎ

ViewHolder 클래스 inner class -> nested class로 선언부 변경

  • 이 부분은 튜터님께서 수정하라고 알려주셨는데 깜빡하고 예전 상태로 제출해버렸다. 다시 한번 복습해보자!

inner class를 사용하면 직렬화 문제 발생 가능성이 있어서 inner class 내부에 outer class 정보를 보관, 참조를 해제하지 못하면 메모리 누수 발생가능성이 있다고 하셨다.


수정하기 전

수정한 후

class 안에 class가 존재하면 inner class로 작성해주어야 하는줄 알고 있었다.

자바에서는 내부에 클래스를 정의하면 자동으로 내부 클래스가 되었지만 코틀린에서는 자동으로 중첩 클래스가 된다.

여기서 내부(inner) 클래스는 기본적으로 외부 클래스를 참조하게 되고 중첩(nested) 클래스는 외부 클래스를 참조할 수 없습니다.

//중첩 클래스
class Basic {
	private val a: Int = 1
    class Nested {
    	fun b() = 2
    }
}

val c = Basic.Nested().b() // == 2

중첩 클래스는 외부 클래스를 참조하지 않기 때문에 값이 2가 됩니다.

//내부 클래스
class Basic {
	private val a: Int = 1
    inner class Inner {
    	fun b() = a //외부 클래스 참조 가능
    }
}

val c = Basic.Inner.b() // == 1

내부 클래스는 외부 클래스가 참조 가능하기 때문에 c의 값은 1이 됩니다.

이때 메모리 누수는 왜 발생하는가?? 객체가 항상 참조하고 있다는 것은 내부 클래스에서 항상 외부 클래스의 객체를 참조하기 때문에 객체가 적절한 시점에 삭제되지 못하기 때문에 메모리 누수가 발생한다고 합니다.

메모리 누수가 위험한 이유는 컴파일 시 오류가 발생하는 명식적으로 알 수 있는 것이 아니라 암묵적으로 프로그래머가 발견하기 전까지는 알 수 없는 것이기 때문에 특별한 경우가 아니라면 내부 클래스 사용을 지양하고 중첩 클래스를 사용하는 것이 권장된다고 합니다.

참고 : https://shinjekim.github.io/kotlin/2019/08/29/Kotlin-%EB%82%B4%EB%B6%80-%ED%81%B4%EB%9E%98%EC%8A%A4(inner-class)%EC%99%80-%EC%A4%91%EC%B2%A9-%ED%81%B4%EB%9E%98%EC%8A%A4(nested-class)/

다시 과제 구현하러 가봐야겠다 ㅠㅠ 오늘은 여기까지! 이번주안에는 다 해야겠다.

하루의 마무리

  • 내일도 삽질해야지

0개의 댓글