px • Pixel • 화면을 구성하는 최소 단위 • 실제로 존재하는 물리적 단위 • 같은 단위 면적에 픽셀이 많이 있을수록 해상도가 높다. • px 단위로 UI를 설정하면 사용자의 해상도마다 UI가 달라질 수 있다. dp • Density-independent Pixels • 픽셀에 독립적인 단위 • 화면의 크기가 달라도 동일한 비율로 보여주기 위해서 안드로이드에서 정의한 단위 • 비율로 크기를 정함. • 해상도가 160dpi일 때를 기준으로 1px 만큼의 크기가 1dp이다. * dpi - Dot Per Inch - 해상도의 단위 - 인치 당 들어가 있는 픽셀의 수 ex) 100dpi = 1인치당 픽셀의 수 100개 - 즉, 1인치당 160개의 픽셀이 들어가는 디스플레이의 1px의 크기가 1dp - 이..
언어의 목적 1. General Purpose Language • 범용적인 목적을 가지고 있는 언어 ex) Kotlin, Python, Java, C, C++, Swift 등... - 우리가 아는 일반적인 언어 2. Domain Specific Language (DSL) • 도메인 특화 언어 -> 특수한 목적을 달성하기 위한 언어 • 만들 때 부터 특정 문제를 해결하기 위해 만들어 짐. -> 문법이 간단함. ex) XML XML(eXtensible Markup Language) • 데이터의 구조와 의미를 잘 전달할 수 있게 만든 언어. • 안드로이드에서 UI를 그리기 위해 채택되었다. • extensible = 확장 가능하다. -> 태그 안에 태그를 추가, 또 추가... 할 수 있다. • markup l..
인터페이스 • 구현부 없이 틀을 만들어 놓은 것 • 인터페이스를 상속한 클래스는 해당 인터페이스의 틀을 지켜야 한다. - 일종의 규약(프로토콜)이다. - 지켜야 하는 규약이기 때문에, 클래스 내부를 보지 않고 인터페이스만 봐도 어떤 멤버가 들어있는 지 등의 사용법 유추가 가능하다. • 자료형으로 쓸 수 있다. • 다중 상속, 다중 구현이 가능하다. interface Tiger { fun bite() fun hide() } interface Bird { fun fly() } class BackDoSanTiger: Tiger, Bird { override fun bite() { // Tiger 인터페이스의 bite 구체적 구현 println("문다.") } override fun hide() { // Tig..
Null Safety • 코틀린이 가지고 있는 언어적 특징 • Null을 처리하기 위한 코틀린의 문법 1. 자료형 • non-null -> Int • nullable -> Int? 2. !! • null이 아님을 보장 • but 코틀린이 확실하게 null이 아님을 판단하는 것이 아닌, 개발자가 코틀린에게 null이 아니니깐 넘어가~하고 보장하는 느낌. • 실제로 개발자가 예측 못 한 null이 나올 수 있다. • 되도록 사용 X -> 정말 필요할 때, 정말 확실할 때만 사용. 3. ?. (safe call) • 원래 AAA 객체의 BBB라는 메소드를 실행하기 위해서는 AAA.BBB를 해야 한다. - AAA가 null일 경우 null 내부를 접근하려고 하여 오류가 발생한다. - 이런 경우 안전하게 메소드를..
형변환(Casting) 1. 기본 자료형 간의 형변환 ex) 정수형 123 -> 문자열형 "123" ex) 실수형 123.5 -> 정수형 123 • 자료형 간의 형변환을 모두 기억할 수는 없고 그때마다 확인하면 된다. val NUM1_INT: Int = 10 val NUM1_STR: String = NUM1_INT.toString() val NUM1_INT2: Int = NUM1_STR.toInt() println(NUM1_INT + 10) // 20 출력 : NUM1_INT은 정수형 println(NUM1_STR + 10) // 1010 출력 : Int -> String 형변환 성공 println(NUM1_INT2 + 10) // 20 출력 : String -> Int 형변환 성공 val NUM2_FL..
상속(Inheritance) • 상속이 필요한 경우 - 바탕이 되는 클래스에 확장이 되는 클래스를 만들고 싶은 경우 - 이미 존재하는 클래스를 합칠 때 • open 키워드로 설정된 클래스만 상속할 수 있다. ex) open class 클래스명() {} • final 키워드로 설정된 클래스는 상속할 수 없다. - 명시하지 않는다면 기본적으로 final로 선언. ex) final class 클래스명() {} • 상속해준 클래스를 슈퍼 클래스(또는 부모 클래스), 상속받은 클래스를 서브 클래스(또는 자식 클래스)라고 한다. • 서브 클래스는 슈퍼 클래스가 가지고 있는 모든 것을 물려 받는다. // 상속을 사용하지 않을 때 - 같은 코드 반복 및 클래스끼리의 연관성 확인 어려움. class Warrior() {..
범위(Scope) • 변수를 사용할 수 있는 범위, 영역 • 변수, 함수, 클래스, 패키지 등의 범위가 있다. • 보통, 변수가 선언된 그 블록({ }로 둘러쌓인 범위)이 변수의 스코프이다. - 즉, 한 블록 안에서 선언된 변수는 그 안에서만 사용이 가능하다. • 스코프 내부에 또 스코프가 있다면, 상위 스코프, 하위 스코프로 나뉜다. - 하위 스코프에서는 상위 스코프 멤버를 사용 및 (재)할당 할 수 있지만 반대는 안 된다. // 변수 사용 가능 범위 fun func1() { val NUM1 = 1 } println(NUM1) // 오류 발생 : NUM1은 없는 변수 -> NUM1 변수의 사용 가능 범위는 func1 함수의 블럭({ }) 안. // 상위 스코프와 하위 스코프 var outsideNum ..
프로퍼티(Property) • 클래스(객체)가 가지고 있는 변수 1. getter / setter • getter - 클래스의 프로퍼티에 접근 할 때 ex) person.name • setter - 클래스의 프로퍼티 값을 설정할 때 ex) person.name = "홍길동" • 기본적으로 프로퍼티에 값을 저장하는 것이나, 저장되어 있는 값을 불러오는 것은 코틀린에서 제공해주지만, 특별한 기능을 추가하고 싶을 경우 개발자가 직접 작성할 수 있다. • getter와 setter 모두 작성 가능하고, 둘 중 하나만 독립적으로 작성할 수도 있다. • 모든 프로퍼티마다 설정할 수 있다. • 해당 프로퍼티는 field로 받는다. class Book() { var title: String = "타이틀" get() {..