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 이라는 자료형을 부과함
- 클래스 설계
- 프로그램의 각 요소별 설계도라고 해석할 수 있어요
- 코틀린에서는 class 키워드를 활용해서 클래스를 만들어요
- 클래스에는 정보(프로퍼티)와 행위(메소드)를 작성해요
- 보통 하나의 파일은 한개의 클래스를 의미하지만, 하나의 파일안에 여러개의 클래스가 존재할 수도 있어요
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 |