티스토리 뷰

챌린지반 5주차 세션 정리

 

LifeCycle

 

생명주기란?

프로그래밍에는 생명주기(lifecycle)라는 것이 존재하는데 생명주기에는

프로그램이 생성되는 시점, 멈추는 시점, 종료되는 시점이 포함된다.

 

Android Lifecycle은 3가지(Activity, Fragment, Service)가 존재한다.

 

 

생명주기의 필요성

안드로이드는 생명주기 개념을 이용해 앱의 실행여부를 판단할 수 있다.

 

생명주기 메서드를 적절하게 이용한다면 불필요한 자원 낭비를 방지해

메모리와 CPU자원을 확보할 수도 있고, 앱의 현재상태를 저장해 복원하는 것도 가능하다.

 

 

생명주기 메서드명

메서드 이름 앞에 "on"이 붙어있으면 생명주기 관련 메서드라고 보면 된다.

 

 

 

Activity 생명주기

 

생명주기 순서도

 

사진은 Activity Lifecycle 순서도이다.

 

처음 액티비티가 실행되면 onCreate > onStart > onResume을 호출해

액티비티를 실행하기 전에 할 작업을 완료한 뒤액티비티를 띄운다.

 

다른 화면으로 전환했을 onPause 호출해 현재 액티비티를

정지시킨 다음 onStop > onDestroy 호출해 액티비를 종료시킨다.

 

 

액티비티 재호출 과정

액티비티가 onPause 상태일 때 다른 앱이 메모리를 요구하면 경우

안드로이드 시스템은 메모리를 확보하기 위해 해당 앱의 프로세스를 종료시킨다. 

 

사용자가 다시 해당 앱으로 돌아오면 앱이 새로 시작되며 onCreate 호출된다.

 

 

실시간 데이터 가져오기

보통 데이터는 onCreate에서 받아오지만, 주식이나 코인처럼

실시간으로 변하는 데이터는 onResume()에서 가져와야 한다.

 

다른 화면으로 이동했다가(onPause 호출) 다시 해당 액티비티로 돌아올

onResume 호출하여 실시간 데이터를 보여준다.

 

 

 

Fragment 생명주기

 

생명주기 순서도

 

위 사진은 프래그먼트의 생명주기 순서도이다.

 

 

데이터 불러오기

onCreateView가 호출되는 시점에서 프래그먼트의 뷰가 생성된다.

 

따라서 불러오는데 시간 많이 걸리는 데이터는 onCreate에서 불러온 뒤에

onCreateView에서 불러온 데이터를 바인딩 하게되면 반응성이 좋은 앱을 만들 있다.

 

 

뷰 상태 저장하기

예를 들어 회원가입 페이지에서 모든 정보를 다 입력한 상태에서

다른 화면을 띄웠다가 다시 돌아왔다고 가정해보자.

 

다시 회원가입 페이지를 띄운 시점에서 onCreate를

호출하기에 입력한 모든 정보가 날아가게 된다.

 

이러한 상황을 방지하기 위해 onSaveInstanceState 호출해 뷰의 상태를

저장하고, onViewStateRestored 호출해 저장된 상태를 복원한다.

 

 

자원 해제

onDestroyView에서는 어댑터와 뷰 리스너 같은 뷰와 관련된 자원을 해제하고, 

onDestroy에서는 백그라운드 작업 또는 데이터베이스 연결 같은

화면 전체에 들어가는 프로세스를 종료하는 작업을 한다.

 

적절한 자원 해제를 통해 앱의 메모리를 효율적으로 관리할 수 있다.

 

 

 

함수형 프로그래밍

 

함수형 프로그래밍이란?

함수형 프로그래밍이란 함수를 변수처럼 사용할 수 있도록 하는

프로그래밍 기법으로 코틀린은 함수형 프로그래밍을 지원한다.

 

 

변수를 함수로 초기화

val some = fun something() {}

위와 같이 변수에 함수를 직접적으로 대입하는 방식은 자바스크립트에서 사용된다.

 

// 함수 선언
fun something() {
    println("something")
}

// 변수에 함수 대입
val some = ::something

// 함수 호출
fun main() {
    some.call()
}

코틀린에서 함수를 변수처럼 사용하려면 

함수 선언 > 변수명 = ::함수명 > 변수명.call()을 해줘야한다.

 

val lambda = {num1: Int, num2: Int -> num1 + num2}

fun main() {
    println(lambda(1,2))
}

변수를 람다식으로 초기화해서 함수처럼 쓸 수도 있다. 

 

 

변수의 구성요소

 

변수는 이름, 값, 타입으로 구성되어 있다.

 

val lambda : (String, Int) -> String = {
    pokemon: String, num: Int -> "$pokemon number is $num"
}

fun main() {
    println(lambda(“pikachu”, 25))
}

따라서 변수를 람다식 함수로 초기화할 때 타입지정도 가능하다.

 

 

Pure functions

fun add(x: Int, y: Int) : Int {
  return x + y
}

순수 함수란 파라미터만이 반환값에 영향을 미치는 함수를 뜻한다.

즉 외부의 변수에 의해 결과값이 바뀌지 않는다.

 

 

Side Effects

fun add(x: Int, y: Int) : Int {
  val res = x + y
  writeResultToFile(res) // 결과값을 파일에 저장하는 함수라 가정
  return res
}

사이드 이펙트란 함수가 반환값 외에 외부 상태를 변경하는 경우를 의미한다.

 

fun add(x: Int, y: Int) : Int {
  return x + y // 순수함수로 변경
}

fun main() {
  val res = add(1, 2) // add 함수 재활용 가능
  writeResultToFile(res) // 사이드 이펙트 몰아두기
}

add 함수를 사이드 이펙트가 없는 순수함수로 바꾼 뒤

메인에서 결과값을 wrietResultToFile의 파라미터로 넣어주는 것이 바람직하다.

 

 

순수함수의 장점

순수 함수를 작성하면 사이드 이펙트를 한 곳으로 모으기 쉬워진다.

이렇게 하면 에러가 발생했을 때 디버깅 과정이 훨씬 편해지게 된다.

 

또한 각각의 함수는 외부 상태에 영향을 미치지 않기에

실행순서에 상관없이 함수를 호출할 수 있어 비동기 프로그래밍에 용이하다.

 

 

 

확장함수

 

확장함수란?

 

외부 라이브러리에 함수를 추가하고 싶을 때 보통 확장함수란 걸 쓴다.

확장 함수는 this 키워드로 본인의 수신 객체를 참조한다.

 

 

예제

class MainActivity: AppCompatActivity(){
    …
    showToast(“Hello”)
}

fun Activity.showToast(msg: String){
    Toast.makeText(this, msg, Toast.LENGHT_SHORT).show()
}

액티비티의 확장함수를 정의해 액티비티 클래스 내라면

어디서든 showToast 호출해 토스트 메시지를 띄울 있다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함