안드로이드에서 사용하는 단위 6가지를 비교해보자.

dp, sp, pt, px, mm, in이 있다.

기본 지식

픽셀(pixel)은 무엇일까?

디스플레이 화면의 최소단위이다. 

https://news.samsungdisplay.com/305

 

 

11.0인치

2388 x 1668 display

264ppi

 

 

 

11.0인치 : 화면의 물리적인 크기를 나타낸다. (대각선 길이)

2388 x 1668 : 화면의 픽셀 수(가로x세로)

264ppi : pixel per inch; 1인치 안에 들어있는 픽셀 수, dpi(dot per inch)라고 쓰기도 한다.

https://news.samsungdisplay.com/305

안드로이드의 크기 단위

dp 

Density-independent Pixel

dp = px * (160dpi / 기기 dpi)

위와 같은 식을 통해 구할 수 있다.

이렇게 해상도가 다른 2개의 휴대폰이 있을 때,
pixel로 크기를 정의하면 휴대폰마다 보이는 크기가 달라지게 된다.

dp는 화면의 해상도에 상관없이 이미지를 같은 비율로 표시할 수 있다.

안드로이드에서는 160dpi 를 기준으로 사용하며, 이때 1dp는 대략 1px과 같다.

화면의 밀도가 160dpi보다 늘어난다면 사용되는 pixel수는 화면의 dpi에 따라 확장된다.

화면에 상관없이 같은 비율로 보이는 단위

sp

텍스트의 크기에 사용되는 단위로 dp 단위와 같다.

다만, 시스템 글꼴 설정에따라 크기가 달라질 수 있는 단위이다.

pt

화면 밀도와 상관없이 모든 기기에서 1pt = 1/72 inch 이다.

72pt = 1 inch

px

화면에 실제 픽셀에 대응되는 단위

in, mm

실제 물리적인 inch, mm 길이

 

 

 

코틀린의 데이터 클래스는 특정한 행동, 동작보다는 데이터를 옮기는 데 특화된 클래스이다.

data class Student(val name: String, val age: Int, var grade: String)

이런 식으로 작성할 수 있다.

  • 생성자에는 attribute가 1개 이상 필요하다.
  • val, var가 아닌 파라미터는 사용할 수 없다.
  • equals(), hashCode(), toString(), copy() 메소드들을 기본적으로 제공해준다.
  • 구조분해가 가능하다. 

{} 바디 안에 attribute와 메소드를 추가할 수도 있다.


주의

  • copy()는 새로운 객체를 만들어 복사하지만, 객체 내부의 참조들은 shallow copy(얕은 복사)가 된다.
  • 예를 들어 다음과 같다.
data class School(val name: String,val students: List<Student>)

val school1 = School("Korea", arrayOf(Student(...), ...))
val school2 = school1.copy()
  • 위와 같은 코드에서 school1과 school2는 각각 다른 인스턴스를 참조하지만, students에 대한 참조는 같다.
    • students가 만약 MutableList이라면 주의가 필요하다.

'Programming > 언어' 카테고리의 다른 글

[Kotlin] object, companion object  (0) 2023.02.26
[Kotlin] Generics 공변성, 반공변성(out, in)  (0) 2023.02.26
[Kotlin] Collection의 View  (0) 2023.02.13
[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 타입추론  (0) 2023.02.12

코틀린의 각 컬렉션 클래스들은 Mutable, Immutable 2가지가 존재한다.

최근 버전의 자바는 Immutable 컬렉션을 제공하지만, Mutable 컬렉션과 같은 인터페이스를 구현하고 있기 때문에, add와 같은 메소드들을 호출할 수 있고, 이는 실행시간에 예외를 발생시킨다.

코틀린은 Immutable 컬렉션의 연산이 불가능하다는 것을 실행시간에 알리지 않는다.

그래서 View가 존재한다.

  • List, Set, Map은 각각 뷰를 2개씩 가지고 있다. 
    • Mutable View - 읽기, 쓰기
    • Immutable View - 읽기 전용
  • mutable이든, immutable이든 자바의 기본 컬렉션에 매핑된다.
    • 쓰기, 읽기 제한을 하는 것은 코틀린 컴파일러의 역할이다.
    • 따라서 실행 시간에 오버헤드가 없다.
  • 예를들어, MutableList, List 컬렉션이 있다.
    • 둘 다 코틀린의 ArrayList에 매핑되지만, List를 사용할 때는 add같은 쓰기 연산을 할 수 없다. 

 

  • Immutable View가 스레드 안정성을 보장하지는 않는다.
    • immutable view가 참조하고 있는 컬렉션은 자바의 mutable 컬렉션이다.
      • 실제로 매핑된 컬렉션을 참조하는 다른 뷰가 변경할 수도 있다. 

 

'Programming > 언어' 카테고리의 다른 글

[Kotlin] Generics 공변성, 반공변성(out, in)  (0) 2023.02.26
[Kotlin] Data Class  (0) 2023.02.15
[Kotlin] Unit, Any, Nothing 클래스  (0) 2023.02.12
[Kotlin] 타입추론  (0) 2023.02.12
[Kotlin] 표현식과 명령문  (0) 2023.02.12

Unit

  • Java의 void와 대응되는 개념이다.
  • 코틀린은 함수에 리턴이 없으면 Unit타입으로 추론한다.
    • void가 아니라 Unit객체를 리턴하기 때문에 모든 함수가 표현식이 될 수 있다.
  • Unit 클래스는 toString() 함수를 가지고 있다. 
    • 그렇게 유용하지 않지만, 반환값이 없을 때 생기는 문제점을 처리해준다.
      • ex) 출력하면 kotlin.Unit으로 나온다. 

Any

  • Java의 Object에 대응되는 클래스이다.
  • toString(), equals(), hashCode() 함수를 가지고 있다.
  • 모든 코틀린 클래스의 조상(Superclass)이다. 
  • Any는 확장함수를 통해 특별한 메소드들을 제공한다.
    • Pair를 만들기 위한 to()함수
    • let(), run(), apply(), also() 등

Nothing

  • 함수가 아무것도 리턴하지 않을 경우 리턴하는 타입이다. 
    • Java에는 대응되는 타입이 없다.
  • 코틀린에서는 함수가 리턴하지 않을 때, Unit을 사용한다고 했는데 무슨말인가?
    • 가끔 함수가 진짜로 아무것도 리턴하지 않는 상황이 있다.
    • 리턴이라는 행위 자체를 하지 않는 것이다.
      • 무한 루프
      • 예외 던지기
  • Nothing은 인스턴스가 없고, 값이난 결과가 영원히 존재하지 않는다는 것을 나타낸다.
fun computeSqrt(n: Double): Double {
    if (n >= 0) {
        return Math.sqrt(n)
    } else {
        throw RuntimeException("No negative please")
    }
}

fun throwException(): Nothing {
	throw Exception()
}
  • 예외를 던지는 것은 리턴하는 행위가 아니다. 이런 경우 아무 것도 리턴되지 않는 것이다. 
  • computeSqrt()에서 if 문은 Double을 반환하고, else는 Nothing이다. 
    • 근데 반환값은 왜 Double일까?
      • Nothing은 모든 클래스로 대체될 수 있다. 모든 클래스의 서브(자식)클래스이기 때문이다.

'Programming > 언어' 카테고리의 다른 글

[Kotlin] Data Class  (0) 2023.02.15
[Kotlin] Collection의 View  (0) 2023.02.13
[Kotlin] 타입추론  (0) 2023.02.12
[Kotlin] 표현식과 명령문  (0) 2023.02.12
Java 코드가 실행되는 과정  (0) 2021.12.26

+ Recent posts