728x90

코틀린 강의 시리즈는 이미 자바 문법을 어느정도 안다는 가정하에서 진행을 한다.

따라서 자바 문법을 모르는 상태에서 코틀린의 강의를 들을 수 없으므로 자바부터 배워오길 바란다.

또한 강의의 전반적인 내용은 코틀린에 대한 새로운 문법을 소개하며 자바와 어떻게 다른지를 비교한다.

코틀린은 자바와 같은 jvm족이므로 둘의 협업역시 중요하므로 둘이 어떻게 호환이 되는지도 다루게 된다.

그리고 이 강의는 코틀린 강의지 안드로이드 강의가 아니다. 안드로이드 강의는 알아서하고 코틀린을 적용시키는건 본인 재량이다.


필자는 강의시 원래 IDE에 대한 설명을 최대한 배제하려한다.

필자 블로그의 카테고리는 programming과 usage 둘로 나뉘어 있다.

따라서 프로그래밍은 programming에, IDE및 사용법들은 usage에 나뉘는 방식으로 포스팅을 해왔다.

그런데 코틀린은 조금 상황이 다른게 이미 자바를 알고 있고 자바와 협업한다는 가정하에서 포스팅을 하기에

주변상황에 대한 설명이 들어갈 확률이 매우 높다고 할 수 있다.

따라서 IDE나 사용법에 대한 설명을 같이 포스팅한 경우가 많다. 물론 보는 입장에선 이게 더 도움은 될것이다.

필자가 사용하는 IDE는 IntelliJ가 될것이다. 자바든 코틀린이든 둘다 IntelliJ로 하게 될것이다.


참고:

코틀린 컴파일러 콘솔로 실행하기

코틀린 프로젝트만들기 - InteliiJ

코틀린 프로젝트만들기 - Eclipse


코틀린 클래스는 자바클래스와 달리 만드는 방법이 많이 신박해 졌다.

나쁘게 말하면 더 까다로워졌다. 대신 코드 수는 확실하게 줄어들었다.

일단 가장 간단한 형태는 아래와 같이 쓸 수 있다.


class Shape {

}

아무것도 없는 정말 간단한 클래스이다. 이 상태까지는 자바와는 똑같다.

이제 필드를 추가시켜보도록 하겠다.

class Shape {
var x:Int = 0
var y:Int = 0
var width:Int = 0
var height:Int = 0
}

이까지도 뭐 자바와 문법적인 차이만 있을 뿐 다른점은 없다.

다만 차이점이 있다면 무조건 초기화를 시켜줘야한다. 자바는 냅두면 알아서 null이나 0으로 초기화시켜줬다.

그러나 코틀린은 강제다. 반드시 초기화를 시켜준다.

이번엔 생성자를 만들어보자. 이번엔 자바와 매우 다르다.

class Shape constructor(x: Int, y: Int) {
var x: Int = x
var y: Int = y
var width: Int = 0
var height: Int = 0
}

생성자를 이제 키워드를 써서 접근한다. 그 키워드는 constructor이다.

생성자의 파라메터를 내부에서 적어주는 형식으로 사용한다. 훨씬 간단해져서 보기는 더 좋다.

위 코드는 암묵적으로 아래와 동치이다.

class Shape (x: Int, y: Int) {
var x: Int = x
var y: Int = y
var width: Int = 0
var height: Int = 0
}

이렇게 클래스명 옆에 바로 쓰는 생성자를 기본생성자라 부른다. 자바와는 약간 느낌이 다르다.

자바에서 기본생성자 파라메터가 하나도 없고 내용도 없고 생성자를 만들지 않았는데 기본적으로 존재하는 생성자를 기본생성자라한다.

그러나 코틀린에서는 클래스명 옆에 선언한 생성자를 기본생성자라한다. 이 생성자는 키워드를 붙히지 않아도된다.

그럼 두번째, 세번째 생성자는 어떻게 만들까? 그렇기 위해서 존재하는게  constructor이다.

class Shape(x: Int, y: Int) {
var x: Int = x
var y: Int = y
var width: Int = 0
var height: Int = 0

constructor(x: Int, y: Int, width: Int, height: Int) : this(x, y) {
this.width = width
this.height = height
}
}

두번째 생성자는 메소드처럼 선언한다. 자바와 조금 비슷한데 잘보면 C++생성자 호출방식과 거의 똑같다.

생성자를 호출할때 기본생성자가 코틀린에서는 중요한데 두번째, 세번째 생성자는 반드시 체인형식으로 사용한다.

내가 만든 기본생성자를 반드시 호출해줘야하는 것이다.

여기서 한가지 궁금증이 있을 수 있다. 기본생성자의 경우에는 로직을 만들수 없다. 왜냐하면 함수블록이 없기 때문이다.

class Shape(x: Int, y: Int) {
var x: Int = x
var y: Int = y
var width: Int = 0
var height: Int = 0

init{
println("생성자 호출")
}

constructor(x: Int, y: Int, width: Int, height: Int) : this(x, y) {
this.width = width
this.height = height
}
}

만약 옛날 자바 같은 스타일로 코딩을 하고싶다면 아래와 같이 사용해야한다.

class Shape() {
var x: Int = 0
var y: Int = 0
var width: Int = 0
var height: Int = 0

constructor(x: Int, y: Int) : this() {
this.x = x
this.y = y
}

constructor(x: Int, y: Int, width: Int, height: Int) : this() {
this.x = x
this.y = y
this.width = width
this.height = height
}
}

자바같은 형태로 파라메터를 다양하게 사용하고 싶다면 위와 같은 형태로 기본생성자를 아무것도 없이 선언하면 된다.

이번에는 메소드를 선언해보자.

class Shape(x: Int, y: Int) {
var x: Int = x
var y: Int = y
var width: Int = 0
var height: Int = 0

constructor(x: Int, y: Int, width: Int, height: Int) : this(x, y) {
this.width = width
this.height = height
}

fun setSize(width: Int, height: Int) {
this.width = width
this.height = height
}

fun getArea(): Int {
return width * height
}
}

메소드는 함수선언과 똑같이 fun으로 선언을 하자.

반환타입은 :뒤에 적어주면 된다. 변수랑 똑같다. 만약 변환타입이 없다면 아무것도 적어주지 않아도 된다.

사실 변환타입이 없는건 아니지만 없다고 생각하고 접근해도 무방하다.

fun main(args: Array<String>) {
var s = Shape(10, 20, 30, 40)
println(s.x)
println(s.y)
println(s.width)
println(s.height)
s.setSize(50, 50)
println(s.getArea())
}

이제 main에서 한번 사용해보자. 모든게 자바처럼 잘 작동하는걸 확인할 수 있다.

'Programming > Kotlin' 카테고리의 다른 글

[Kotlin-06]상속(abstract class)  (0) 2017.11.10
[Kotlin-05]상속(open class)  (0) 2017.11.10
[Kotlin-04]open  (0) 2017.11.10
[Kotlin-03]Kotlin 변수와 접근제한자  (0) 2017.11.08
[Kotlin-01]Kotlin File  (0) 2017.11.07

+ Recent posts