병원도 여러곳 가보듯이 코틀린도 문법을 배우고 나서 뭔가 부족한 느낌이 들어서 다른 강의를 들었다. 확실히 빠진내용에 대한 보충이 많았다.
이전 코틀린문법 정리한 내용에서 핵심내용 + 빠진 부분들을 다시
정리해봤다.
코틀린은 모든값을 객체로 관리
본 타입간의 변환은 명시적으로 이루어져야 한다
Primitive Type과 Reference Type을 구분하지 않아도 된다
Kotlin에서는 패키지를 namespace를 관리하기 위한 용도로만 사용! 가시성 제어에는 사용되지 않는다.
Kotlin에서는 싱글톤 만들때 object 만 붙여주면 됀다.
주생성자는 Person(val name, var age) -> 이것만으로 이미 주생성자, 게터 세터 생성됨
생성자를 추가 하고 싶으면 기존 생성자는 그대로 두고 constructor() 로 따로 만들준다. 이거 부생성자라 부른다
부생성자는 최종적으로 주생성자를 this로 호출해야 한다.
Class test(a1:int,a2:int) --> 매개변수 생성자만 생성
Class test(var a1:int, val a2:int) --> 매개변수 생성자, 게터,세터 ,맴버변수
부생성자 있는클래스에 주생성자 있으면 무조건 주생성자 호출해야함!
만약 생성자 안에 init()메서드가 있으면 생성자부터 실행하고 init()이 실행된다.
var/val 은 주 생성자에게만 쓸수 있다.
init()은 생성자 호출되는 시점에 호출되 주로 필드 검증시 사용
주생성자
- 반드시 있어야함
- 주생성자 파라미터가 하나도 없으면 생략가능
부생성자
- 있을수도 없을수도 있다.
- 최종적으로 주생성자를 this로 호출해야함
부모클래스 open으로해줘서 상속 해줘야함
멤버변수, 함수는 기본pirvate, 상속시 open 으로
상속 할떄 부모클래스 생성자 호출해야함
코틀린은 부모의 멤버 변수도 오버라이딩 가능!
객체를 사용하는데 약간의 기능이 추가된 클래스
순수하게 특정 매개체 정보 관리를 위해만 사용
반드시 주 생성자 가지고 있어야함
abstract,open, sealed, inner 로 클래스 정의 불가
Equals 는 주생성자 매개변수들만 비교! -> 그래서 왠만하면 주생성자로 만드는게 유리함
enum 클래스가 상수를 관리하는 개념이라면 sealedClass 는 객체 를 관리 하는 개념이다
열거형 사용시 상수가 의미하는 값을 수시로 바꿔야하거나 다양한 형태로 사용해야할때 사용한다.
주로 추상화가 필요한 Entity or DTO에 사용
자바에서는 동일성(주소비교)에서는 == 를 ,동등성(안에 데이터비교)에서는 equals
코틀린에서는 동일성에는 ===를, 동등성에서는 ==
비교 연산자 사용시 자바와 다르게 객체를 비교할때 자동으로 compareTo를 호출해줌
Statement: 프로그램의 문장, 하나의 값으로 도출되지 않는다
Expression: 하나의 값으로 도출되는 문장
vararg
배열 넣어주거나(이떄는 배열에 *붙여줘야함 (spread 연산자 = 배열안에 있는것들을 ,를 쓰느것처럼 꺼내준다는 의미)
안에는 static 내부클래스가 권장됨 코틀린에서는 그냥 static 쓰지말고 class 만쓰면 자동 처리됌
기본적으로 바깥클래스를 참조하지 않음
이런식으로 index와 value를 같이 출력할수도 있다.
array.plus(값) = 자바에서는 copy해주고 값을 넣어줘야 하지만 코틀린 배열은 쉽게 넣기 가능
함수를 파라미터로 전달할 떄에 오버헤드를 줄일 수 있다. 함수-> 함수 부르면 call chain에 overhed 생김
하지만 신중하게 사용해야하고 코틀린 라이브러리는 어느정도 최적화가 되있어서 괜찮다.
protected 주의!
private class 를 만들떄는 public + 생성자가 기본이라 생성자를 명시적으로 써줘야함
코틀린에서는 하나의 객체로 간주 되기 때문에 이름도 붙일수있음, 인터페이스구현도 가능
const 를 붙이면 컴파일시에 변수할당 / 아니면 런타임시에 할당
Companon object 호출시 이름 지정을 안하면 Person.companion.이름 이런식으로 불러오지만 @jvmstatic을 붙여주면 자바처럼 Persons.이름 으로 호출 가능
data class는 자동으로 componentN이라는 함수를 만드는데 component1() 은 첫번쨰 필드, component2() 는 두번쨰 필드를 의미함
구조분해 문법은 componentN 함수를 사용해서 만든것
= 영역함수
특정 객체를 다른 객체로 변환해야 하는데 모듈 간의 의존성에 의해 정적 팩토리 혹은 toClass 함수를 만들기 어려울때
엔티티 ->DTO 시 this를 줄여줆으로서 코드가 한결 간결해진다.
이런식으로 키벨류에 람다 람다 넣을수도 있음
flatten : 중첩 리스트를 그냥 리스트로 변환