Apple is Apple

일일 회고

 

정말 일주일 밖에 안남았다... 시간이 참 빠르다... 최종 발표 준비를 잘 해보고 유종의 미를 거둬보자..


오늘의 키워드

  • 기술 면접 문답 작성

Sealed class란?

여러 자식 클래스들이 하나의 부모 클래스를 상속받았다고 할 때, 컴파일러는 어떤 클래스들이 부모 클래스를 상속받았는지 알지 못한다.

그래서 이 문제를 해결하기 위해 sealed class라는 개념이 나왔는데 sealed class는 자신은 추상클래스이고, 자신을 상속받는 자식 클래스의 종류를 제한하는 특성을 가지고 있다. 컴파일 시 sealed class의 자식이 어떤 것이 있는지 알 수 있다는 것이다.

 

자식 클래스의 종류를 제한하기 때문에 다음과 같은 특성이 있다.

  • 실드란 '봉인된'이라는 의미로 무언가 안전하게 보관하기 위해 묶어 두는 것
  • 실드 클래스 그 자체로는 추상 클래스와 같기 때문에 객체를 만들 수는 없다.
  • 생성자도 기본적으로는 private이며 private이 아닌 생성자는 허용하지 않음
  • 실드 클래스는 같은 파일 안에서는 상속이 가능 (다른 파일에서 상속 불가) 블록 안에 선언되는 클래스는 상속이 필요한 경우 open 키워드로 선언

이와 같은 특성 때문에 sealed class를 상속 받은 클래스는 한 곳에 모아 관리하기 쉽다는 장점이 있다.

(일반 클래스를 무분별하게 상속하다보면 어디서 뭐가 쓰인 지 헷갈릴 수도 있을 것이다.)

안드로이드에서 ANR이란 무엇이고, 어떻게 방지할 수 있나요?

Application Not Responding의 약자이며, 안드로이드에서 애플리케이션이 일정 시간 동안 응답하지 않을 때 발생하는 오류이다.

 

사용자가 앱을 실행하거나 상호 작용할 때 앱이 일정 시간 내에 응답하지 않으면 시스템이 ANR을 감지하고 해당 앱을 강제로 종료시킨다.

 

ANR 발생 조건 예시

  1. 5초 이내에 터치 이벤트에 대한 응답이 없을 때
  2. Broadcast Receiver의 onReceive()가 5초(포그라운드) 내로 리턴 되지 않을 때
  3. 서비스를 특정 시간 이내에 실행할 수 없을 때
  4. UI가 없는 브로드캐스트 리시버, 서비스도 실행 주체는 메인 쓰레드이므로 긴 시간을 소모하는 작업일 경우 ANR을 발생시킴

등 여러 가지 조건이 있다.

 

ANR을 방지하기 위해서는 다음과 같은 사항들을 적용해 볼 수 있다.

  1. 메인쓰레드에서 긴 작업 피하기(중요) - 안드로이드는 메인쓰레드가 UI작업을 처리하므로, 메인 쓰레드에서 오랜 시간이 걸리는 작업을 피해야한다.
  2. 백그라운드 쓰레드 활용 - 메인쓰레드를 차단하지 않고 작업을 하기 위해, 비동기로 작업해야하고, Thread, Coroutine 같은 백그라운드 쓰레드를 사용할 수 있다.
  3. 응답 시간을 고려한 딜레이 사용 - 시간이 오래 걸리는 작업을 수행 할 때는 ,사용자에게 작업 중을 알리는 UI(다이얼로그, 프로그레스바 등)를 보여주고, 작업이 끝나면 UI를 업데이트 한다.
profile

Apple is Apple

@mjjjjjj