funsumSample(a1:Int, a2:Int) { println("Int sum ${a1+a2}") }
funsumSample(a1:Double, a2:Double) { println("Double sum ${a1+a2}") }
연산자
단항연산자
1 2 3 4 5 6 7
+a : 양수는 양수, 음수는 음수 -a : 양수는 음수, 음수는 양수 !a : true는 false, false는 true a++ : a 의 값을 사용하고 증가 a-- : a 의 값을 사용하고 감소 ++a : a 의 값을 증가시킨 후 사용 --a : a 의 값을 감소시킨 후 사용
산술연산자
1 2 3 4 5 6
a + b : 더하기 a - b : 빼기 a * b : 곱하기 a / b : 나누기 a % b : 나머지 a..b : a 부터 b 까지의 객체를 만들어서 Return
대입연산자
계산 후 다시 변수에 넣어줌
1 2 3 4 5
a += b : a = a + b a -= b : a = a - b a *= b : a = a * b a /= b : a = a / b a %= b : a = a % b
비교연산자
1 2 3 4 5 6
a == b : a 와 b 가 같은지 true , false a != b : a 와 b 가 다른지 true, false a > b : a 가 b 보다 큰지 a < b : a 가 b 보다 작은지 a >= b : a 가 b 보다 크거나 같은지 a <= b : a 가 b 보다 작거나 같은지
제어문
IF
1 2 3 4 5 6 7
if (조건식) { 코드 } elseif (조건식) { 코드 } else { 코드 }
When
1 2 3 4 5 6 7
when (변수 or 수식) { 값1 -> 코드 값2 -> 코드 값3, 값4 -> 코드 in1..10 -> 코드 // 1부터10사이일 경우 코드 실행 else -> 코드 }
반복문
for
1 2 3
for (변수 in 배열) { //코드 }
while
do-while 과 다르게 조건식이 false 면 1번도 실행되지 않는다
1 2 3
while(조건식) {
}
do~while
while 과 다른 점은 조건식이 false 라도 코드는 1번 실행된다
1 2 3
do { 코드 } while(조건식)
return
함수를 중단하고 호출한 쪽으로 돌아간다
break
반복 횟수가 남아 있더라도 반복을 중단한다
continue
반복문에서 코드가 남아 있더라도 다음 반복으로 넘어간다
클래스
1 2 3
class 클래스명 {
}
init
객체 생성시에 자동으로 실행할 때 init 사용
1 2 3 4 5 6
class 클래스명 { init { //코드 } }
constructor
생성자를 정의할 때 사용하고 매개변수의 개수나 자료형을 달리하여 여러 개를 만들 수 있다
1 2 3 4 5 6 7 8 9 10
class 클래스명 { constructor() {
}
constructor(inputA:Int, inputB:Int) {
} }
기본 생성자
클래스 정의시 클래스 이름 우측에 정의하는 생성자 기본 생성자의 매개 변수는 멤버 변수로 자동 등록된다
1 2 3
class 클래스명 (var InputA:Int, var InputB:Int) {
}
상속
상속하는 클래스를 부모 클래스 (SuperClass)
상속을 받는 클래스는 자식 클래스 (SubClass)
SuperClass 는 open 키워드를 사용해야 한다
open 을 사용하지 않으면 자바코드로 변경시 final 키워드가 붙는다
자바는 상속을 막기 위해서 final 을 붙인다
코틀린은 open 을 사용하지 않으면 상속이 안된다 (자바와 반대로 관리한다)
패키지
파일을 물리적인 폴더로 나누어 관리하는 개념
1 2 3 4 5 6
package com.skyksit.kotlin.util
classUtilClass {
}
import
패키지 명을 생략할 수 있다
1 2 3 4 5
import com.skyksit.kotlin.util.UtilClass
val util:UtilClass = UtilClass()
val addValue = util.add(1, 2)
Module
패키지를 모아서 관리하는 개념
Module 사용을 위해서는 등록을 해주어야 한다
파일 > 패키지 > 모듈
접근제한
Kotlin 클래스의 모든 변수는 Java 로 변경될 때 private 로 정의된다
클래스
private : 외부에서 객체를 생성할 수 없다
public (default) : 외부에서 객체를 생성할 수 있다
internal : 같은 모듈안에서만 객체를 생성할 수 있다
변수, 메서드
private : 외부에서 접근할 수 없다
public (default) : 외부에서 접근할 수 있다
protected : 상속관계일 경우에만 접근이 가능하다
internal : 같은 모듈안에서만 접근이 가능하다
Property
캡슐화를 적용한 변수를 메서드를 통해서 값을 설정하거나 사용하는 걸 Property 라 한다
Kotlin 은 변수 선언을 하면 자동으로 Property 가 된다
Java 같이 Setter, Getter 를 선언하지 않아도 된다
var 는 getter, setter 가 설정된다
val 은 getter 만 설정된다
지연초기화
변수 선언시에 값이 필수 이지만 지연시키는 방식을 지연초기화라고 한다
var 는 lateinit, val 은 lazy 로 지연초기화 한다
지연초기화 한 변수를 사용하기 전에 초기화해야 한다
Overriding
부모클래스의 메소드를 재정의 하는 것
메소드 앞에 open 을 적어야 자식클래스가 메소드를 재정의 할 수 있다
this
객체 자신을 지칭한다
클래스와 메소드 변수명이 동일할 때 this 로 클래스의 변수를 호출할 수 있다
super
부모 클래스를 지칭한다
추상클래스
추상클래스는 자식 클래스에서 메서드를 강제로 Overrriding 하게 하기 위해서 만든다
추상클래스를 직접 사용할 수 없다
인터페이스
추상클래스와 목적은 비슷하지만 하나의 클래스에 여러 인터페이스를 구현할 수 있다
인터페이스는 클래스가 아니므로 객체를 생성할 때 사용할 수 없다
클래스는 한개 이상의 인터페이스를 구현할 수 있다
인터페이스틑 추상 메서드와 일반 메서드 모두를 구현해서 사용할 수 있다
companion
Java 에서는 Static 을 사용하고 Kotlin 은 Companion 객체를 사용한다
프로그램에서 동일한 정보를 사용해야 할 경우 companion 객체를 사용한다
객체를 생성해서 사용하지 않고 클래스를 바로 호출해서 사용한다
Data Class
Data 를 관리하기 위한 클래스
Data Class 는 몇가지 메서드가 자동으로 구현된다
equals
hashCode
copy
toString
componentN
추상클래스로 선언 되지 않는다
상속클래스로 사용할 수 없다
Generic
클래스 설계시에 변수의 여러 종류 타입을 수용하고 싶을 때
클래스 작성시 변수 타입을 선언하는 게 아니라 객체 생성시 변수 타입을 생성할 수 있다
Generic Type 을 그냥 설정하면 동일한 타입만 사용가능하다
out 으로 Generic Type 을 설정하면 부모 클래스는 사용가능하다
in 으로 Generic Type 을 설정하면 자식 클래스는 사용가능하다
1 2 3 4 5 6 7 8 9 10 11 12 13
funmain() { val firstClass = GenericClass<Int>() firstClass.addMethod( 100 )
val secondClass = GenericClass<String>() secondClass.addMethod( "ABCD" ) }