🐱 With All My Animal 🐶
💡 [ 23일차 11/9일 ] 💡
📌 오늘의 기술면접 질문 Q&A
when은 범위가 제한되고 값도 특정할 수 있는 경우에 사용합니다.
- 요일 데이터 : 월, 화, 수, 목, 금, 토, 일
- 월 데이터: 1월 .. 12월
if문과의 차이점은 우선 조건을 검사하여 수행한다는 점은 비슷하지만, if랑 달리 when은 조건식이 아닌 조건을 검사할 값을 넣는다는 점이다.
즉, when에는 참이나 거짓이 아닌 변수가 들어간다.
fun main() {
val x = 5
when (x) {
1 -> println("x는 1이다")
2, 3 -> println("x는 2 또는 3이다")
in 4..10 -> println("x는 4와 10 사이에 있다")
else -> println("x는 다른 수이다")
}
}
// 출력
x는 4와 10 사이에 있다
🌠 if문
fun isPromotionTarget(addToCart: Boolean, rates: Int): Boolean {
if (rates < 2) { return false }
if (rates > 3) { return false }
if (rates == 3) { return true }
return addToCart && rates == 2
}
🌠 when문
fun isPromotionTarget(addToCart: Boolean, rates: Int) = when {
rates < 2 -> false
rates > 3 -> false
rates == 3 -> true
else -> addToCart && rates == 2
}
=> if문에 비해 when문이 더 나은 가독성과 유지보수성을 제공한다.
=> when문은 if문에 비해서 간결하다.
🌠 kotlin 컴파일러
: when이 표현식으로 사용 될 때 else 부분이 존재하는지, 표현식이 가능한 입력에 대해 값을 생성하는지 검증한다.
🌠 when에 인자를 전달하는 예시
fun whatToDo(dayOfWeek: Any) = when (dayOfWeek) {
"Saturday", "Sunday" -> "Relax"
in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> "Work hard"
in 2..4 -> "Work hard"
"Friday" -> "Party"
is String -> "What?"
else -> "No Clue"
}
println(whatToDo("Sunday")) // Relax
println(whatToDo("Wednesday")) // Work hard
println(whatToDo(3)) // Work hard
println(whatToDo("Friday")) // Party
println(whatToDo("Munday")) // What?
println(whatToDo(8)) // No Clue
fun printWhatToDo(dayOfWeek: Any) {
when (dayOfWeek) {
"Saturday", "Sunday" -> println("Relax")
in listOf("Monday", "Tuesday", "Wednesday", "Thursday") -> println("Work hard")
in 2..4 -> println("Work hard")
"Friday" -> println("Party")
is String -> println("What?")
}
}
printWhatToDo("Sunday") // Relax
printWhatToDo("Wednesday") // Work hard
printWhatToDo(3) // Work hard
printWhatToDo("Friday") // Party
printWhatToDo("Monday") // What?
printWhatToDo(8) //
픽셀 기반의 래스터 이미지로 구성되어있으며 비트맵 이미지를 손실압축방식으로 압축할 때 일반적으로 사용되는 방식이다.
래스터 이미지 : 픽셀로 구성된 비트맵으로 이미지를 표현하는 것이다. 화소의 위치와 색상, 크기 등의 정보를 모두 저장한다.
손실 압축 : 데이터를 압축하는 과정에서 원본 데이터의 일부를 제거하는 방식이다. 파일의 크기를 줄일 수 있지만, 압축을 풀었을 때 원본 데이터를 완벽하게 복원 할 수없다.
JPEG는 파일 크기와 상관없이 복잡한 컬러와 세밀한 이미지 표현이 필요한 경우 최소한의 손실 압축률을 통해 사용하기에 적합하다.
픽셀 기반의 래스터 이미지로 구성되어있지만, 비트맵 이미지를 손실없이 압축하는 방식을 사용하는 파일 형식이다.
JPEG와 마찬가지로 인터넷에서 가볍게 전송되는 것을 목표로 디자인되어서 비슷한 부분들이 있다.
손실없는 압축 : 원본 이미지의 모든 정보를 보존하면서 파일 크기를 줄일 수 있다.
투명도 제어, 간단한 이미지에 합리적인 압축률로 로고, 아이콘, 오버레이와 같은 단순한 이미지에 적합하다.
텍스트 기반의 그래픽을 지원하기는 하지만, SVG 보다는 저수준의 텍스트 기반 그래픽을 지원한다.
사용자가 페이지 이미지를 보고 시각적으로 문제가 되는 요소가 없는 수준의 이미지 압축을 허용하는데 기존의 JPEG, PNG 등보다 낮은 용량으로 비슷한 이미지 품질을 보여준다.
AV1에 기반한 이미지 파일 포맷으로 AOM에 의해 개발되었으며, 아직은 잘 알려지지 않은 이미지 포맷 형식이다.
< 특징 >
효율적인 압축률과 뛰어난 이미지 품질을 제공한다.
10비트의 색상 깊이를 지원하여 10억가지 이상의 광범위한 색상 표현이 가능하다.
PNG 형식의 알파 채널을 통한 투명도 지원 뿐만 아니라 HDR 기능의 지원으로 밝은 부분과 어두운 부분 사이의 대비를 더욱 선명하게 표현할 수있다.
멀티미디어 기능, 여러 이미지나 애니메이션을 저장하는 것이 가능하다.
< 특징 >
이미지를 선, 곡선, 다각형 등으로 구성하여 표현한다.
android app 개발에서는 SVG를 vector drawable로 변환하여 해상도에 따라 자동으로 스케일링 될 수 있도록하며, 이미지를 확대/축소해도 깨지지 않고 부드럽게 표현되는 장점을 가지고 있어서 다양한 크기와 해상도 디스플레이에서 사용하기 적합하다.
SVG는 xml 기반의 형식으로 정의되어 이미지에 대한 정보를 코드로 확인이 가능하며, 이미지를 텍스트로 편집하고 생성할 수 있으며 다른 요소와 결합하여 동적인 컨텐츠를 생성할 수 있는 유연성을 가지고 있다.
앱 개발은 다양한 해상도에서 이미지 품질을 유지하는 것이 중요한데 SVG를 통해 보완할 수있다.
많은 기능을 제공하며, 이미지 로딩 이외에도 GIF, 비디오 스틸 프레임 등 다양한 미디어 유형을 처리할 수있다.
메모리 관리 측면에서도 효과적으로 동작하며, 메모리 캐시, 디스크 캐시를 지원한다.
많은 커스터마이제이션 옵션을 제공하여 사용자가 이미지 로딩 동작을 세부적으로 제어할 수있다.
Activity나 Fragment의 lifecycle과 통합되어 자동으로 로딩 작업을 관리한다.
라이브러리 자체가 가벼워서 추가적인 의존성이 적다.
kotlin 환경에 높은 호환성을 제공하며, kotlin의 기능을 활용한 DSL을 간결한 코드로 작성이 가능하다.
간단하고 직관적인 API를 제공하여 초보자도 쉽게 사용할 수있다.
성능 면에서도 효율적으로 동작하며, 캐싱과 로딩 속도가 뛰어나다.
최신 이미지 로딩 라이브러리로 최신 안드로이드 플랫폼에 대한 최적화가 이루어져있다.
Kotlin의 코루틴을 지원하므로 비동기 작업을 편하게 처리할 수있다.
둘 다 이미지 로딩 및 캐싱을 효율적으로 처리한다.
둘 다 자체적으로 메모리 캐시 및 디스크 캐시를 관리한다.
참고한 블로그
https://readystory.tistory.com/200 (when문)
https://junes-daily.tistory.com/78 (이미지 포맷 형식)