[Kotlin] 코틀린이란? 코틀린과 자바의 차이 :: 잡다한 프로그래밍
반응형

1. 코틀린이란?

- 코틀린(Kotlin)은 인텔리제이(IntelliJ IDEA)라는 제품으로 유명한 젯브레인(JetBranins)에서 만든 언어로, 2011년 최초로 공개된 후 오랜 시간 개발을 거쳐 2016년 2월 1.0 정식 버전이 출시되었습니다.

코틀린은 간결한 문법과 풍부한 기능, 높은 안정성을 토대로 높은 생산성을 보장하는 것을 목표로 개발되었습니다. 또한, 자바와 호환되어 자바로 작성된 프로젝트에 코틀린 코드를 추가할 수도 있고 자바 코드를 모두 코틀린으로 대체 할 수도 있습니다. 뿐만 아니라, 코트린은 구글의 연례 개발자 행사인 구글I/O 2017에서 안드로이드의 공식 지원 언어로 채택되었습니다.


2. 코틀린의 컴파일 과정

Java 코드와 Kotlin 코드가 함께 있는 프로젝트의 빌드 과정

  1. Kotlin 컴파일러가 Kotlin 코드를 컴파일해 .class 파일을 생성한다.
    이 과정에서 Kotlin 코드가 참조하는 Java 코드가 함께 로딩되어 사용된다.
  2. Java 컴파일러가 Java 코드를 컴파일해 .class 파일을 생성한다.
    이때 이미 Kotlin이 컴파일한 .class 파일의 경로를 클래스 패스에 추가해 컴파일한다.

3. 코틀린 자바의 차이

3.1 변수 선언

- 자바 변수 선언

String value = "test";       // 변수
final String value = "test";    // 상수

//new 키워드로 클래스 선언
Test test = new Test();

- 코틀린 변수 선언

var/val 변수명: 변수타입 = 초기화

변수 타입 생략 가능 (컴파일러가 타입을 정해줄 수 있음 = 타입추론(TypeInference))

var value: String = "test"   // 변수
val value: String = "test"   // 상수

var value = "test"
val value = "test"

val test:Test = Test()

 

3.2 변수 null 여부

자바 변수 선언

@NotNull
String value = "test";
@Nullable
String value = "test";

- 코틀린 변수 선언

특징으로는 컴파일시 null여부를 확인한다.

var value: String = "test"   // @NotNull
val value: String? = "test"   // @Nullable

3.3 접근 제한자

자바 접근 제한자

public    : 모든 접근을 허용
protected : 같은 패키지(폴더)에 있는 객체와 상속관계의 객체들만 허용
default   : 같은 패키지(폴더)에 있는 객체들만 허용
private   : 현재 객체 내에서만 허용

- 코틀린 접근 제한자

- 코틀린 공식 문서에 따르면 internal이 말하는 '같은 모듈'은 아래 상황을 뜻합니다. 쉽게 생각해 같은 프로젝트 라고 생각하면 좋을 것 같습니다.

  • IntelliJ IDEA Module
  • Maven Project
  • Gradle Source Set(with the exception that the test source set can access the internal declarations of main)
  • a set of files compiled with one invocation of the <kotlinc> Ant task
public		: JAVA와 동일
private		: JAVA와 동일
protected	: JAVA와 동일
internal	: 같은 모듈 내에서 어디서든 접근 가능

 

3.4 함수 선언

자바 함수 선언

public int sum(int a, int b) {
	return a + b
}

- 코틀린 함수 선언

fun으로 선언, 함수명(파라미터): 리턴타입

사용되는 파라미터 (a, b)는 상수인것이 특징

fun sum(a: Int, b: Int): Int {
    return a + b
}

 

3.5 클래스 선언

- 자바 클래스 선언

public class Test {
    private String name;

    public Test(String name) {
        this.name = name;
    }
    
    public String getName() {
    	return name;
    }
}

 

- 코틀린 클래스 선언

class Test(val name: String)

//getter, setter 자동으로 만들어줌

내부 name변수 사용할때는 test.name으로 사용할 수 있음

val test:Test = Test("mylee")

// mylee
println(test.name)

test.name = "testName"

// testName
println(test.name)

4. 코틀린의 장 단점

4.1 널 안정성 (null safety)

만약 아래와 같은 함수를 가진 자바 라이브러리를 코틀린에서 사용한다고 할 때 코틀린에서 리턴타입 String을 String?(nullable)로 인식한다.

String getStr() {
  ....
  return str;
}

따라서 아래와 같은 코드는 컴파일 시점에서 에러가 발생한다.

NotNull 변수에 nullable을 리턴하는 함수를 사용했기 때문이다. 이렇게 컴파일 시점에서 Null 에러를 잡아낼 수 있다.

(nullable을 리턴하는 코틀린 함수여도 마찬가지)

var test: String = getStr()

만약 아래와 같이 !! 연산자를 이용하면 컴파일 오류를 피할 수 있다. (!! 연산자는 Null이 아님을 보장할 수 있음) 하지만 Null값이 들어오면 에러 발생

var test: String = getStr()!!

 

safety call (안전한 호출)

자바에서 다음과 같이 String을 대문자로 변환할 때 만약 변수가 null이라면 에러가 발생한다.

String str; 가 있다고 가정

// str값이 null일 경우 에러 발생
System.out.println(str.toUpperCase());

따라서 if문이나, 삼항연사자 같은 방법으로 에러를 피함

 

코틀린에서는 이런 Null에러를 피하기위해 Safety call을 제공한다.

?. 연산자를 사용하면 null일경우 다음 함수를 호출하지 않는다.

println(str?.toUpperCase())

?: (엘비스 연산자)

삼항연산자와 비슷한 구조인데 b?.length가 null일경우 오른쪽 -1을 리턴하게 된다.

println(b?.length ?: -1)

 

4.2 코드가 간결해짐

- 클래스, 함수형 프로그래밍 등 코드가 간결해 질 수 있음. 예제로 filter같은 예시를 들어놓은 블로그가 있는데 자바에서 Stream사용하는거랑 큰 차이가 있는지는 잘 모르겠음.

 

4.3 함수형 프로그래밍 가능

- 자바 8 이상에서 Stream 같이 사용하면서 느낀 장점 사용 가능

 

4.4 자바와의 호환

- 프로젝트내에서 자바와 함께 사용할 수 있다.

 

단점 : 빌드시간이 오래걸린다(?)

- 큰 프로젝트를 빌드해보지 않아서 겪어보지 못함

----------------------------------------------------------------------

반응형

+ Recent posts