Kotlin 문법 +a

Shaun·2023년 2월 7일
1

Kotlin

목록 보기
8/10
post-thumbnail

병원도 여러곳 가보듯이 코틀린도 문법을 배우고 나서 뭔가 부족한 느낌이 들어서 다른 강의를 들었다. 확실히 빠진내용에 대한 보충이 많았다.

이전 코틀린문법 정리한 내용에서 핵심내용 + 빠진 부분들을 다시
정리해봤다.

Kotlin만의 특징

  • 코틀린은 모든값을 객체로 관리

  • 본 타입간의 변환은 명시적으로 이루어져야 한다

  • Primitive Type과 Reference Type을 구분하지 않아도 된다

  • Kotlin에서는 패키지를 namespace를 관리하기 위한 용도로만 사용! 가시성 제어에는 사용되지 않는다.

  • Kotlin에서는 싱글톤 만들때 object 만 붙여주면 됀다.

반환타입

  • unit = void

  • nothing = 함수가 정상적으로 끝나지 않았다는 뜻, 무조건 예외반한/무한루프함수 등

생성자

  • 주생성자는 Person(val name, var age) -> 이것만으로 이미 주생성자, 게터 세터 생성됨

  • 생성자를 추가 하고 싶으면 기존 생성자는 그대로 두고 constructor() 로 따로 만들준다. 이거 부생성자라 부른다

  • 부생성자는 최종적으로 주생성자를 this로 호출해야 한다.

  • 하지만 코틀린에서는 부생성자보다는 default parameter를 권장한다
  • Converting 같은 경우에 부생성자를 쓸수 있지만 정적 팩토리 메소드를 추천함

Class test(a1:int,a2:int) --> 매개변수 생성자만 생성
Class test(var a1:int, val a2:int) --> 매개변수 생성자, 게터,세터 ,맴버변수

  • 부생성자 있는클래스에 주생성자 있으면 무조건 주생성자 호출해야함!

  • 만약 생성자 안에 init()메서드가 있으면 생성자부터 실행하고 init()이 실행된다.

  • var/val 은 주 생성자에게만 쓸수 있다.

  • init()은 생성자 호출되는 시점에 호출되 주로 필드 검증시 사용

주생성자

  • 반드시 있어야함
  • 주생성자 파라미터가 하나도 없으면 생략가능

부생성자

  • 있을수도 없을수도 있다.
  • 최종적으로 주생성자를 this로 호출해야함

상속

  • 부모클래스 open으로해줘서 상속 해줘야함

  • 멤버변수, 함수는 기본pirvate, 상속시 open 으로

  • 상속 할떄 부모클래스 생성자 호출해야함

  • 코틀린은 부모의 멤버 변수도 오버라이딩 가능!

DataClass

  • 객체를 사용하는데 약간의 기능이 추가된 클래스

  • 순수하게 특정 매개체 정보 관리를 위해만 사용

  • 반드시 주 생성자 가지고 있어야함

  • abstract,open, sealed, inner 로 클래스 정의 불가

  • Equals 는 주생성자 매개변수들만 비교! -> 그래서 왠만하면 주생성자로 만드는게 유리함

sealed class

  • enum 클래스가 상수를 관리하는 개념이라면 sealedClass 는 객체 를 관리 하는 개념이다

  • 열거형 사용시 상수가 의미하는 값을 수시로 바꿔야하거나 다양한 형태로 사용해야할때 사용한다.

  • 주로 추상화가 필요한 Entity or DTO에 사용

연산자

  • 서는 연산자가 수행되면 그 연산자에 해당하는 메서드를 호출한다.

비교연산자

  • 자바에서는 동일성(주소비교)에서는 == 를 ,동등성(안에 데이터비교)에서는 equals

  • 코틀린에서는 동일성에는 ===를, 동등성에서는 ==

  • 비교 연산자 사용시 자바와 다르게 객체를 비교할때 자동으로 compareTo를 호출해줌

리플렉션

  • 자바보다 좀더 직관적이다.

if-else

  • 코트틀린에서는 if else가 Expression(하나의 값) 이기때문에 삼항 연산자가 필요없다

Statement: 프로그램의 문장, 하나의 값으로 도출되지 않는다
Expression: 하나의 값으로 도출되는 문장

when

  • when(값) => 값이 없어도 사용 가능

Exception

  • 코틀린에서는 checked, unchecked 구분 x , 모두다 unchecked

Named argument

  • 오버로딩시 메서드 사용시 매개변수이름을 직접 통해서 디폴트값 설정 가능
  • builder와 비슷한 역활.

가변배열

  • vararg

  • 배열 넣어주거나(이떄는 배열에 *붙여줘야함 (spread 연산자 = 배열안에 있는것들을 ,를 쓰느것처럼 꺼내준다는 의미)

프로퍼티 검증

  • 이런식으로 게터로 부를떄 검증 가능

인터페이스

  • 인터페이스 val로 필드값 선언 가능
  • 구현하는곳에서 val이니까 get() 로 구현해 사용가능
  • 인터페이스에서 get()으로 디폴트값 만들수도 있다.
  • 상속,인터페이스 구현 => :

상속

  • 상위 클래스의 생성자 ,init에서 하위클래스 final이 아닌 프로퍼티에 접근 하면 안됀다
    -> **상위클래스 생성자,init 에 사용되는 프로퍼티는 open을 피해야함

중첩 클래스

  • 안에는 static 내부클래스가 권장됨 코틀린에서는 그냥 static 쓰지말고 class 만쓰면 자동 처리됌

  • 기본적으로 바깥클래스를 참조하지 않음

배열


  • 이런식으로 index와 value를 같이 출력할수도 있다.

  • array.plus(값) = 자바에서는 copy해주고 값을 넣어줘야 하지만 코틀린 배열은 쉽게 넣기 가능

list

  • 자바처럼 불변이여도 그 안에있는 객체 필드 값은 바꾸기가능
  • 코틀린쪽의 컬렉션이 자바에서 호출되면 컬렉션 내용이 변할수 있음!

인라인 함수

  • 함수를 파라미터로 전달할 떄에 오버헤드를 줄일 수 있다. 함수-> 함수 부르면 call chain에 overhed 생김

  • 하지만 신중하게 사용해야하고 코틀린 라이브러리는 어느정도 최적화가 되있어서 괜찮다.

접근제어

  • protected 주의!

  • private class 를 만들떄는 public + 생성자가 기본이라 생성자를 명시적으로 써줘야함

companion object

  • 코틀린에서는 하나의 객체로 간주 되기 때문에 이름도 붙일수있음, 인터페이스구현도 가능

  • const 를 붙이면 컴파일시에 변수할당 / 아니면 런타임시에 할당

  • Companon object 호출시 이름 지정을 안하면 Person.companion.이름 이런식으로 불러오지만 @jvmstatic을 붙여주면 자바처럼 Persons.이름 으로 호출 가능

중첩클래스

  • 자바에서는 중첩클래스 사용시 static을 붙여줘야 하지만 코틀린에서는 붙이는것 없이 그냥 class로 사용하면 됀다.

익명클래스

  • object 키워드로 사용 가능

Type Alias


  • 메서드 추출방식처럼 별칭을 줄수있다.

구조분해 문법/componentN 함수


  • 구조분해 문법: 변수를 한번에 선언할 수 있는 기능 이런식으로 객체를 생성하면 name과 age 에 해당값이 들어감 (Person(이름,나이))

  • Data 클래스 사용시 자동으로 만들어줌,

  • data class는 자동으로 componentN이라는 함수를 만드는데 component1() 은 첫번쨰 필드, component2() 는 두번쨰 필드를 의미함

  • 구조분해 문법은 componentN 함수를 사용해서 만든것

  • data class가 아닌 클래스에서 구조분해 문법 사용방법

takeIF() , takeUnless()

  • 자바의 if-else 처럼, 조건을 만족하면 그값이 아니면 null 반환

  • 반대로 조건을 만족하지 않으면 그 값이, 그렇지 않으면 null반환

Scope

= 영역함수

let

  • 하나 이상의 함수를 call chain 결과로 호출 할 때

  • non-null 값에 대해서만 code-block 실행할때

run

  • 객체 초기화반환 값의 계산을 동시에 할떄

also

  • 객체를 수정하는 로직이 call chain 중간에 필요할 떄

apply

  • 객체 설정을 할때 객체를 수정하는 로직이 call chain 중간에 필요 할때

with

  • 특정 객체를 다른 객체로 변환해야 하는데 모듈 간의 의존성에 의해 정적 팩토리 혹은 toClass 함수를 만들기 어려울때

  • 엔티티 ->DTO 시 this를 줄여줆으로서 코드가 한결 간결해진다.

Util

  • 코틀린에서는 그냥 파일-> 메서드로 Util 만들어도 알아서 static으로 만들어주니 이렇게 사용하자

다양한 컬렉션 기능

  • filter /filterIndexed
  • map/ mapIndexed / mapNotNull
  • all : 조건을 모두 만족하면 true 아니면 false
  • none : 조건을 모두 불만족하면 true 아니면 false
  • any : 조건을 하나라도 만족하면 true 아니면 false
  • fisrt / firstOrNull
  • last / lastOrNull

  • grouBy/ associatedBy (중복되지 않는 키를 가지고 맴핑할때)

  • 이런식으로 키벨류에 람다 람다 넣을수도 있음

  • flatten : 중첩 리스트를 그냥 리스트로 변환

profile
호주쉐프에서 개발자까지..

0개의 댓글