Kotlin

Kotlin 면접준비(1)

취업하고싶다! 2023. 6. 4. 15:41

1. 코틀린의 타겟 플랫폼은? Kotlin-Java 간 상호 운용성은 어떻게 가능한가?

JVM(Java Virtual Machine)이 Kotlin의 타겟 플랫폼이다.

Kotlin은 컴파일 시 바이트 코드를 생성하므로, Java와 100% 상호 운용 가능하다.

따라서 Java에서 Kotlin 코드를 호출할 수 있으며 그 반대의 경우도 마찬가지이다.

 

 

2. 코틀린의 변수 선언 방법은? Java와 차이점은?

// Java
String s = "Java String";
int x = 10;
// Kotlin
val s: String = "Kotlin String"
var x = 10

Kotlin에서 선언은 val, var로 시작하고 그 뒤에 타입이 온다.

Kotlin은 타입추론을 사용해 타입을 자동으로 감지할 수 있다.

 

 

3. val과 var의 차이는? String을 Int로 변환하는 방법은?

val은 변경불가. Java의 final modifier와 같다.

var은 재할당 가능. 재할당된 값은 동일한 type이어야 함.

fun main(args:Array<String>){
	var x = 5
	x = "6".toInt()
}

toInt() 함수를 사용해 String을 Int로 변환 가능.

 

 

4. Null Safety와 Nullable Type이란? Elvis 연산자란?

Kotlin은 Null Pointer Exception(NPE)를 방지하기 위해 String?, Int?, Float? 와 같은 nullable 타입들을 사용함.

이러한 타입들은 null값을 가질 수 있음.

 

Elvis 연산자는 이런 nullable 타입들을 안전하게 값을 이용할 수 있도록 사용.

nullable 타입 뒤에 ?: 표시하며 nullable 타입의 값이 null일 경우 오른쪽 값을 사용함.

var str: String? = "JournalDev.com"
var newStr = str?:"Default Value"	// JournalDev.com

str = null
newStr = str?:"Default Value"		// Default Value

 

 

5. const란 무엇인가? val과 다른점은?

'상수'란 한 번 초기화하면 내부의 값을 사용할 수 있지만, 바꿀 수는 없는 것. val이 이에 속함.

const val과 val의 차이는 불변성에 있음.

 

val은 값이 'runtime'시에 결정되는 상수. 이는 독립적인 동일한 프로그램 수행 중에 프로그램 수행에 따라 값이 바뀔 수 있음을 의미함.

예로, 두 숫자를 더한 값을 반환하는 상수를 사용해 val 상수의 값을 정한다고 했을 때, 이 값은 함수의 파라미터로 들어가는 숫자에 따라 언제든지 달라질 수 있음. 때문에 val을 사용한 상수는 '불완전한 불변성'을 가지고 있음.

fun main() {
	val num = sumExam(40, 20)
    println(num)
}

fun sunExam(a: Int, b: Int) = a + b

위의 경우 sumExam의 함수의 파라미터로 들어오는 수에 따라 결과값은 언제든지 바뀜.

 

const val은 값이 'compile'시에 결정되는 상수. val과는 다른 불변성을 가짐. 또한 클래스의 생성자에 할당될 수 없고 String을 포함한 기본 자료형으로만 선언이 가능. 런타임 시 생성되는 다른 클래스의 객체는 const val로 선언할 수 없음.

이런 const val은 함수 내의 지역변수나 클래스의 속성으로 사용 불가.

때문에 const val을 함수나 클래스 내에서 사용하려면 companion object 안의 중괄호에 선언해줘야 함.

 

이렇게 선언된 const val은 함수나 클래스의 상태에 관계없이 언제나 동일한 값을 가짐. 때문에 특정한 고정된 값을 사용하고 싶을 땐 const val을 사용하면 됨(Java의 static final같은 개념). const val의 이름을 결정할 때는 일반적인 변수와 달리 '대문자'와 '_'를 이용해 결정함.

fun main() {
	println(ExamClass.CONST_VAL)
}

class ExamClass() {
	companion object{
    	const val CONST_VAL = 100
    }
}

const val의 경우 컴파일 시에 데이터가 메모리에 존재하기 때문에 사용 시 객체를 생성해서 이에 접근하는 것이 아니고 클래스명, 상수명의 형태를 사용해 직접 접근함.

const val 상수는 클래스 내에서 상수 사용은 클래스의 객체를 생성한 뒤 사용해야 하는 클래스 속성의 소요시간을 줄임으로써 성능을 향상할 수 있음.

 

 

6. !!와 ?의 차이점은? nullable 값을 안전하게 이용할 수 있는 다른 방법은?

'!!'은 nullable 타입의 값을 강제로 가져오기 위해 쓰임. 만약 값이 null이면 런타임 crash 발생.

따라서 값이 null이 아니라고 확신할 때만 사용해야 함.

 

'?' 안전하게 nullable 타입의 값을 가져올 수 있는 Elvis 연산자. let을 사용해 안전하게 nullable 타입의 값을 가져올 수 있음.

fun main(args:Array<String>){
	var str: String? = "JournalDev.com"
    str?.let{println(str)}		// JournalDev.com
    
    str = null
    str?.let{println(str)}		// DO NOTHING
}

 

 

7. == 와 === 의 차이점은?

== : value 비교

=== : reference 비교

 

 

8. 아래 상속 구조는 컴파일이 되는가?

class A {

}

class B: A() {

}

안된다. open을 붙여야 함. 코틀린에서 클래스 상속을 정의할 때, 기본적으로 부모 클래스는 open 키워드로 선언되어야 함.

open Class A {

}

class B: A() {

}

 

 

9.  Kotlin에서 Init Block이란?

class MyClass {
    init {
        // 초기화 작업 수행
    }
}

init은 코틀린의 초기화 블록이다. init 블록은 클래스 내부에 생성됨.

init 블록의 용도

  • property 초기화: init 블록 내에서 property 초기화할 수 있음. 예로, property에 기본값을 설정하거나 다른 값에 의존하는 초기화 작업 수행 가능
  • 초기화 로직 실행: 클래스 인스턴스가 생성될 때 실행되는 초기화 로직을 구현할 수 있음. 예로, 파일 열거나 외부 리소스에 연결, 다른 객체를 초기화하는 등의 작업 수행 가능

 

 

10. 생성자 내부 argument들의 타입은?

var로 지정하지 않는 한, 기본적으로 val이다.

 

 

11. Kotlin에서 switch 표현문에 해당되는 것은? Java와의 차이점은?

when: kotlin의 switch에 해당. when의 기본 상태는 else를 사용해 표현.

when(num) {
    0..4 -> print("value is 0")
    5 -> print("value is 5")
    else -> {
    	print("value is in neither of the above")
    }
}

 

 

12. data 클래스란? 장점은? 어떻게 정의하나?

data class란 data를 저장하는 클래스.

Java에서는 data를 저장하는 class를 생성하기 위해 변수마다 getter/setter를 설정하고 toString(), hash(), copy() 함수를 직접 override 해야 한다.

kotlin에서는 data라는 keyword를 class 앞에 추가만하면 자동으로 위와 같은 것들을 생성해준다.

data class Book(var name: String, var authorName: String)

fun main(args:Array<string>){
    val book = Book("Kotlin Tutorials", "Anupam")
}

 

 

13. destructuring declarations 란?

Destructuring Declaration 은 objects/arrays에 저장된 여러 값들을 변수에 대입하는 현명한 방법.

data class Book(var name: String, var authorName: String)

fun main(args:Array<string>){
    val book = Book("Kotlin Tutorials", "Anupam")
    var (n,a) = book
    println(n)		// Kotlin Tutorials
    println(a)		// Anupam
}

 

 

14. inline과 infix 함수의 차이점은?

inline functions: 호출된 익명 함수/람다식에 대한 객체 할당을 방지해 메모리 오버헤드를 줄이는데 사용. 대신 런타임에 호출하는 함수에 해당 함수 body를 제공. 이로인해 바이트코드의 크기는 약간 증가하지만 메모리를 많이 절약함.

fun main(args:Array<String>) {
    inlineFunctionExample(
    {println("Inline Functions"),
    {println("Instead of object creation it copies the code.")}
    )
}

inline fun inlineFunctionExample(myFunction:()->Unit, another:()->Unit) {
    myFunction()		// Inline Functions
    another()			// Instead of object creation it copies the code.
}

 

infix functions: 두 개의 변수 가운데 오는 함수를 말함. 이로인해 코드가 더 간결해짐(하나의 매개변수만 쓸 수 있음)

fun main(args:Array<String>) {
    val b= Numbers()
    b addNumber 5
    
    println(b)		// 15
}

class Numbers() {
    var x = 10
    
    infix fun addNumber(num: Int) {
        this.x = this.x + num
    }
}

 

 

15. lazy와 lateinit의 차이점은?

둘 다 property 초기화를 지연하는 데 이용. 

lateinit: var에 쓰임. 나중에 var 값을 설정.

lazy: val에 쓰임. 필요할 때 런타임에 생성됨.

val x: Int by lazy {10}
lateinit var y: String

 

 

16. 싱글톤 클래스란? 생성방법은?

싱글톤 클래스: 애플리케이션 내에서 단 하나의 인스턴스만을 생성할 수 있는 클래스. 이는 해당 클래스의 인스턴스가 전역적으로 공유되고, 여러 곳에서 동시에 사용될 수 있다는 것을 의미. 별도의 생성자는 없고 init 함수를 통해 초기화할 수 있음.

object MySingleton {
    // 싱글톤 클래스의 멤버 변수 및 메서드들
}

 

이렇게 정의된 싱글톤 클래스는 MySingleton이라는 이름을 가지며, 해당 클래스의 유일한 인스턴스가 바로 MySingleton 객체 자체.

싱글톤 클래스는 여러 곳에서 동시에 사용될 수 있으므로 공유 자원에 접근하는 경우 동시성 관련 문제를 고려해야 함. 코틀린에서는 synchronized 키워드를 사용해 동기화를 구현하거나 스레드 안전성을 보장하는 다른 동기화 메커니즘을 사용할 수 있음.

 

싱글톤 클래스는 전역 상태를 유지하거나 공통된 자원에 접근하는 등의 상황에서 유용하게 사용될 수 있음. 주로 리소스 관리, 로깅, 캐싱, 데이터베이스 연결 등과 같은 기능을 구현하는 데 활용.

 

 

17. static 키워드를 가지고 있는가? 어떻게 static method를 생성할 수 있는가?

kotlin은 static 키워드가 없다. static method를 생성하기 위해서 companion object를 써야 함.

// Java
class A {
    public static int returnMe() {
    return 5;
    }
}

// Kotlin
class A {
    companion object {
    fun a(): Int = 5
    }
}

'Kotlin' 카테고리의 다른 글

Kotlin- Activity와 Fragment  (0) 2023.06.07
Kotlin 면접준비(2)  (2) 2023.06.04
Kotlin- 문법1  (0) 2023.06.02
클린 아키텍처(Clean Architecture)  (0) 2023.06.02
코틀린 컨벤션  (0) 2023.06.01