카테고리 없음

코틀린 기본개념

728x90
반응형

자바

  • JVM 이란?
    • JAVA Compiler 이 java코드를 byte Code로 변환 -> Class Loader System 을 통해 Class파일들을 JVM으로 로딩
    • 로딩된 Class 파일들은 Execution Engine을 통해 해석됨 -> 해석된 프로그램은 Runtime Data Areas에 배치되어 실질적인 수행이 이루어짐
    • 실행과정속에서 JVM은 필요에 따라 Thread Synchronization 과 Garbage Collection 같은 관리 작업을 수행하게 됨
  • 원시(기본형)타입과 참조형변수
  • gc는 어떻게 동작하는지
  • GC(Garbage collectior)를 직접 개발한다면 어떻게 구현하겠어요?
  • 메모리 구조(낮은주소->높은주소) 코드영역, 데이터영역, 힙영역, 스택영역
  • Byte를 사용하면 메모리에 남기지 않을 수 있는데, String 객체는 왜 메모리에 남을까요?
  • Java에서 Collection의 종류는 무엇이 있나요?
  • Set과 List 에서 검색 시 BigO는 어떻게 될까요?

코틀린

  • 코틀린의 장점 은?
      1. 구글이 안드로이드 개발을 위한 공식언어로 코틀린을 지정
    • Java와 100% 상호 호환 및 JVM에서 동작
    • 자료형 오류를 미리 잡을 수 있는 정적 언어(컴파일될 때 자료형을 검사하여 확정)
    • 널 포인터 예외(NPE: NullPointerException)로 인한 프로그램 중단을 예방할 수 있음
      • Nullable, Non-nullable 타입을 따로 지정
    • 함수형프로그래밍과 객체지향 프로그래밍 모두 가능
      • 함수형프로그래밍 장점
        • 함수를 다른 함수의 매개변수로 사용할 수 있다. 함수가 객체처럼 사용해서 메모리 오버헤드가 발생할 수 있는데 인라인 함수를 사용하여 개선이 가능
        • 위임 속성을 가진다. 대표적으로 lazy. 이 객체에 접근하기 전까지 객체를 생성하지 않고 대기한다. DB 인스턴스를 만들때와 같이 시간이 많이 걸리는 큰 사이즈의 객체를 이용하여 작업할 때 유용
        • 인터페이스 내 메소드 구현이 가능
    • 코루틴 사용 가능
    • 간결하고 효율적임
      • ; 없음, 표준(scope)함수,
  • **Null 처리 ?**
    • 원칙 : 코틀린은 변수를 사용할 때 반드시 값이 할당되어야 함 (null 할당 불가)
      • ? 널 허용 변수
      • ?. 세이프콜
      • !! non-null 단정기호
      • ?: 세이프콜 + 엘0비스 연산자
  • 지연 초기화 ?
    • lateinit
      • var(mutable) 에서만 사용이 가능 (언제든 초기화를 변경가능)
      • null을 통한 초기화를 할 수 없음
      • 초기화를 하기 전에는 변수에 접근 불가(접근 시 lateinit property subject has not been initialized 에러를 만나게됨)
      • 변수에 대한 setter/getter properties 정의가 불가능
      • lateinit은 모든 변수가 가능한 건 아니고, primitive type에서는 활용이 불가능
      • ::을 통해서만 접근이 가능한 .isInitialized을 사용하여 체크할 수 있음
    • by lazy
      • val (immutable) 에서만 사용이 가능(값 교체 불가)
      • 호출 시점에 by lazy 정의에 의해서 초기화를 진행
      • lazy 를 사용하는 경우 기본 Synchronized로 동작(인스턴스당 한 개의 Thread만이 접근가능)
      • 호출 시점 한번 초기화를 진행하고, 그 이후에는 가져다가 쓰기만 한다.
  • 위임 ?
    • 위임(Delegation) 이란 특정일을 대신해주는 중간자 역할을 말함
    • 특정 클래스를 확장하거나 이용할 수 있도록 by를 통해 위임이 가능
    • 클래스 위임
      • 위임된 클래스가 가지는 멤버를 참조 없이 호출할 수 있도록 함
    • 프로퍼티 위임
      • 프로퍼티의 게터와 세터를 특정 객체에게 위힘하고 그 객체가 값을 읽거나 쓸 수 이도록 함
      val localService: LocalService by lazy{
      		kakaoApiRetrofit.create(LocalService::class.java)
      }
      
  • **코루틴** ?
    • 하나의 진입점과 하나의 탈출점이 있는 서브루틴과 다르게, 다양한 진입점과 다양한 탈출점이 있는 루틴
    • 동시성(Concurrency)을 제공하지만, 병렬성(Parallelism)을 제공하지 않음
    • 멀티 태스킹이지만, 멀티 스레딩(메인 스레드 이외의 백그라운드 스레드에서 작업하는 것) 아님
    • 싱글코어에서 코루틴은 이동시점이 더 잘 조절되고 context switching 이 적어 성능면에서 멀티 스레드보다 좋을 수 잇지만, 멀티 코어프로세서를 활용할 수 없음
  • 코루틴 Context /코루틴 Scope
    • 코루틴 Context
      • 코루틴은 항상 Context(컨텍스트-문맥) 안에서 실행됩니다.
      • Context(문맥)는 코루틴이 어떻게 실행되고 동작해야 하는지를 정의할 수 있게 해주는 요소들의 그룹입니다.
      • Context는 또한 결합이 될 수 있고, 분리하여 제거할 수도 있습니다.
    • 코루틴의 scope
      • 코루틴의 scope는 코루틴이 실행되는 Context를 정의합니다.scope는 코루틴의 jop과 dispatchers에 대한 정보를 결합합니다.scope는 코루틴을 추적하는데, 코루틴을 시작하면 "scope에 포함"됩니다.
      • 이는 코루틴을 추적할 scope를 지정했음을 의미합니다.
  • Architecture components와 코루틴 Scope
    • CoroutineScope는 모든 Coroutine을 추적하고 Coroutine이 실행되어야 하는시기를 관리하는 데 도움이됩니다. 또한 그 안에서 시작된 모든 Coroutine을 취소 할 수 있습니다. 각 비동기 작업 또는 Coroutine은 특정 CoroutineScope 내에서 실행됩니다.
    • Architecture components는 앱의 논리적 범위에 대한 Coroutine에 대한 최고 수준의 지원을 제공합니다.
    • Architecture components는 앱에서 사용할 수 있는 다음과 같은 기본 제공 범위를 정의합니다.
      1. ViewModelScope , 2) LifecycleScope, 3) LiveData
  • viewModelScope란?
    • ViewModle의 life cycle에 의하여 coroutine도 생성하고, 소멸
  • viewModelScope을 만들때 dispatcher로는 Dispather.Main
  • 지연함수
    • 코루틴 (블록 내부)에서 사용되는 함수는 suspend( ) 로 선언된 지연함수 여야 코루틴 기능을 사용할 수 있다.
    • 함수 앞에 suspend를 표기함으로서 이 함수는 실행이 일시중단(suspended)될 수 있으며, 필요한곳에서 다시 재개(resume)할 수 있게 된다.
    • delay( ) 함수나 yield( ) 함수와 같이 상위 레벨 지연함수도 있고, 사용자 함수에 suspend 붙여 직접 지연함수를 선언하여 코루틴에서 사용할 수 도 이따.
    • 컴파일러는 suspend 가 붙은 함수를 자동적으로 추출해 continuation 클래스로부터 분리된 루틴을 만든다.
    • 지연함수는 코루틴 빌더인 launch와 async에서 사용할 수 있지만 메인 스레드에서는 사용할 수 없다.
    • 지연함수는 또 다른 지연함수 내에서 사용하거나 코루틴 블록에서만 사용해야 한다
  • 코루틴과 스레드의 차이점
    • 스레드는 비동기로 여러 스레드를 한번에 동시에 처리하는 반면, 코루틴은 한번에 하나의 코드만 실행됨(코루틴은 프로그램실행중에 코루틴으로 이동하고 그전에 실행중이던 루틴은 정지)
    • 스레드는 코드를 빠져나올수 있는 부분은 가장 마지막 한부분이지만, 코루틴은 중간에 빠저나왔다 다시 들어갔다 할 수 있음
    • 싱글코어에서 코루틴은 이동시점이 더 잘 조절되고 context switching 이 적어 성능면에서 멀티 스레드보다 좋을 수 잇지만, 멀티 코어프로세서를 활용할 수 없음
  • 표준(Scope)함수 ?
    • 람다식을 이용해서 호출하면 일시적인 Scope(범위)가 생기게 되고, 이 범위 안에서는 전달된 객체에 대해 "it" 또는 "this" 라는 Context Object를 통해서 접근
    • Context Object를 참조하는 방법 (this, it)과 Return value(Context Object, 람다식)에 따라 다음과 같은 종류로 나뉨
      • apply : 생성과 동시에 초기화 하고 자기자신을 return
      • also : 자기 자신이 필요한데, 초기화를 좀 더 쉽게(수신 객체를 사용하지 않거나, 수신객체의 속성을 변경하지 않고 사용할 때)
      • with : (생성과 동시에 초기화, null이 될수없는) 결과가 필요하지 않을 경우
      • run : 객체의 값의 접근을 쉽게할 때
      • let : 객체의 값이 명확해야 할 때
  • **확장함수**?
    • 코틀린는 기존 클래스에 메소드를 추가할 수 있는데 이를 확장 함수라고 함
    • 확장 함수는 static 메소드
    • 자바의 String 클래스에 lastChar() 라는 메소드를 추가해서 "zerog".lastChar() 처럼 기존 클래스의 메소드인것처럼 사용할 수 있음
  • 컬렉션 ?
  • Java의 필드와 Kotlin의 프로퍼티 차이?
    • 다양한 개체가 필드에 직접 점근하면 데이터 무셜성이 깨질수 있기때문에 게터 세터 를 만들었는데 코드가 너무 길고 복잡하다는 단점이 있어, 코틀린에서는 자동으로 게터 세터 만들어짐
    • val로 선언하면 게터만 있고, var로 선언하면 세터 게터 모두 있음
  • 참조형 변수만 사용하는 이유는 ?
    • 참조형으로 선언한 변수는 성능 최적화를 위해 코틀린 컴파일러에서 다시 기본형을 대체되기때문에 참조형을 기본형으로 고려하는 등의 최적화를 신경쓰지 않아도 된다.
  • 컴패니언 객체(companion Object)
    • java에서 정적변수 선언시 사용하는 static 키워드 대신 컴페니언 객체를 사용
    • 동적 초기화 없이 프로그램 실행하는 동안 고정적으로 가지는 메모리로 객체 생성없이 사용가능
    • 동적 메모리인 힙에 객체 생성 x 정적 메모리인 메소드영역에 생성됨
    • 컴페니언 객체는 실제 객체의 싱글톤으로 정의됨
  • 익명클래스, 익명객체
    • 익명 클래스란 '이름이 없는 클래스'를 가르킨다.
    • 클래스의 선언과 객체의 생성을 동시에 진행 -> 한번만 사용될 수 있고, 하나의 객체만을 만듬
  • var과 const의 차이점
  • 코틀린에서 final 키워드가 없는 이유
    • 코틀린의 객체는 기본적으로 final (== 닫혀있다)
    • 이로서 스마트 캐스트(프로그래머가 굳이 원하는 타입으로 캐스팅 하지 않더라도, 컴파일러가 알아서 캐스팅해주는 것)가 가능
    • 프로퍼티가 final이 아니라면 그 프로퍼티를 다른 클래스가 상속하면서 커스텀 접근자를 정의함으로써 스마트 캐스트의 요구 사항을 깰 수 있다.
  • 코틀린 Annotation
  • 함수형 프로그래밍이란?
  • 람다란?
  • 객체지향 프로그래밍이란?
728x90
반응형