Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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 31
Tags
more
Archives
Today
Total
관리 메뉴

Olive Study Room

[Kotlin] 기본 문법 & 필요 지식 본문

Coding/Android

[Kotlin] 기본 문법 & 필요 지식

Olive Dev 2021. 7. 7. 01:02

  • Jet Brains 회사에서 만든 IJ(통합개발환경 툴)를 기반으로 만든 게 Android Studio
  • kotlin은 자바를 보완하기 위한 언어
  • 2017년에 공식 언어로 지정. -> 구글이 kolin으로 하는 안드로이드 개발에 지원하겠다!
  • 현 최신 버전은 4.1.2

 

 

Kotlin은 거의 Swift와 비슷하지만 다른 부분들도 있다.

주로 다른 부분을 비교해서 정리했다.

 

 [ 함수 선언  ]

   Swift Kotlin
함수 표현 func fun
반환 -> :
변수 표현 var var
타입 선언 타입추론 가능 타입추론 가능
String 초기화하지 않아도 됨 초기화 필요
다른 타입과 + 연산 가능(string으로 반환)
null null을 가질 수 없는 타입도 있음 null을 가질 수 없는 타입도 있음
상수 표현 let val
타입 정수 Long 없음 Long / 8Byte (ex. 123L)
Short 없음 Short / 2Byte
실수 Float / 4 Byte (ex. 3.14) Float / 4 Byte (ex. 3.14f)
반복문 for for i in 1...5 {} for (i in 1..5) {}
x until(미만)
조건문 switch - case when

* 8비트 = 1바이트

* bold 처리된 부분이 다른 점

 

[ Null Safe? ]

  • swift optional과 의미와 표현이 같음
  • optional이 아닌 변수는 null safe하다고 말함
  • ?, 즉 Null Safe일 때 해당 값이 null인 경우 수행되지 않음.

 

[ 구문식, 표현식 차이 ]

// 구문식
fun sum(a: Int, b: Int): Int {
	return a + b
}
// 표현식
fun sum(a: Int, b: Int) = a + b
fun max(a: Int, b: Int) = if(a > b) a else b

 

[ Scope function(범위 지정 함수) ]

  • 코틀린 표준 라이브러리는 간결한 코드를 가능하게 하는 확장 함수를 제공하는데, 확장함수는 람다를 인자로 받는다.
  • 람다식이 제공된 객체에서 범위 지정 함수를 호출하면 임시 범위가 형성되고, 이 범위에서 이름 없이 객체에 접근할 수 있다.
  • 람다식을 호출하는 방식으로 사용한다.
  • 코드를 읽게 쉽도록 한다.

-> 자바에는 없는 함수.

 

1. apply

객체를 초기화할 때 사용된다. (반환 값이 본인 자체이기 때문!)

// Kotlin. 범위 지정 함수 apply를 사용한 경우
val person = Person().apply {
	firstName = "Kim"
    lastName = "Peng"
}
// JAVA
Person.person = new Person();
person.firstName = "Kim";
person.lastName = "Peng";

 

2. with

객체를 받아 객체 속성을 이용한다. 

val person = Person("Kim", 23)
with(person) {
	print(name)
}

3. let

코드블럭의 수행결과가 반환된다.

null safe하기 위해 사용된다.

// Kotlin. 범위 지정 함수 Let사용
// orEmpty()는 number가 null일 때 sumN이 null이 되는 것을 막고 빈 값을 넣어준다.
val number: Int?
val sumN = number?.let {
	"$(sum(10, it))"
}.orEmpty()
// Java
Integer number = null;
String sumN = null;
if (number != null) {
	sumN = "" + sum(10, number);
}

4. also

객체가 파라미터로 전달된다. 

// Kotlin. 범위 지정 함수 also 사용
// $it으로 사용 가능. value 생략 가능. 생략한 경우 $it 사용
Random.nextInt(100).also { value -> 
	print("peng's number is $value")
}
// Java
int value = Random().nextInt(100);
System.out.print(value);

5. run

초기화와 함께 값을 계산하거나 초기화한다.

with와 비슷하지만 run은 확장 함수로 사용할 수 있다.

val person = Person()
val result = person.run {
	speed = 100
}

- 람다식이란?

  • 익명 함수를 지칭하는 용어.
  • 람다 대수에 기초를 두고 있다.
  • 람다 대수는 수학에서 사용하는 함수를 단순하게 표현하는 방법
  • 고차함수에 인자로 전달되거나 고차 함수가 돌려주는 결과 값으로 쓰인다.

 

- 익명 함수

  • 리터럴 방식으로 만들어진 이름이 없는 함수.
  • 일급 객체라는 특징을 갖는다.
  • Swift에서는 클로저(Closure)라고도 부른다.
  • 재사용을 하지 않을 경우 사용한다.
// 일반적인 함수
func printTest(input: String) -> () {
	print(input)
}

// 익명 함수
{
	(input: String) -> () in
    print(input)
}

 

* 리터럴 방식

일반적으로 데이터를 만드는 방식.

var num: Int = 0

함수를 변수에 담으면 함수 리터럴 방식!

 

- 순수 함수

  • 동일한 인자가 주어질 때 항상 같은 값을 반환하는 함수. -> side-effect(부수 효과)가 없다고 말한다.
  • Thread에 안전하고 병렬적인 계산이 가능하다.
  • 코드 전체를 이해할 필요가 없다.
func sum(a: Int, b: Int) -> Int {
	return a+b
}

 

- 순수 함수가 아닌 경우

1. 변수가 포함된 경우

var c: Int = 10
func sum(a: Int, b: Int, c: Int) -> Int {
	c = b
	return a+b+c
}

 

2. 외부 상태에 영향을 미칠 경우

 

1과 같이 외부 변수를 변화시키거나 객체를 인자로 받아 객체의 상태가 달라지는 경우 이에 해당한다.

 

[ Data Class ]

  • getter setter 없이 클래스를 선언할 수 있다.

-> 프로퍼티에 직접 접근. but 내부적으로 없는 건 아님. java에서 코트린을 사용하는 경우도 있기때문..

  • model 클래스를 생성할 때 사용한다.

 

[ lateinit ]

  • non-null한 타입일 때만 사용. 
  • 로컬에서는 불가능(전역으로 선언해야함)
  • null-safe한 타입으로 선언하면 무조건 초기화를 해줘야함. but 초기값을 입력하지 못할 상황에 lateinit 사용.
Comments