//문법적 주요 특징
//a. 문장의 끝을 나타내는 ; 사용안함. 써도 무관
//b. 변수를 만들 때 자료형을 명시하지 않음. var, val 키워드 사용. 단, 자료형은 존재함.
//c. 객체를 생성할 때 new 키워드 사용하지 않음. ex)new String() --> String()
//d. 안전하게 null을 다룰 수 있는 문법을 제공함 **
//e. 코틀린은 함수형 언어. 즉, 함수를 객체처럼 생각해서 변수에 저장하고 파라미터로 넘겨주는 등의 작업이 가능.
//#. 프로그램의 시작함수 main함수가 반드시 있어야 함.
fun main(){
//1. 화면출력: println(),print()
print(10)
print(3.14)
print("hello")
println()
println(10)
println(10.5)
println(true)
println('a')
println("sam")
println("5+3")
// println(10,20) //error
var a:Int=10
println(a)
println("a")
var b:String= ("hello")
println(b)
println()
////////////////////////////////////////////////////////
//2. 자료형과 변수
//*코틀린 자료형의 종류
//1)기초 타입 : Blloean, Byte, Char, Short, Int, Long, Float, Double[코틀린은 모든 변수가 참조형]
//2)참조 타입 : String, Any(자바의 Object와 비슷 -최상위 클래스), Unit.......그 외 Kotlin APIs, JAVE APIs도 쓸수있음
//* 변수의 2가지 종류 : var, val
//2.1) var [값 변경이 가능한 변수]
var num:Int =10
println(num)
var num2:Double=3.14
println(num2)
var num3:Float
num3=5.24F
println(num3)
//변수이므로 값 변경 가능
num=20
num2=1.12
num3=4.67F
println(num)
println(num2)
println(num3)
//자료형이 고정되어 있기에 다른 자료형값을 대입 불가능
//ex)num=3.14 //ERROR
//num2= 50 코틀린은 에러 //자바는 됨
//그럼에도 혹시 강제로 대입하고 싶다면 형변환하면 됨 type cast [ . toXXX() ]- 기초타입만 가능함
num=3.14.toInt()
num2=50.toDouble()
println(num)
println(num2)
var s:String="hello"
println(s)
// var s2:String= String("Hello") //error - 문자열객체는 그냥 ""로만 생성함
s="nice"
println(s)
println()
//2.2) val [값 변경이 불가능한 변수 - 읽기전용변수라고 부르기도 함]
val n1:Int= 100
// n1= 200 //errorr
println(n1)
val n2:Boolean= true
// n2=false
println(n2)
println()
//##var, val 사용 팁 : 데이터를 저장하는 변수는 var [(ex) name,age,title..값을 가지는 것들], 객체를 참조하는 변수val[(ex)TextView tv, Button btn...]
//2.3) Any타입 - 코틀린의 최상위 자료형 [모든 객체를 참조할 수 있음]
var v:Any
v=10
println(v)
v=3.14
println(v)
v="hello"
println(v)
println()
// v=20 권장안함
// var w:Int=v //error
//2.4) null값에 대한 저장 가능 여부 - nullable variable
// var nn:Int =null //error [non nullable variable]
var nn:Int? =null //nullable variable
println(nn)
//nullable 변수를 사용할 때.. 문법
var ss:String?= "hello"
// println(ss.length) //자료형이 String? 이므로 null일 수도 있으니 .length의 오류가능성이 있기에 문법으로 막았음
//null safety 연산자 ?.
println(ss?.length) //nul이면 그냥 null이 출력됨.
println()
//2.5)자료형의 자동 추론기능.. [값에 따라 변수의 자료형이 결정됨]
var no= 10 //Int로 추론됨
println(no)
// no=3.14 //error -- 이미 Int로 추론되어 만들어진 변수임[정적타입언어] //파이썬 자바스크립트 [동적타입]
var sss="hello" //String으로 추론
println(sss)
// ### 화면출력의 format 만들기################################################
println("hello"+"kotlin") //문자열데이터는 + 결합연산자됨
//숫자타입은 String과 결합 안될 수도 있음.
// println(10+"aaa") //errror
println("aaa"+10) //ok "aaa10"
//즉 결합연산의 시작은 반드시 문자열!!
//연습
var nn1 =50 //Int
var nn2=30 //Int
println(""+nn1+"+"+"="+(nn1+nn2)) //"50 + 30=80" 이 포멧으로 출력하기
println(nn1.toString()+"+"+"="+(nn1+nn2))
//위 2가지 모두 가독성 떨어짐. .
println("$nn1+$nn2= ${nn1+nn2}")
//이렇게 $변수명을 사용하는 것을 [문자열 탬플릿] 이라고 부름
var name="sam"
var age=20
println("이름: $name \n나이 : $age")
}
fun main(){
//3. 연산자 - 자바와 거의 같음.
println(10+3.14)
//숫자가 아닌 자료형과는 덧셈 불가
// println(10+true) //error
// println(10+'A')//error - Char은 Number타입이 아님
//is 연산자
var a:Any
a=10
a="sam"
if (a is Int) println("a는 Int형 값을 저장하고 있음")
if (a is String) println("a는 String형 값을 저장하고 있음")
//is의 조금 특별한 기능
class Person{
var name:String="sam"
var age=20
}
var p:Person=Person()
println(p.name)
var obj:Any
obj=Person()
// println(obj.name) //편집기에서 name멤버변수의 존재를 모름.. 되긴 됨.
if (obj is Person){ //별도의 형변환 없어도 ..조건이 true이기에 편집기로 person임을 인식함.
println(obj.name)
}
//비트 연산자 없어짐. [& | ~ ^] && || ! 이건됨
//대신 비트연산 키워드가 등장 and, or
// println(7&5)
println(7 and 5)
println()
//4. 제어문은 다소 많이 다름
//코틀린의 제어문 종류 : if, when, while, for [switch 가 없어짐 ==when으로 대체됨]
//4.1) if와 삼항연산자의 결합
// var s= (10>5)? "hello" :"nice" //삼항연산자 문법이 없어짐
var s=if (10>5) "hello" else "nice"
//코틀린 if의 특징 - 조건에 따른 코드결과값을 대입할 수 있음.
s=if (10>5){ //값이 여러개면 마지막값이 결과값
"aaa"
"sss"
}else{
"bbb"
}
println(s)
println()
//이런식으로 단순히 조건에 대한 코드만 실행하지 않고 마치 결과값을 주는 식 같은 문법이어서 ..
//그래서 코틀린에서는 if제어문이라고 부르지 않고 [if 표현식]이라 부름
//4.2) when (switch문을 대체함)
var h:Any? =null
//switch(h){} //문법이 없음
var n:Int=30
h=20
when(h){
10 -> println("aaa")
20-> {
println("bbb")
println(".............")
}
"hello"-> println("ddddd")
true-> println("eee")
n-> println("n변수와 같은 값")
40,50-> println("fff")
else->{
println("어떤 값과도 같지 않음")
}
}
//when도 if문처럼 표현식임. 즉, 값을 결과로 대입할 수 있따는 것임.
h=200
var result= when(h){
10->"hello"
20->"nice"
else->{
println("else")
"bad"
}
}
println(result)
println()
when(h){
is Int-> println("h의 값은 정수")
is Double-> println("h의 값은 실수")
}
//when의 경우값에 부등호를 이용한 범위지정도 가능함
var score=85
when{
// score>=90 && score<=100 -> println("A학점")
// .. 스프레이드연산자
score in 90.. 100-> println("A학점")
score>=80 -> println("B학점")
score>=70 -> println("C학점")
score>=60 -> println("D학점")
else -> println("F학점")
}
println()
//4.3)반복문 -while은 똑같음
//for문은 완전히 다름
// for (int i=0; i<5; i++){} error
//0부터 5까지 6번 반복
for (i in 0..5){
println(i)
}
println()
for (i in 3..10){
println(i)
}
println()
//마지막 숫자를 포함하지 않는 반복문
for (i in 0 until 10){ //0~9
println(i)
}
println()
//2씩 증가
for (a in 0..10 step 2){
println(a)
}
println()
//감소하기
for (n in 10 downTo 0){
println(n)
}
println()
//2씩 감소
for (n in 10 downTo 0 step 2){
println(n)
}
println()
}