조각들

 

비교연산자

비교연산자도 연산자 표현과 메서드 처리 두 가지 방식을 제공한다.

비교연산자를 메서드로 사용할 때는 compareTo 메서드가 실행되며 이 메서드의 결과는 기본으로 0, 음수, 양수로 나뉜다.

 

결괏값 설명
0 두 항이 동일한 경우
negative integer 첫 번째 항이 작은 경우
positive integer 첫 번째 항이 큰 경우
val a = 100
val b = 20

println(a.compareTo(b) >= 0 ) // 두 수의 크기 비교

// true

 

포함연산자

특정 범위에 속한 값에 포함 여부를 확인할 때는 이 연산자를 사용한다.

연산자 표현식 상응하는 메서드
in a in b b.contains(a)
!in a !in b  !b.contains(a)
var height = 46
println(height in 1..53)

//true

 

any, all, none 처리

여러 원소를 가진 배열이나 리스트 등에 특정 원소의 값이 있는지 확인해서 논리값으로 처리하는 메서드이다.

  • 모든 것이 참인 경우는 all 메서드 사용
  • 모든 것이 거짓인 경우는 none 메서드 사용
  • 하나라도 참인 경우는 any 메서드 사용
val list = listOf(1,2,null)

println(list.any({ it = null})) // 리스트 내부에 null이 하나라도 있으면 참
println(list.all({ it == null})) // 리스트 내부에 모든 게 null이면 참
println(list.none({ it == null})) // 리스트 내부에 모든 게 null이 아니면 참

/*
true
false
false
*/

 

논리연산자

괄호를 사용하지 않으면 좌에서 우측으로 연산자 우선 순위에 따라 먼저 처리한다.

var late = true
var skipBreakfast = true
var underslept = false
var checkEmails = false

println(late || checkEmails && late)
println(checkEmails || underslept || late)

//true
//true

연산자 우선순위 (출처 - https://kotlinlang.org/docs/reference/grammar.html#precedence)

 

동등성

값이나 객체 참조를 비교하는 방법

값만 비교 값과 함께 타입도 비교
==, equals ===
  • 구조적 동등성 : ==로 비교
  • 참조적 동등성 : ===로 비교

* null에는 메서드가 없어서 null이 들어와 메서드를 호출하면 NPE가 발생한다. 

 

 

엘비스 연산자(?:)

앞의 표현식 결과가 null이 아니면 그 값을 반환하고, null인 경우에는 Elvis 연산자 우측에 있는 값을 반환한다.

 

 

세이프 콜 연산자(?.)

null인지 여부를 확인하고, null이 아닌 경우에만 해당 객체의 속성이나 메서드에 접근 가능하게 한다.

 

 

함수 참조

함수 정의 후에 메모리에 로딩된 함수의 주소를 가져오는 리플렉션 기능이다.

* 리플렉션 기능 : 실행 중인 프로그램의 구조, 타입, 속성, 메서드 등에 대한 정보를 가져오거나 조작하는 기능

 

hashCode : 레퍼런스를 정수로 변환해주는 메서드이다.

 

 

if문

  • 표현식 처리에는 반드시 if else를 사용한다.
  • 표현식으로 처리할 때는 할당이나 반환이 필요하며 코드 블록으로 처리할 경우에는 반드시 마지막에 반환값을 표시해야 한다.
  • 블록 구문 내의 지역변수 개념이 존재한다. 따라서  if문 중첩이면 바깥 if문에서 작성한 변수는 inner if문에서도 사용 가능하지만 역은 성립하지 않는다.

 

 

when문

  • when도 표현식으로 처리가 가능하므로 변수에 할당할 수 있다.
  • when 괄호 안에 local 변수를 선언해서 사용할 수 있고 외부에서는 참조할 수 없다.

 

 

try-catch, throw를 통한 예외 처리 (+ finally)

throw를 통해 명시적으로 발생시킨 예외는 try-catch문의 catch (e: Exception) 블록에서 잡힌다. 이로 인해 프로그램은 예외가 발생해도 비정상적으로 종료되지 않고, 오류 메시지와 함께 실행이 계속된다. 만약 어떤 catch 블록에서도 처리되지 않으면, 프로그램은 비정상적으로 종료된다.

 

finally는 선택적으로 사용할 수 있으며 예외 발생 여부에 관계없이 필수적으로 처리할 부분이다.

 

 

Nothing, Unit 

"Nothing"은 함수가 정상적으로 값을 반환하지 않고, 예외를 던질 때 사용되는 자료형이다. 반면에 "Unit"은 함수가 작업을 수행하지만 값을 반환하지 않을 때 사용되며, Kotlin에서는 반환 타입을 명시하지 않은 함수를 자동으로 "Unit"으로 간주한다.

 

 

범위/진행 연산자와 메서드

범위연산자(..): 두 수, 두 문자, 두 문자열 사이에 지정해서 두 항목을 포함한 범위 객체 생성한다.

rangeTo: 범위연산자와 동일한 메서드이다.

until: 범위연산자와 동일한 메서드이다. 차이점은 마지막 항목이 포함되지 않는다.

downTo: 역방향 범위를 만들 때 사용한다.

step: 범위의 간격을 처리하는 메서드이며 실행하면 범위 객체를 진행 객체로 변환한다.

first, last, step: 범위와 진행 내의 첫 번째, 마지막, 간격 정보를 관리하는 속성이다.

 

* step 메서드를 사용할 경우에는 마지막 값이 step을 처리하는 값으로 변경된다.

 

 

for 순환

  • 범위의 시작과 끝이 같으면 한 번만 실행되므로 주의해서 범위를 지정해야 한다.
  • 문자도 실제 아스키코드나 유니코드에 순서대로 저장되어 있어서 문자 범위를 만들 수 있다.

 

 

break (+@ 레이블명)

가장 가까운 순환을 종료한다. 가령 for문 중첩인데 inner for문에 break가 걸리면 바깥에 있는 for문은 계속 돈다.

 

중첩 for문의 경우 전체 순환을 종료하려면 레이블을 사용해서 외부 순환문까지 빠져나올 수 있도록 처리한다. 이때 순환문 앞에 레이블명+@를 붙이고 break+@ 레이블명을 지정한다.

 

 

반복자

여러 개의 원소를 가진 자료형인 범위, 배열, 리스트 등은 반복형(Iterable) 클래스이며 이를 객체로 만들어도 반복형 객체이다. 이 반복형을 iterator 메서드로 반복자(Iterator) 클래스의 객체로 변환할 수 있다. 반복형과 반복자의 차이점은 반복형을 반복자로 자료형을 변환하면 내부의 원소를 순환할 수 있는 메서드가 추가된다.

 

 

반복형을 반복자로 변환

  • 반복형 내의 iterator 메서드를 실행하면 반복자(Iterator) 클래스의 객체로 변환된다.
  • 반복자는 현재 상태를 조회하는 hasNext 메서드, 다음 원소를 조회하는 next 메서드가 추가된다.
  • 반복자의 순환은 hasNext 메서드로 상태를 확인하고 next 메서드로 원소를 조회하면서 처리한다.
  • 반복자의 특징은 한 번 모든 원소를 조회하면 다시 객체를 생성해서 사용한다.

 

 

내부 순환과 외부 순환

외부 순환for, while, do while 문을 사용해 반복자의 원소를 조회해서 반복 처리하는 방식이다.

내부 순환은 반복자 내부의 메서드를 사용해 반복 처리하는 방식이다. 보통 내부 순환을 하는 map, filter, reduce, forEach 등의 메서드를 제공한다.

 

 

 

'Kotlin > 스터디' 카테고리의 다른 글

코틀린 스터티 - 8장  (0) 2023.09.03
코틀린 스터디 - 6장  (0) 2023.08.20
코틀린 스터디 - 5장  (0) 2023.08.13
코틀린 스터디 - 4장  (0) 2023.08.06
코틀린 스터디 - 2장  (0) 2023.07.23