변수에 is 자료형을 붙이면, 자료형을 검사하고 true / false를 뱉습니다
xxx.toInt()
xxx.toDouble()
변수의 자료형을 변환하여 반환시킵니다
잘못된 입력에 대비해 컴파일 에러 대신 널을 반환시킬 수도 있습니다
파라미터의 String을 분석해 Int로 만들어주는 메서드입니다.
.toInt() 와 완전히 동일한 기능의 java 코드입니다
mutableListOf< Int >(1,2,3,4,5)
var 학생명부 = mutableListOf<Students>()
학생명부는 Students 클래스의 인스턴스만 등록받습니다
var 학생명부 = mutableListOf<Students>( Students(지윤, 3, 2), Students(병철, 1, 5) )
listOf의 괄호 ( ) 속에 "클래스(파라미터)"들을 언급하면,
학생명부.add( Students(지윤, 3, 2) )
.add ( ) 를 사용해 인스턴스리스트에 새로운 인스턴스를 생성, 등록할 수 있습니다
편의상 클래스의 파라미터를 name으로만 설정하고,
리스트.add(클래스(name)) 으로 인스턴스를 생성한 다음
천천히 나머지 자료를 채워가는 것이 가독성이 좋겠습니다
Animal - Dog 처럼 두 클래스가 서로 상속관계에 있을 때,
Animal 부모클래스 자료형의 변수/리스트에 - Dog 자식클래스를 등록할 수 있습니다
이렇게 자식클래스를 부모클래스 자료형에 대입하는 것을
[업캐스팅]이라 하고, 논리적으로 문제가 없습니다
자식클래스는 부모클래스의 모든 프로퍼티/메서드를 자유롭게 사용할 수 있기 때문에
AnimalList[3].animalSound()
처럼 부모클래스의 프로퍼티/메서드를 사용하는 것도 가능합니다
이 또한 [업캐스팅] 이라고 합니다
AnimalList[2].dogBark()
반대로 위와 같이 부모클래스 자료형에서 자식클래스 프로퍼티/메소드를 쓰는 상황은
[다운캐스팅]이라고 하는데, 이 경우 오류 가능성이 있습니다
클래스 소속이 "자식클래스"이면 문제가 없지만,
"부모클래스"이면 하위 메서드를 사용할 수 없기 때문에
if ( AnimalList[2] is Dog ){
AnimalList[2].dogBark()
}
if문에서 is 자료형을 사용해,
자식클래스 소속인 지 검사한 다음 [다운캐스팅] 메서드를 실행하는 것이 좋습니다
open class Students (name:String){
var name:String
init {
this.name = name
}
fun 자기소개 { -> println("저는 $name입니다") }
}
class MiddleStudents(name:String) :Students(name){
}
fun main(){
var 학생명부 = mutableListOf<Students>()
var name = readLine()!!.toString()
학생명부.add( MiddleStudents(name) as Students)
}
인스턴스 리스트 = <학생> 슈퍼클래스로 만들었어요
name을 입력받아서
인스턴스리스트에 <중학생> 서브클래스의 인스턴스를 .add() 합니다
as 슈퍼클래스
상속관계의 클래스이기 때문에, 슈퍼클래스 리스트에
서브클래스 인스턴스를 등록하는 것이 논리적으로 가능합니다.
이런 상황을 [업캐스팅] 이라 부르고, 이를 명시하기 위해 as를 붙입니다
학생명부[0].자기소개()
open class Student(){
}
class MiddleStudent():Student(){
fun 수학공부(){
}
}
class HighStudent():Student(){
fun 미적분공부(){
}
}
fun 공부시작 (학생:Student){
if (학생 is MiddleStudent){
수학공부()
} else if (학생 is HighStudent){
미적분공부()
}
}
fun main(){
var 민수 = MiddleStudent()
var 철현 = HighStudent()
공부시작(민수)
공부시작(철현)
}
클래스 바깥에서, 클래스에 속한 메서드를 생성할 수 있습니다
클래스는 수정하지 않고 페이지 내에서만 작동합니다
class UtilClass(){
var 프로퍼티 = 1
}
fun main(){
var util = UtilClass()
fun UtilClass.다섯배(xxx:Int):Int{
프로퍼티 = xxx
프로퍼티*5
}
util.다섯배(14)
}