본문 바로가기

# 02/코틀린

[Kotlin] 안드로이드 코딩 1

반응형

글자크기 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("달린다")

}

}


반응형