스코프 함수(scope function), Data Class, Lamda expression, lateinit vs lazy init, 인텐트(intent), Collection

임현주·2021년 11월 12일
0
post-thumbnail

시작

혼자 공부하면서 정리하고 싶은 부분을 작성한 글입니다 👀
함께 공부하는 사람에게는 도움이 되었으면 좋겠고,
혹시 제가 잘못 이해한 부분이 있다면 알려주시면 감사하겠습니다 💌


🔹 스코프 함수 (scope function)

특정 객체의 컨텍스트 내에서 특정 동작(프로퍼티 초기화, 활용 등)을 실행하기 위한 목적만을 가진 함수

람다 함수로 사용하게 되면 임시로 scope(범위)를 형성하는데, 이 범위에서는 해당 객체의 이름 없이 접근할 수 있다.

apply

객체의 확장 함수.
내부에서는 this를 통해 객체에 접근할 수 있다. (this는 생략 가능)
반환 결과가 객체 자신이기 때문에 주로 객체의 초기화에 쓰인다.

    val person = Person().apply{
        name = "jjwim"
        age = 20
    }

also

객체가 파라미터를 통해 전달 - 람다의 입력값
람다의 입력값은 it으로 접근할 수 있고, 반환 결과는 객체이다.
객체 유효성을 확인하거나 print 함수를 통해 디버깅하는 용도로 사용한다.

    Random.nextInt(100).also { value ->
        print("$value")
    }

    // value 생략
    Random.nextInt(100).also {
        print("$it")
    }

let

주로 null이 아닌 객체에서 람다를 실행할 때 사용하며, 수행 결과를 반환한다.
null Safe한 코드를 작성하기 위해 많이 쓰인다.

    val number:Int?

    // number가 null일 때만 let 안의 내용을 실행한다.
    // if (number != null) 과 같다고 보면 된다.
    val sumNumberStr = number?.let {
        "${sum(10, it)}"
    }.orEmpty()

with

람다의 내부에서 this로 사용 가능하며 확장함수로는 사용이 불가하다.
반환값은 람다의 결과값이다.
수신객체는 non-nullable이고, 결과가 필요하지 않은 경우에 유용하다.

    val person = Person()

    // Person의 객체 함수나 변수들을 this를 통해 호출 가능
    // work(), sleep(), println(age)를 한번에 실행
    with(person){
        work()
        sleep()
        println(age)
    }

run

객체 구성(초기화)과 결과 계산이 한번에 있을 때 유용하다.
확장함수로 사용이 가능하다.

    val result = service.run {
        port = 8080
        query()
    }

🔹 Data Class

데이터를 저장할 목적으로 만든 클래스
copy, toString, hashCode, equle 등의 함수가 자동으로 생성된다.


🔹 Lamda expression

코틀린(함수형 언어에 조금 더 가까움)에서 람다식을 쉽게 이용할 수 있도록 제공해준다.
람다식은 쉽게 말해서 함수에 함수를 전달하고 전달된 함수에서 함수를 실행시키는 역할.

    button.setOnClickListener { v ->
   
    }

🔹 lateinit, lazy init

NullSafe한 코드를 사용하기 위해서 non-null Type으로 변수를 선언함

◼ lateinit

늦은 초기화
해당 변수를 바로 사용하지 않는 경우에 사용
var(mutable)변수에만 사용 가능

  // 미리 초기값을 넣어주지 못하는 상황에 선언
  private lateinit var menu: String

  // 추후 초기화 하는 코드
  // 단, 초기화를 해주지 않은 상태로 사용하면 오류 발생
  menu = "home"

◼ lazy init

변수는 미리 선언해놓고 사용할 때 할당
선언과 동시에 초기화를 해야하며 val만 사용 가능
호출 시점에서 최초 1회 초기화

    // 사용하기 전까지는 lazyNumber라는 변수에 100이 할당되지 않음
    val lazyNumber:Int by lazy { 
        100
    }

    //사용할 때 100이 할당됨
    lazyNumber.add()

🔹 인텐트(intent)

4대 컴포넌트(Activity, BroadCastReceiver, Service, ContentProvider)끼리 유기적으로 정보전달을 가능하게 해준다.

명시적 인텐트

인텐트에서 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우에 사용한다. (특정 컴포넌트나 액티비티가 명확하게 실행되어야할 경우 등)

val intent = Intent(this, SubActivity::class.java)
startActivity(intent)

암시적 인텐트

인텐트의 액션과 데이터를 지정하긴 했지만, 호출할 대상이 달라질 수 있는 경우에 사용한다. 설치된 애플리케이션들에 대한 정보를 알고 있는 안드로이드 시스템이 인텐트를 이용해 요청한 정보를 처리할 수 있는 적절한 콤포넌트를 찾아본 다음 사용자에게 그 대상과 처리 결과를 보여주는 과정을 거치게 된다. 암시적 인텐트는 클래스명이나 패키지명을 넣어주지 않는다. 아래 코드를 실행하면 안드로이드 시스템에서 네이버를 어떤 앱에서 실행할지 물어보는 위젯을 띄워준다.

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("https://www.naver.com/"))
startActivity(intent)


🔹 Collection

  • List
    데이터가 저장되거나 삭제가 될 때 순서를 지키는 타입
    index를 통해 접근

  • Set
    동일한(중복된) 데이터가 존재할 수 없는 집합

  • Map
    key : value 형식의 타입 (단, key는 중복이 될 수 없음)

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글