최종 팀프로젝트 TIL(23)

jxxn_a·2023년 11월 9일
1

팀프로젝트

목록 보기
27/33

🐱 With All My Animal 🐶

💡 [ 23일차 11/9일 ] 💡

📌 오늘의 기술면접 질문 Q&A

1) when문은 어떨 때 사용하나요?

  • 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는 410 사이에 있다

표현식 when

🌠 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

명령문 when

  • 하나 이상의 값에 기반해서 다른 동작을 원하는 경우 표현식이 아니라 명령문으로 사용하면 된다.
  • koltin에서 when이 명령문으로 사용 될 때는 else가 없어도 상관없다.
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) //

2) 안드로이드에서 사이즈가 큰 이미지를 불러오려고 합니다. 어떤 방법을 사용할 수 있을까요?

  • Bitmap 크기 제한
  • 이미지 리사이징
  • 이미지 로딩 라이브러리 등의 방법이 있다.

⭐ Bitmap 크기 제한

  • 안드로이드에서는 메모리 제한이 있기 때문에 큰 이미지를 불러올 때 메모리 부족 문제가 발생할 수 있다. 그래서 큰 이미지를 다룰 때는 Bitmap 객체의 크기를 제한하는 것이 좋다.

⭐ 이미지 리사이징

  • 이미지를 메모리에 로드하기 전에 이미지의 크기를 조절하여 메모리 양을 줄일 수 있다.
  • 이미지 형식 : JPEG, PNG, AVIF, SVG

🎨 JPEG

  • 픽셀 기반의 래스터 이미지로 구성되어있으며 비트맵 이미지를 손실압축방식으로 압축할 때 일반적으로 사용되는 방식이다.

  • 래스터 이미지 : 픽셀로 구성된 비트맵으로 이미지를 표현하는 것이다. 화소의 위치와 색상, 크기 등의 정보를 모두 저장한다.

  • 손실 압축 : 데이터를 압축하는 과정에서 원본 데이터의 일부를 제거하는 방식이다. 파일의 크기를 줄일 수 있지만, 압축을 풀었을 때 원본 데이터를 완벽하게 복원 할 수없다.

  • JPEG는 파일 크기와 상관없이 복잡한 컬러와 세밀한 이미지 표현이 필요한 경우 최소한의 손실 압축률을 통해 사용하기에 적합하다.


🎨 PNG

  • 픽셀 기반의 래스터 이미지로 구성되어있지만, 비트맵 이미지를 손실없이 압축하는 방식을 사용하는 파일 형식이다.

  • JPEG와 마찬가지로 인터넷에서 가볍게 전송되는 것을 목표로 디자인되어서 비슷한 부분들이 있다.

  • 손실없는 압축 : 원본 이미지의 모든 정보를 보존하면서 파일 크기를 줄일 수 있다.

  • 투명도 제어, 간단한 이미지에 합리적인 압축률로 로고, 아이콘, 오버레이와 같은 단순한 이미지에 적합하다.

  • 텍스트 기반의 그래픽을 지원하기는 하지만, SVG 보다는 저수준의 텍스트 기반 그래픽을 지원한다.


🎨 AVIF

  • 사용자가 페이지 이미지를 보고 시각적으로 문제가 되는 요소가 없는 수준의 이미지 압축을 허용하는데 기존의 JPEG, PNG 등보다 낮은 용량으로 비슷한 이미지 품질을 보여준다.

  • AV1에 기반한 이미지 파일 포맷으로 AOM에 의해 개발되었으며, 아직은 잘 알려지지 않은 이미지 포맷 형식이다.

< 특징 >

  • 효율적인 압축률과 뛰어난 이미지 품질을 제공한다.

  • 10비트의 색상 깊이를 지원하여 10억가지 이상의 광범위한 색상 표현이 가능하다.

  • PNG 형식의 알파 채널을 통한 투명도 지원 뿐만 아니라 HDR 기능의 지원으로 밝은 부분과 어두운 부분 사이의 대비를 더욱 선명하게 표현할 수있다.

  • 멀티미디어 기능, 여러 이미지나 애니메이션을 저장하는 것이 가능하다.


🎨 SVG

  • 확장 가능한 벡터 그래픽을 나타내기 위한 xml 기반의 이미지 파일 형식으로 웹 페이지, 앱, 프린트 등 다양한 매체에서 사용된다.

< 특징 >

  • 이미지를 선, 곡선, 다각형 등으로 구성하여 표현한다.

  • android app 개발에서는 SVG를 vector drawable로 변환하여 해상도에 따라 자동으로 스케일링 될 수 있도록하며, 이미지를 확대/축소해도 깨지지 않고 부드럽게 표현되는 장점을 가지고 있어서 다양한 크기와 해상도 디스플레이에서 사용하기 적합하다.

  • SVG는 xml 기반의 형식으로 정의되어 이미지에 대한 정보를 코드로 확인이 가능하며, 이미지를 텍스트로 편집하고 생성할 수 있으며 다른 요소와 결합하여 동적인 컨텐츠를 생성할 수 있는 유연성을 가지고 있다.

  • 앱 개발은 다양한 해상도에서 이미지 품질을 유지하는 것이 중요한데 SVG를 통해 보완할 수있다.


⭐ 이미지 로딩 라이브러리 사용

  • Glide
  • Coil (요즘 Kotiln 개발에서 주로 사용되는 이미지 로딩 라이브러리)
  • Picasso
  • Fresco

✨ Glide

  • 많은 기능을 제공하며, 이미지 로딩 이외에도 GIF, 비디오 스틸 프레임 등 다양한 미디어 유형을 처리할 수있다.

  • 메모리 관리 측면에서도 효과적으로 동작하며, 메모리 캐시, 디스크 캐시를 지원한다.

  • 많은 커스터마이제이션 옵션을 제공하여 사용자가 이미지 로딩 동작을 세부적으로 제어할 수있다.

  • Activity나 Fragment의 lifecycle과 통합되어 자동으로 로딩 작업을 관리한다.


✨ Coil

  • 라이브러리 자체가 가벼워서 추가적인 의존성이 적다.

  • kotlin 환경에 높은 호환성을 제공하며, kotlin의 기능을 활용한 DSL을 간결한 코드로 작성이 가능하다.

  • 간단하고 직관적인 API를 제공하여 초보자도 쉽게 사용할 수있다.

  • 성능 면에서도 효율적으로 동작하며, 캐싱과 로딩 속도가 뛰어나다.

  • 최신 이미지 로딩 라이브러리로 최신 안드로이드 플랫폼에 대한 최적화가 이루어져있다.

  • Kotlin의 코루틴을 지원하므로 비동기 작업을 편하게 처리할 수있다.


✨ Glide와 Coil의 공통점

  • 둘 다 이미지 로딩 및 캐싱을 효율적으로 처리한다.

  • 둘 다 자체적으로 메모리 캐시 및 디스크 캐시를 관리한다.


참고한 블로그
https://readystory.tistory.com/200 (when문)
https://junes-daily.tistory.com/78 (이미지 포맷 형식)

0개의 댓글