자바와 코틀린
자바에서 코틀린으로 전환하면서 느낀 변화와 생각에 대한 정리.
자바와는 다른 코틀린의 특징#
- 현대적인 문법(언어의 디자인이 아주 예쁘다)
- null을 허용할지 여부를 명시적으로 지정함으로써 null 안정성을 보장.(Swift와 매우 유사)
- 람다식이나 고차함수같은 함수형 프로그래밍을 지원.(Swift와 매우 유사)
- 확장 메서드와 프로퍼티 지원
extension#
- 확장 메서드
- C#, Swift, Go 등에도 있는 기능이다.
- 아주 익숙하고 활용도가 높다.
- 확장메서드는 클래스의 일부가 아니기 때문에 오버라이딩은 당연히 안된다.
- 오버로드는 가능하다.
- 확장 함수는 정적바인딩 되어 컴파일시 메모리주소가 정해진다.
internal#
키워드 | 설명 |
---|---|
public(default) | 모든 곳에서 접근 가능 |
internal | 같은 모듈에서만 접근 가능 |
protected | 선언된 클래스 또는 하위 클래스에서만 접근 가능 |
private | 선언된 클래스 내에서만 접근 가능 |
open class#
- 상속을 허용할 클래스
- 이 부분도 스위프트와 유사하다 오버라이딩을 허용할 메서드앞에 open 을 붙혀야 한다.
- 자바에서는 final 이 붙지 않은 기본 클래스는 상속이 가능하지만 코틀린에서는 기본이 final 클래스라고 보면 된다. 기본적으로 상속허용이 안되고 상속을 원하면 open 키워드를 붙혀야 한다.
interface class#
- 자바에서 사용하던 인터페이스 기능과 유사하다.(다중 상속가능)
- 차이점이 있다면 코틀린에서는 프로퍼티 선언이 가능하다는 점
abstract class#
- 단독으로 객체를 생성할 수 없고 구현부 없이 추상 메서드로만 이루워져 있다.
- 클래스 상속으로 재정의하는 경우 사용되고 자바와 동일하게 다중상속시에는 interface를 쓰면 된다.
- open class와 다른 점은 단독으로 객체생성이 가능하다.
sealed class#
data class#
- 다른 언어들의 struct와 유사한 기능과 역할을 한다.
- 자바에서는 보통 데이터 클래스를 구성할 때 equals, hashCode, toString을 오버라이드하는데 컴파일러가 자동으로 만들어준다.
- Parcelize 어노테이션과 Parcelable 인터페이스를 사용하면 자바보다 훨씬 간결하게 intent에 데이터를 실을 수 있다.
Scope function#
스위프트에서는 guard let 이라는 키워드로 옵셔널 바인딩을 벗겨내어 가독성을 높일 수가 있는데 let~run 이 딱 그런 용도같다.
- let: nullable 객체를 안전하게 처리하고, null이 아닌 경우에만 블록 내에서 해당 객체를 사용할 수 있습니다. let 함수의 결과값은 블록 내의 마지막 표현식의 결과입니다.
- run: 객체의 컨텍스트 내에서 코드 블록을 실행합니다. let과 마찬가지로 nullable 객체를 안전하게 처리할 수 있습니다. run 함수의 결과값은 블록 내의 마지막 표현식의 결과입니다.
- with: 특정 객체의 컨텍스트 내에서 코드 블록을 실행합니다. with 함수는 객체 자체를 전달받아 사용하므로, 객체에 대한 참조를 명시적으로 제공할 필요가 없습니다. with 함수의 결과값은 블록 내의 마지막 표현식의 결과입니다.
- apply: 객체의 속성을 초기화하거나 수정하는 데 사용됩니다. apply 함수는 객체 자체를 전달받아 사용하며, 객체의 속성에 연속적으로 접근하여 값을 설정할 수 있습니다. apply 함수의 결과값은 해당 객체 자체입니다.
- also: 객체를 받아서 사용하는 let과 유사하지만, also는 해당 객체를 반환하지 않고 전달받은 객체를 그대로 유지한 채로 다른 용도로 사용할 수 있습니다. also 함수의 결과값은 전달받은 객체 자체입니다.
Collection 자료구조 컨테이너#
3가지 타입의 컬렉션 모두 정적, 동적인 사용이 가능합니다.
List
- 데이터 중복을 허용하며, 특정 자료형의 자료들을 순서대로 보관하는 구조이다.
- 그리고 List 인터페이스를 상속받는 ArrayList, LinkedList 들이 있다.
Set
- 동일한 data가 없고 null을 가질 수 있지만, 동일한 객체가 없기 때문에 null또한 1개만 가진다.
- List와 달리 중복을 허용하지 않으며, 순차적이지 않은 집합.
Map
- key와 value를 갖는 자료구조이며 중복 key를 허용하지 않는 것이 딕셔너리와 유사하다.
Static#
코틀린에서는 정적멤버가 없다. 즉, static 키워드를 지원하지 않는다. 그래서 Object 키워드를 통해 정적메서드 또는 정적필드를 대신한다.
그렇다면 왜 코틀린에서는 static 키워드를 없애버렸는지 자바에서의 static 문제점에 대해 고찰할 필요가 있겠다.