본문 바로가기
백엔드 과정(2023)

코틀린 3주차

by Enzo.enzo 2023. 12. 10.

level 4 계산기

더보기

 

// Operation interface 정의
interface Operation {
    fun performOperation(num1: Double, num2: Double): Double
}

// 더하기 연산 클래스
class AddOperation : Operation {
    override fun performOperation(num1: Double, num2: Double): Double {
        return num1 + num2
    }
}

// 빼기 연산 클래스
class SubtractOperation : Operation {
    override fun performOperation(num1: Double, num2: Double): Double {
        return num1 - num2
    }
}

// 곱하기 연산 클래스
class MultiplyOperation : Operation {
    override fun performOperation(num1: Double, num2: Double): Double {
        return num1 * num2
    }
}

// 나누기 연산 클래스
class DivideOperation : Operation {
    override fun performOperation(num1: Double, num2: Double): Double {
        if (num2 != 0.0) {
            return num1 / num2
        } else {
            throw ArithmeticException("Error: 나누는 수는 0이 될 수 없습니다.")
        }
    }
}

// Calculator 클래스 정의
class Calculator(private val operation: Operation) {
    fun calculate(num1: Double, num2: Double): Double {
        return operation.performOperation(num1, num2)
    }
}

fun main() {
    val addOperation = AddOperation()
    val subtractOperation = SubtractOperation()
    val multiplyOperation = MultiplyOperation()
    val divideOperation = DivideOperation()

    // 더하기 연산 테스트
    val calculatorAdd = Calculator(addOperation)
    println("더하기 결과: ${calculatorAdd.calculate(5.0, 3.0)}")

    // 빼기 연산 테스트
    val calculatorSubtract = Calculator(subtractOperation)
    println("빼기 결과: ${calculatorSubtract.calculate(5.0, 3.0)}")

    // 곱하기 연산 테스트
    val calculatorMultiply = Calculator(multiplyOperation)
    println("곱하기 결과: ${calculatorMultiply.calculate(5.0, 3.0)}")

    // 나누기 연산 테스트
    val calculatorDivide = Calculator(divideOperation)
    println("나누기 결과: ${calculatorDivide.calculate(6.0, 3.0)}")
}

  • 메소드 설계

반환 자료형 Unit

fun main() {
    // displayInfo라는 이름의 메소드를 호출!
    displayInfo()
}

fun displayInfo() : Unit {
    println("오늘의 날씨는 화창합니다")
    println("오늘은 검정색을 조심하세요")
}

displayInfo 의 값을 main 에 반환할 필요가 없을 때

fun main() {
    var myMathScore = readLine()!!.toInt()
    
    var myRank = checkRank(myMathScore)  //메인함수에 체크랭크 불러옴> 가서 함수 실행>돌아와서 myRank 에 대입 
    println("나의 등급은 : ${myRank}")
}

fun checkRank(score:Int) : String {
		return when(score) {
			in 90..100 ->	return "A"
			in 80..89 -> return "B"
			in 70..79 -> return "C"
			else -> return "D"
		}
}
//    Kotlin 컨벤션을 따르지 않은 형태
//    if(score >= 90) {
//        return "A"
//    } else if(score >= 80) {
//        return "B"
//    } else if(score >= 70) {
//        return "C"
//    } else {
//        return "D"
//    }
// }

checkRank 의 값을 main 에 반환해야 하므로 String 이라는 자료형을 부과함

 

  • 클래스 설계
  1. 프로그램의 각 요소별 설계도라고 해석할 수 있어요
  2. 코틀린에서는 class 키워드를 활용해서 클래스를 만들어요
  3. 클래스에는 정보(프로퍼티)와 행위(메소드)를 작성해요
  4. 보통 하나의 파일은 한개의 클래스를 의미하지만, 하나의 파일안에 여러개의 클래스가 존재할 수도 있어요

Object Oriented Programming (OOP)

  • 클래스
  • 추상화
  • 캡슐화
  • 상속

다형성

  • 생성자의 활용

생성자로 클래스를 실체화 하여 메모리에 객체로서 저장.

 

주생성자

부생성자

주생성자는 한가지 생성자만

부생성자는 생성자 중 추가 생략 등 선택가능

 

  • 객체

마법사 생성

 

메인함수

캐릭터에 생성자를 줌. 불마법사/ red /180.2

magician one 에 캐릭터를 실행한 값을 대입

캐릭터 constructor 1 >3개의 값(부생성자)

캐릭터 constructor 2 >5개의 값 (부생성자)

캐릭터 constructor 2로 가서 불마법사/ red /180.2 의 값을 _name, _hair, _hight 와 매칭시킴

_name 을 name 으로 reassign

클래스 캐릭터에서 name,hair 등의 자료형을 정의함

magician one 의 이름은 불마법사, 헤어는 레드 , 하이트는 180.2가 됨

magician one 의 위치에서 fireBall 매서드 실행

 

 

fun main() {
		// 불마법사로 객체화
    var magicianOne = Character("불마법사", "red", 180.2)
		println("${magicianOne.name}의 머리색상은 ${magicianOne.hairColor}입니다")
		magicianOne.fireBall()

		// 냉마법사로 객체화
    var magicianTwo = Character("냉마법사", "blue", 162.2, 25, "여")
		println("${magicianTwo.name}의 머리색상은 ${magicianTwo.hairColor}이고 나이는 ${magicianTwo.age}입니다.")
		magicianTwo.fireBall()
}

class Character {
    var name:String = ""
    var hairColor:String = ""
    var height:Double = 0.0
    var age:Int = 0
    var gender:String = ""

    // 명시적 생성자 (Constructor)
    // _name, _hairColor, _height와 같이 생성자에 변수를 넘기는 경우에 사용함
    constructor(_name:String, _hairColor:String, _height:Double) {
        println("${_name}을 생성자로 넘겼어요")
        println("${_hairColor}를 생성자로 넘겼어요")
        println("${_height}를 생성자로 넘겼어요")
				name = _name
				hairColor = _hairColor
				height = _height
    }
    // _name, _hairColor, _height, _age, _gender와 같이 생성자에 변수를 넘기는 경우에 사용함
    constructor(_name:String, _hairColor:String, _height:Double, _age:Int, _gender:String) {
        println("${_name}을 생성자로 넘겼어요")
        println("${_hairColor}를 생성자로 넘겼어요")
        println("${_height}를 생성자로 넘겼어요")
        println("${_age}를 생성자로 넘겼어요")
        println("${_gender}를 생성자로 넘겼어요")

				name = _name
				hairColor = _hairColor
				height = _height
				age = _age
				gender = _gender
    }

    fun fireBall() {
        println("파이어볼!")
    }
    fun compositing(device1:String, device2:String): String {
        var device3 = device1 + device2
        println("새로운 무기인 ${device3}입니다")
        return device3
    }
}

 

 

질문

더보기

fun main() {
    // displayInfo라는 이름의 메소드를 호출!
    displayInfo()
}

fun displayInfo() : Unit {
    println("오늘의 날씨는 화창합니다")
    println("오늘은 검정색을 조심하세요")
}

같이 displaylnfo 에는 위치를 안적어도 실행 됐는데 fireball 은 위치를 안적으면 실행불가

var 이 끝난 뒤여서 ?

 

답  fun main() 을 제외한 모든 메서드는 클래스 밑에 속한다

fireball은 character 클래스 밑에 속하는 매서드이므로 

var magicianOne = Character("불마법사", "red", 180.2)

에서 클래스의 변수명을 magicianOne 으로 설정, 변수로 fireball 을 불러올 수 있게 됨

 

'백엔드 과정(2023)' 카테고리의 다른 글

코틀린 4주차  (1) 2023.12.21
코틀린 3주차-2  (0) 2023.12.13
코틀린 2주차 -2  (1) 2023.12.08
코틀린 2주차  (2) 2023.12.08
미니 프로젝트 . 팀별 홈페이지 제작  (2) 2023.12.05