fun main() {
println("계산할 첫번째 값을 넣으세요")
var num1 = readLine()?.toDoubleOrNull() ?:0.0 // null을 입력받은 경우 0.0반환
println("계산할 두번째 값을 넣으세요")
var num2 = readLine()?.toDoubleOrNull() ?:0.0
println("이용할 연산자의 번호를 입력하세요.")
println("[1]덧셈 [2]뺄셈 [3]곱셈 [4]나눗셈 [5]종료")
var operator = readLine()?.toIntOrNull() ?:5 //연산자 선택 안 할 경우 덧셈 수행
// 변수의 타입을 AbstractOperation4로 선언 -> 이 클래스를 상속한 클래스를 변수에 할당할 수 있다.
var abstract : AbstractOperation4 = when (operator) {
1 -> AddOperation4()
2 -> SubstractOperation4()
3 -> MultiplyOperation4()
4 -> DivideOperation4()
else -> AddOperation4()
}
//Calculator4 클래스에 추상클래스타입의 객체를 받는 생성자가 있기 때문에 변수 abstract를 받을 수 있다.
val answer = Calculator4(abstract)
println("${num1}과 ${num2}의 연산결과는 ${answer.operation(num1, num2)}")
}
계산기를 튜터님이 해주신 예시대로 고쳐보았다.
하는건 하겠는데 문제는 추상클래스에 대한 이해다.
처음 만들 때 추상 클래스 없이 계산기 클래스를 상속받은 연산 클래스들로 끝냈었는데
추상클래스가 등장해서 중간에 끼워넣다보니까 추상클래스의 필요성이 와닿지 않아 이해하는데 힘들었다.
클래스의 생성자에 변수를 선언할 수 있고 클래스를 넣어줄 수 도 있으며
변수의 타입을 클래스로 명시할 수 있다는 것도 알게되었다.
남궁석의 자바정석 강의를 통해 추상 클래스에 대해 공부했다.
https://www.youtube.com/watch?v=9VgkoVFZvyk
추상화 메서드 : 몸통이 없는 미완성의 메소드 , 필요하지만 자손마다 다르게 구현될 것으로 예상되는 경우
추상화 클래스 : 추상화 메서드를 가진 클래스
추상화 클래스는 미완성 설계도이기 때문에 인스턴스 생성 불가
이 클래스는 다른 클래스 작성에 도움을 주기 위한 것이다.
미완성 설계도
abstract class AbstractOperation4() {
abstract fun operation(num1: Double, num2 : Double) : Double
}
추상 클래스를 상속받아서 만든 완성 설계도
class AddOperation4():AbstractOperation4() {
override fun operation(num1:Double, num2:Double) : Double{
return (num1 + num2)
}
}
추상클래스를 상속받아서 추상 메서드를 구현한다 = 추상메서드 몸통 만들기!
여기서 메서드는 몸통을 만들었으니 더이상 추상 메서드가 아니다
생성자
: 객체를 생성하기 위한 함수이다. (객체가 생성될 때 한번만 호출되는 메소드)
주생성자가 하고 있는 일
1. 기본적으로 생성자의 역할
2. 프로퍼티도 정의할 수 있다.
3. 생성자에서 하는 일 중에 "외부로부터 받아온 데이터를 프로퍼티에 옮겨담는 일"
4. init {}이 생성자에서 하는 일 중에 "객체가 생성될 때 해야할 로직들"을 처리해준다.
class 이름 constructor() {...}
우리가 class 선언할 때 constructor 는 주로 생략되어있는 부분이다
1. 주생성자
class calculator(val num1 : Int) { //주생성자에서 프로퍼티 정의, 받은 값을 프로퍼티에 할당
init {
println("객체 생성!") //객체가 생성되는 시점에 하고싶은 일
}
2. 부생성자
class calculator() {
var num1 : Int = 0 //프로퍼티 정의
constructor(num1 : Int) { //생성자 만들어서 하나 받고
this.num1 = num1 //받은 값을 프로퍼티에 할당
println("객체 생성!") //객체가 생성되는 시점에 하고 싶은 일
}
'왕초보일지' 카테고리의 다른 글
231211 TIL (0) | 2023.12.11 |
---|---|
231208 TIL (1) | 2023.12.08 |
231206 TIL kotlin 접근제한자 지연초기화 예외처리 등등 (1) | 2023.12.06 |
231205 TIL (0) | 2023.12.05 |
231204 TIL (0) | 2023.12.04 |