Kotlin 문법 종합반 #4上. class 자료형과 업캐스팅

·2024년 6월 13일
0

자료형 관련 기능

xxx is 자료형

변수에 is 자료형을 붙이면, 자료형을 검사하고 true / false를 뱉습니다

xxx.to자료형()

xxx.toInt()
xxx.toDouble()

변수의 자료형을 변환하여 반환시킵니다

xxx.to자료형OrNull()

잘못된 입력에 대비해 컴파일 에러 대신 널을 반환시킬 수도 있습니다

Integer.parseInt(xxx)

파라미터의 String을 분석해 Int로 만들어주는 메서드입니다.
.toInt() 와 완전히 동일한 기능의 java 코드입니다


리스트 - 클래스의 연동

리스트 자료형 명시는 listOf< ... >로,

mutableListOf< Int >(1,2,3,4,5)

인스턴스 리스트는 listOf< 클래스이름 >

var 학생명부 = mutableListOf<Students>()

학생명부는 Students 클래스의 인스턴스만 등록받습니다

var 학생명부 = mutableListOf<Students>( Students(지윤, 3, 2), Students(병철, 1, 5) )

listOf의 괄호 ( ) 속에 "클래스(파라미터)"들을 언급하면,

  • Students 클래스의 새 인스턴스를 생성하고,
  • 학생명부 list에도 그 인스턴스를 등록하게 됩니다

xxx.add( 클래스이름( 파라미터 ) )

학생명부.add(  Students(지윤, 3, 2)  )

.add ( ) 를 사용해 인스턴스리스트에 새로운 인스턴스를 생성, 등록할 수 있습니다

편의상 클래스의 파라미터를 name으로만 설정하고,
리스트.add(클래스(name)) 으로 인스턴스를 생성한 다음
천천히 나머지 자료를 채워가는 것이 가독성이 좋겠습니다


업캐스팅, 다운캐스팅

업캐스팅

Animal - Dog 처럼 두 클래스가 서로 상속관계에 있을 때,
Animal 부모클래스 자료형의 변수/리스트에 - Dog 자식클래스를 등록할 수 있습니다

이렇게 자식클래스를 부모클래스 자료형에 대입하는 것을
[업캐스팅]이라 하고, 논리적으로 문제가 없습니다

자식클래스는 부모클래스의 모든 프로퍼티/메서드를 자유롭게 사용할 수 있기 때문에

AnimalList[3].animalSound() 

처럼 부모클래스의 프로퍼티/메서드를 사용하는 것도 가능합니다
이 또한 [업캐스팅] 이라고 합니다

다운캐스팅

AnimalList[2].dogBark() 

반대로 위와 같이 부모클래스 자료형에서 자식클래스 프로퍼티/메소드를 쓰는 상황은
[다운캐스팅]이라고 하는데, 이 경우 오류 가능성이 있습니다

클래스 소속이 "자식클래스"이면 문제가 없지만,
"부모클래스"이면 하위 메서드를 사용할 수 없기 때문에

is 자료형 으로 클래스 확인

if ( AnimalList[2] is Dog ){
	AnimalList[2].dogBark() 
}

if문에서 is 자료형을 사용해,
자식클래스 소속인 지 검사한 다음 [다운캐스팅] 메서드를 실행하는 것이 좋습니다


예시1. 개념 정리

(예시) 상속 클래스 구성

open class Students (name:String){
	var name:String
    
    init {
    this.name = name
    }
    
    fun 자기소개 { -> println("저는 $name입니다") }
    
}

class MiddleStudents(name:String) :Students(name){
}
  • "학생" 오픈클래스는 name을 파라미터로 받아서
    → var/init으로 프로퍼티에 저장합니다
  • 이를 상속받은 "중학생" 서브클래스는 name을 파라미터로 받아서,
    → "학생" 슈퍼클래스의 name에 넘겨줍니다

[업캐스팅] 슈퍼클래스 리스트에, 서브클래스 인스턴스 등록이 가능합니다

fun main(){

  var 학생명부 = mutableListOf<Students>()
  var name = readLine()!!.toString()
  학생명부.add( MiddleStudents(name) as Students)
}
  • 인스턴스 리스트 = <학생> 슈퍼클래스로 만들었어요

  • name을 입력받아서

  • 인스턴스리스트에 <중학생> 서브클래스의 인스턴스를 .add() 합니다

  • as 슈퍼클래스
    상속관계의 클래스이기 때문에, 슈퍼클래스 리스트에
    서브클래스 인스턴스를 등록하는 것이 논리적으로 가능합니다.
    이런 상황을 [업캐스팅] 이라 부르고, 이를 명시하기 위해 as를 붙입니다

  학생명부[0].자기소개()
  • 인스턴스리스트에 [index]를 붙여서 인스턴스를 찾아내고
    → .자기소개() 메서드를 실행했습니다

예시2. 업캐스팅 if 다운캐스팅

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)
}
profile
디자이너의 개발 창업 도전기

0개의 댓글