변수 선언 : val (or var) 변수명 [: 자료형] = 초깃값
val : value, 상수, 초기화 값으로 값 고정, 초기화 값 필수
var : variable, 변수 선언 후 필요에 따라 값 변경
자료형을 생략했을 경우, 초기화 값의 자료형으로 결정
val myValue = 10 // Integer 형
val data01 : Int = 1234 // 전역변수 또는 클래스의 멤버변수는 반드시 초기화 수행 -> 전역변수: 초기화 필수, 멤버변수 : 초기화 선택
var data02 = 5
fun main() {
val data01 : Int // Int : 기본 타입 모두 class
var data03: String
data01 = 4321
data03 = "Som"
println("Hello World!! $data01 $data03") // 문자열(" ") 내부에서 $변수명 사용하여 변수값 출력 가능
// 수식을 넣으려면 ${변수 +1}
}
lateinit var 변수 : 자료형val 변수 [: 자료형] by lazy { }lateinit var data01: String
val data02: Int by lazy {
println("val init")
1234
}
fun main(){
data01 = "Mobile"
println("data01: $data01 data02: $data02")
}
var data01 : Int = null (x)var data02 : Int? = null (O)var data01 : Int = 10 // 변수 선언
var data02 : Int? = null // null 대입 가능
var data03 : Any = "20" // Any를 사용하여 문자열 저장
fun main(){
var data04 = data01.toFloat() // 현재 자료형을 Float으로 변환, 객체이므로 멤버함수 사용 가능
println("$data01, ${data02}, $data03 $data04")
}
fun myFunction01() : Unit { // 반환타입 없음
println("myFunction01")
}
fun myFunction02() : Nothing? { // null 반환 -> ? 사용
return null
}
fun myFunction03 () : Nothing { // Exceptional throw
throw Exception()
}
fun 함수명 (매개변수명: 타입[, ... ] : 반환타입 {함수본체})
fun myPower01(value: Int) : Int {
return value * value*
}
fun myAdd(value: Int) : Unit {
// value = 10
}
fun myDefault (value : Int = 1) : Int {
return value * value*
}
fun mySelection (value01: Int, value02: Int) : Unit {
print("add == ${value01 + value02}")
}
fun main(){
println("${myDefault()} ${myDefault(10)}")
println("${mySelection(1, 2)} ${mySelection(value02=1, value01=2)}")
}
.set() , .get() 사용 가능[ ] 사용 권장val myArray: Array<Int> = Array(3, {0}) // 3은 size, 0은 초기화값
fun main(){
println(" ${myArray[0]}, ${myArray.get(0)}")
myArray[1] = 10
myArray.set(2, 20) // set(위치, 값)
println(" ${myArray[1]}, ${myArray.get(2)}")
}
val int Array01 : Array<Int> = Array(3, {0})
val intArray02 = IntArray(3, {0})
val intArray03 = arrayOf<Int>(1, 2, 3)
val intArray04 = intArrayOf(4,5,6)
fun main(){
println("array01 size: ${ intArray01.size} ")
}
val myList01 : List<Int> = List(3, {0})
val myList02 : listOf(1, 2, 3)
val myMuList01 : MutableList<Int> = MutableList(3, {0})
val myMuList02 = mutableListOf<Int>(1, 2, 3)
fun main(){
// myList01[0] = 10 // 오류 발생
myMuList01[0] = 10
myMuList02.add(4) // 새로운 항목 추가
myMuList02.set(0, 10) // 기존 항목 변경
println("${myMuList01} ${myMuList02}") // 실행 결과 : [10, 0, 0, 4] [10, 2, 3]
}
fun main(){
val value = 10
if(value > 10){
println("Up")
} else {
println("Down")
}
val result : Boolean = if (value > 5) {
true // 표현식 - 값 반환
} else {
false
}
println("result : $result ")
}
fun main() {
val data : Any = 10
val result = when (data) { // 표현식 사용 가능, 조건에 String도 사용 가능
is Int -> { // is : datatype , 자료형 확인
println("Integer!")
true
}
is String -> false
10 -> true
in 5..10 -> true // 범위 확인 가능, 5 <= data <= 20
else -> false
}
println("result : $result")
}
fun main() {
while (true) {
print("Input a number (0 for exit) : ")
val inputData = readLine()?.toInt()
if (inputData != 0) continue
else break
}
}
fun main() {
for (i in 1..10 print ("$i ")) // 1 <= i <= 10
println()
for (i in 1 until 10) print ("$i ") // 1 <= i < 10
println()
for(i in 1..10 step 3) print ("$i ") // 1부터 10까지 3씩 증가
println()
for (i in 10 downTo 2) print ("$i ") // 10부터 2까지 감소 , 10 >= i >= 2
}
int main() {
val data = intArrayOf(1, 2, 3, 4, 5)
for (value in data) print ("$value")
println()
for (index in data.indices) { // indices : collection의 index 집합
println("index: $index value : ${data[index]}")
}
for ((index, value) in data.withIndex()) {
println("[$index] : $value") // withIndex() : index와 value 함께 반환
}
}
{매개변수 ... -> 함수 Body } <= 함수 조각val almbdaNoParam = { -> println("lambda")} // { println("lambda!")}
lambdaNoParam()
val labdaWithParam = { num1: Int -> num1 + 10 }
// val lambdaWithParam : (Int) -> Int = { num1: Int -> num1 + 10} // 변수 할당 시 람다 함수 타입 선언
val result = lambdaWithParam(10)
println(result)
// 매개변수가 있는 람다함수의 예
val lambdaFunc : (Int, String) -> Unit = { num: Int, str: String ->
println(num * num)
println(str)
}
// it 키워드 사용
val lambdaPower : (Int) -> Int = {num : Int ->
num * num // 반환값은 표현식 형태
}
println(lambdaPower(2))
val lambdaWithIt : (Int) -> Int = {
it * it // 매개변수가 하나일 경우, 해당 매개변수 표현
}
println(lambdaWithIt(3))
val nameFunc : () -> Unit = { // return 없고, 매개변수 X -> 생략가능
println ("som!")
}
val subjectFunc: () -> Unit = { // 매개변수X -> 생략가능
val subjectName = "Mobile softeware"
println(subjectName)
}
fun higherOrderFunc(argFunc: ( ) -> Unit) { // 함수를 매개변수로 전달받음, 매개 X, return X 함수
println("Dept: computer ")
argFunc()
}
// nameFunc, subjectFun 모두 해당 함수의 매개변수로 들어갈 수 있음
higherOrderFunc(nameFunc)
higherOrderFunc(subjectFunc)
fun higherOrderFunc () : (String) -> Unit { // 매개변수로 String을 받음, 반환 타입 X
return { grade ->
println("Dept: Computer")
println("Subject: Mobile Software")
println("Grade : $grade" )
} // 문자열 type인 grade를 전달 받아 화면 출력을 수행하는 람다 함수
}
val returnedFunc = higherOrderFunc()
returnedFunc("A") // return { } 잘에 "A"가 오는 것.
[타입?] 연산자 : 변수 선언 시 null을 할당가능한 변수로 선언하고자 할 때 사용[객체?.멤버] 연산자 : 객체가 null 상태일 경우 null 이라는 상수 값으로 대체? 연산자를 사용하여야만 null 할당 가능?. 사용하여 객체가 null 상태일 경우 null이라는 값으로 대체 가능[ 값 ?: 대체값 ] 연산자[값] 부분이 NullPointerException이 발생하지 않는 경우에는 [값] 사용, 발생할 경우 [대체값] 사용var str: String? = "Mobile"
println(str?.length ?: 0)
str = null
println (str?.length ?: 0)
// 결과
6
0
[값 !!]연산자[값] 부분이 null 일 경우 NullPointerException 발생var str: String? = null
println(str!!.length ?: 0) //NullPointerException 발생
class MyClass constructor(dept: String){
var dept : String
init {
this.dept = dept
}
}
class MyClass (dept: String) { // constructor 키워드 생략
var dept : String
init {
this.dept = dept // init { } 주 생성자 body => 가장 기본 생성자
}
}
class MyClass {
var dept : String // 멤버변수는 init { }가 있을 경우 초기화 생략 가능
init {
dept = "computer" // 주생성자 생략 -> 매개변수가 없는 주생성자 자동 생성
}
}
fun main() {
val myDept = MyClass("computer") // 객체 생성
}
class MyClass (dept: String) // dept : 주생성자의 매개변수 -> 지역변수 취급
init{
println("$dept")
}
fun printDept(){
println("dept: $dept") // dept는 소멸한 상태라 오류 발생
}
}
class MyClass(val dept : String){ // val 을 사용하였으므로 dept는 멤버변수
init{
println("$dept")
}
fun printDept(){
println("dept: $dept")
}
}
class MyClass {
constructor (dept :String) { // 주생성자 , 매개변수가 없는 주생성자와 하나의 매개변수를 갖는 보조생성자 존재
println("${dept}")
}
}
// 주생성자를 명시적으로 구현할 경우 반드시 보조생성자에서 주생성자 최종적으로 호출
// 보조 생성자의 개수와 상관없음
// 매개변수가 없는 주생성자 선언 포함
// 보조생성자 호출 후 주생성자를 호출하도록 구현 필요
class MyClass(){ // () 가 없으면 주생성자
constructor(dept: String) : this(){ // 보조생성자, this() <- 주생성자 호출
println("${dept}")
}
}
open 선언한 경우에만 선언 가능open class Superclass {
init{
println("Super class") // 먼저 항상 수행됨
}
}
class Subclass : SuperClass() { // 상위클래스의 생성자 호출 필요
init {
println("Sub class")
}
}
open class SuperClass{
var memVar01 = 1
open var meVar02 = 2
fun memFunc01() {
println("super01!")
}
open fun memFun02() {
println("super02!")
}
}
// 상위클래스의 open 키워드를 기록한 멤버만 재정의 가능
class SubClass : SuperClass(){ // 상위클래스의 생성자 호출 필요요
override var memVar01 =2 // 오류 발생
override var memVar02 = 3 // 수정 가능!
override fun memFunc01() { // open 키워드 없기 때문에 오버라이딩 불가
println("sub01!")
}
override fun memFunc02(){
println("sub02!")
}
}
== 연산자로 값 비교 가능data class Subject(val title: String, var credit: Int)
fun main(){
val sub1 = Subject("mobile", 3)
val sub2 = Subject("mobile", 3)
println("${sub1}") // 결과 : Subject(title=mobile, credit=3)
println("${sub1.equals(sub2)}") // 결과 : true ,
// java의 경우 서로 다른 객체이므로 false 반환, Kotlin의 data 클래스는 멤버변수의 값이 같으면 equals()가 true 반환
}
open class SuperClass{
init {
println("Super class")
}
}
interface SomeInterface {
val dept : String
fun getDept()
}
val obj1 = object : SuperClass(){ //SuperClass를 상속하면서 새로운 멤버변수와 멤버함수를 추가한 객체 생성
var memValue = 10
fun memFunc() {
println("Object class!")
}
}
val obj2 = object: SomeInterface {
override val dept : String = "computer"
override fun getDept(){
println("$dept") // interface에서 직접 필요한 객체 생성
}
}
class MyClass {
companion object {
var coData = 10
fun coFunc () {
println("Companion!")
}
}
} // MyClass로 생성한 모든 객체들이 공용
// static 과 유사한 방식으로 사용
fun main() {
println("${MyClass.coData}")
println("${MyClass.coFunc()}")
}