글자크기 dp 많이 쓰는데 dp는 글자크기 고정 시스템 글자크기 커져도 안커짐
sp 쓰면 시스템 글자크기에 따라 글자 크기 조정됨!
button.setOnClickListener {
textView.text = "헬로 안드로이드"
}
아이디 지정해주면 findViewById 안해줘도 바로 사용할 수 있음.
스크래치 파일 생성해주면 바로바로 코드 확인 할 수 있음
스크래치 파일 오류뜨면 Use REPL 체크 계속 빨간줄밑줄 있으면 Make before Run 도 체크
한번 체크해주고 런 한 다음부터 체크안해주고 런해도 에러 안뜰 거임!!
스크래치 파일은 위에 안드로이드 프로젝트로 보면 스크래치 파일 볼 수 있음
fun greet(str : String) : Unit {
println(str)
}
fun greet(str : String) : Unit = println(str) // 간단하게 줄일 수 있음
greet("안녕하세요")
val str = """
#
##
###
"""
println(str)
자바에서 문자열 비교는 equals() 메서드 코틀린은 ==
자바에서 오브젝트 비교 시에 == 코틀린은 ===
코틀린은 $기호로 변수의 값을 불러올 수 있음
val str = "안녕"
println (str + "하세요.") // 자바
// 코틀린
println ("$str 하세요") // 안녕 하세요
println("${str}하세요") // 안녕하세요
배열
val numbers : Array<Int> = arrayOf(1, 2, 3, 4, 5)
val number2 = arrayOf(1, 2, 3, 4, 5) // 자료형 생략 가능
number[0] = 5 // [5, 2, 3, 4, 5] 변경 가능
제어문 - if, when, for, while의 4가지로 나뉨. when문 제외하고는 자바와 거의 같다.
if 문
val a = 10
val b = 20
// 일반적인 방법
var max = a
if (a < b) max = b
if - else 문
if (a>b) {
max = a
} else {
max = b
}
// 자바와 같음
val max = if (a>b) a else b
// 한 줄로 사용가능
when 문 - 자바의 switch 대신인데 사용하기 더 좋음
val x = 1
when (x) {
1 -> println ("x == 1") // 값 하나
2, 3 -> println ("x == 2 or x == 3") // 여러 값은 콤마로
in 4.. 7 -> println ("4부터 7 사이") // in 연산자로 범위 지정
!in 8.. 10 -> println ("8부터 10 사이가 아님")
else -> { // 나머지
print("x는 1이나 2가 아님")
}
}
val number = 1
val numStr = when (number % 2) {
0 -> "짝"
else -> "홀"
}
val number = 1
fun isEven ( num : Int ) = when (num % 2) { // 결과가 String 으로 추론되어 반환형 선언 생략 가능
0 -> "짝"
else -> "홀"
}
println(isEven(number)) // 홀
for 문
val numbers = arrayOf(1, 2, 3, 4, 5)
for ( num in numbers ) {
println (num) // 1; 2; 3; 4; 5
}
val nums = listOf(1, 2, 3, 4, 5) // val nums: List<Int>
nums.fonEach { println(it) } // 1; 2; 3; 4; 5
val nums = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
nums.filter { it % 2 == 0 }.forEach { println(it) } // 2; 4; 6; 8; 10
// 1~3 까지 출력
for (i in 1..3) {
println(i) // 1; 2; 3
}
// 0~10까지 2씩 증가하며 출력
for (i in 0..10 step 2) {
println(i) // 0; 2; 4; 6; 8; 10
}
// 10 부터 0 까지 2씩 감소하며 출력
for (i in 10 downTo 0 step 2) {
println(i) // 10; 8; 6; 4; 2; 0
}
while 문 - 자바와 완전 동일. 잘 안쓴다고..
// while
var x = 10
println(x)
while(x>0) {
x--
println(x) // 9; 8; 7; 6; 5; 4; 3; 2; 1; 0;
}
// do while
var x = 10
do {
x--
println(x) // 9; 8; 7; 6; 5; 4; 3; 2; 1; 0;
} while (x>0)
클래스
// 클래스 선언
class Person {
}
// 인스턴스 생성 new 빠짐
val person = Person()
생성자
// 자바 생성자
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() =/ 0.getClass()) return false;
Person person = (Person) o;
return Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name);
}
@Override
public String toString() {
final StringBuffer sb = new StringBuffer("Person{");
sb.append("name='").append(name).append('\'');
sb.append('}');
return sb.toString();
}
}
// 클래스 선언
class Person(var name : String) {
}
// 자바에서 equals, hashCode, toString 까지 만든 것과 같음.
data class Person (val name:String)
class Person (val name : String = "철수") // 철수라는 기본값 설정 가능
val person = Person("영희") // name 영희
val person2 = Person() // name은 기본값은 철수
// name을 출력하는 생성자를 만들 수 있음
class Person {
constructor(name : String) {
println(name)
}
}
// 위의 코드와 같음. init 블록에 작성한 코드가 클래스를 인스턴스화 할 때 가장 먼저 초기화된다.
class Person(name : String) {
init {
println(name)
}
}
프로퍼티
- 코틀린은 속성에 값을 설정하거나 얻을 때 게터/세터 메서드 없이 바로 점. 을 찍고 name 프로퍼티에 접근할 수 있다.
// 클래스 선언
class Person(var name : String) {
}
// 인스턴스 생성
val person = Person("멋쟁이")
person.name = "키다리" // 쓰기
println(person.name) // 읽기
접근 제한자
public (생략 가능) - 전체 공개 , 자바에서는 생략 안됨
private - 현재 파일 내부에서만 사용 가능
internal - 같은 모듈(하나의 앱) 내에서만 사용 가능 , 자바에는 없음, 거의 쓸일 없음
protected - 상속받은 클래스에서 사용 가능
클래스의 상속
- 코틀린에서의 클래스는 기본적으로 상속이 금지된다. 상속이 가능하게 하려면 open 키워드를 클래스 선언 앞에 추가 해줘야됨!!
open class Animal {
}
class Dog : Animal() {
}
open class Animal(val name : String) {
}
class Dog(name : String) : Animal (name) {
}
내부 클래스
- inner 선언 안해주면 외부 클래스의 변수 접근 불가
class OuterClass {
var a = 10
// 내부 클래스
inner class OuterClass2 {
fun something() {
a = 20 // 접근 가능
}
}
}
추상 클래스
- 추상 클래스는 미구현 메서드가 포함된 클래스. 클래스와 미구현 메서드 앞에 abstract 키워드를 붙인다. 추상 클래스는 직접 인스턴스화할 수 없고 다른 클래스가 상속하여 미구현 메서드를 구현해야 한다. 기본적으로 자바와 동일한 특성을 가진다.
abstract class A {
abstract fun func()
fun func2() {
}
}
class B : A() {
override fun func() { // 자바에서는 @override라고 위에 써줌
println("hello")
}
}
val a = A() // 에러
val a = B() // OK
코틀린에서 : 쓰는 경우
1. val person2 : Person = Person() // 자료형 타입 알려줄 때
2. class Person2 : Person() { } // 클래스의 상속
3. fun something() : String {
return "hello"
} // 함수에서 리턴값의 유형을 나타낼 때
인터페이스
- 인터페이스는 미구현 메서드를 포함하여 클래스에서 이를 구현한다. 추상 클래스와 비슷하지만 클래스가 단일 상속만 되는 반면 인터페이스는 다중구현이 가능하다. 주로 클래스에 동일한 속성을 부여해 같은 메서드라도 다른 행동을 할 수 있게 하는 데 사용한다. 코틀린의 인터페이스는 자바와 거의 사용법이 같다.
- 자바에서는 주로 콜백 메서드를 구현하기 위해 인터페이스 사용했음. 코틀린에서는 잘 사용하진 않음
// 인터페이스 선언
interface Runnable {
fun run()
}
// 인터페이스는 구현이 없는 메서드 뿐만 아니라 구현된 메서드를 포함할 수 있다. 이는 자바8의 default 메서드에 대응한다.
interface Runnable {
fun run()
fun fastRun() = println("빨리 달린다")
}
// 인터페이스 상속, 클래스 상속하는 것과 비슷하지만 뒤에 괄호가 없음.
class Human : Runnable {
override fun run() {
println("달린다")
}
}
'# 02 > 코틀린' 카테고리의 다른 글
[Kotlin] 안드로이드 코딩 3 (0) | 2019.07.08 |
---|---|
[Kotlin] 안드로이드 코딩 2 (0) | 2019.07.07 |
[Kotlin] 코틀린의 다양한 함수들 2 (0) | 2019.07.07 |
[Kotlin] 코틀린의 다양한 함수들 1 (0) | 2019.07.05 |
[Kotlin] 네트워크 호출 구현 람다식 활용 (0) | 2019.07.05 |