231207 TIL

2023. 12. 7. 20:53· 왕초보일지

 

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
'왕초보일지' 카테고리의 다른 글
  • 231211 TIL
  • 231208 TIL
  • 231206 TIL kotlin 접근제한자 지연초기화 예외처리 등등
  • 231205 TIL
다시은
다시은
🔥
다시은
재은로그
다시은
전체
오늘
어제
  • 분류 전체보기 (127)
    • 코딩테스트 (40)
    • Language (2)
      • JAVA (2)
      • Kotlin (0)
      • TypeScript (0)
    • SQL (1)
    • 인프라 (1)
    • 왕초보일지 (77)
    • 회고 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 스프레드시트
  • googleapis
  • Kotlin
  • sql
  • mysql
  • 문자열변환
  • SQL문법

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
다시은
231207 TIL
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.