[Android/Flutter 교육] 특강 1일차

MSU·2024년 1월 26일

Android-Flutter

목록 보기
23/85
post-thumbnail

코루틴은 2일동안 배울 예정 그전에 쓰레드 먼저

코루틴

코루틴 사용 배경

기존에는 안드로이드에서 네트워크 통신 요청에 대한 리스너를 구현하는데 리스너 안에 리스너가 있는 중첩구조가 비일비재함
이런 방식은 작업 구조가 복잡하고 가독성도 안좋아짐
이를 해결하기 위해 코틀린으로 코루틴을 사용함
통신1이 처리될때까지 "대기"하고 있다가 통신1이 끝나면 통신2를 처리 하는 방식
리스너를 중첩하는 것을 방지할 수 있음

코루틴을 배우기 전에 쓰레드를 먼저 배워야 함

쓰레드

아래의 코드를 실행하면 위에서 아래 순서대로 실행됨

fun main() {
    var a1 = 0

    while(a1 < 10){
        println("a1 : $a1")
        a1++
    }

    var a2 = 0
    while(a2 < 10){
        println("a2 : $a2")
        a2++
    }
}
a1 : 0
a1 : 1
a1 : 2
a1 : 3
a1 : 4
a1 : 5
a1 : 6
a1 : 7
a1 : 8
a1 : 9
a2 : 0
a2 : 1
a2 : 2
a2 : 3
a2 : 4
a2 : 5
a2 : 6
a2 : 7
a2 : 8
a2 : 9

Thread 클래스

쓰레드를 만들어서 발생시키면 기존의 while문을 실행시키는 쓰레드와 별도의 쓰레드가 동시에 실행된다.

fun main() {
    var a1 = 0

    // 쓰레드를 가동한다.
    val t1 = ThreadClass()
    t1.start()

    while(a1 < 10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}

// Thread 클래스를 상속받은 클래스를 만들어준다.
class ThreadClass : Thread(){
    // 별도의 쓰레드를 발생시켜 처리할 코드가 있는 메서드
    override fun run(){
        var a2 = 0
        while (a2 < 10){
            Thread.sleep(100)
            println("a2 : $a2")
            a2++
        }
    }
}
a1 : 0
a2 : 0
a2 : 1
a1 : 1
a2 : 2
a1 : 2
a2 : 3
a1 : 3
a1 : 4
a2 : 4
a1 : 5
a2 : 5
a2 : 6
a1 : 6
a2 : 7
a1 : 7
a1 : 8
a2 : 8
a2 : 9
a1 : 9

Runnable 인터페이스

이미 상속받은 클래스가 있어 Thread클래스를 상속받기 어려운 경우 Runnable인터페이스를 구현하는 방법

fun main() {
    var a1 = 0

    // 쓰레드를 가동한다.
    val t1 = ThreadClass()
    t1.start()

    // 쓰레드를 가동한다.
    val r2 = RunnableClass()
    val t2 = Thread(r2)
    t2.start()

    while(a1 < 10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}

// Thread 클래스를 상속받은 클래스를 만들어준다.
class ThreadClass : Thread(){
    // 별도의 쓰레드를 발생시켜 처리할 코드가 있는 메서드
    override fun run(){
        var a2 = 0
        while (a2 < 10){
            Thread.sleep(100)
            println("a2 : $a2")
            a2++
        }
    }
}

// Runnable 인터페이스를 구현한 클래스
class RunnableClass : Runnable{
    // 별도의 쓰레드를 발생시켜 처리할 코드가 있는 메서드
    override fun run() {
        var a3 = 0
        while(a3 < 10){
            Thread.sleep(100)
            println("a3 : $a3")
            a3++
        }
    }
}
a1 : 0
a2 : 0
a3 : 0
a3 : 1
a2 : 1
a1 : 1
a1 : 2
a3 : 2
a2 : 2
a1 : 3
a3 : 3
a2 : 3
a2 : 4
a3 : 4
a1 : 4
a3 : 5
a1 : 5
a2 : 5
a3 : 6
a2 : 6
a1 : 6
a2 : 7
a3 : 7
a1 : 7
a1 : 8
a2 : 8
a3 : 8
a3 : 9
a2 : 9
a1 : 9

thread 고차함수

  • 코드 블럭 내에 작성한 코드를 별도의 쓰레드로 가동시켜준다.
  • 코틀린에서만 지원하는 기능
import kotlin.concurrent.thread

fun main() {
    var a1 = 0

    // thread 코드 블럭 사용
    // 코드 블럭 내에 작성한 코드를 별도의 쓰레드로 가동시켜준다.
    thread {
        var a4 = 0
        while(a4 < 10){
            Thread.sleep(100)
            println("a4 : $a4")
            a4++
        }
    }

    while(a1 < 10){
        Thread.sleep(100)
        println("a1 : $a1")
        a1++
    }
}
a4 : 0
a1 : 0
a4 : 1
a1 : 1
a4 : 2
a1 : 2
a4 : 3
a1 : 3
a1 : 4
a4 : 4
a4 : 5
a1 : 5
a4 : 6
a1 : 6
a1 : 7
a4 : 7
a4 : 8
a1 : 8
a1 : 9
a4 : 9

제네릭

클래스를 정의할 때 프로퍼티 타입을 정해주면 객체가 생성될때 정해준 타입으로 고정되어있음
클래스를 정의할 때 프로퍼티의 타입을 객체가 생성될때 정해주고 싶으면 제네릭을 사용

리사이클러뷰

리사이클러뷰 어댑터 오버라이딩 메서드 3개
안드로이드 OS가 메서드 3개를 자동으로 호출해줌

getItemCount()

전체 항목의 개수

onCreateViewHolder()

항목을 어떤 모양으로 보여줄지
ViewHolder클래스를 상속받은 클래스의 객체를 반환해줌
ViewHolder클래스를 상속받을때 생성자에 rowBinding.root를 전달해줌(xml에서 만든 모양)

onBindViewHolder()

항목에 어떤 데이터를 보여줄지
ViewHolder클래스를 상속받은 클래스의 객체를 전달받아서
xml에서 만든 모양에 출력할 데이터를 설정해줌




※ 출처 : 멋쟁이사자 앱스쿨 2기, 소프트캠퍼스 
profile
안드로이드공부

0개의 댓글