iOS 프로그래밍기초 수업 6주차

도연·2022년 10월 10일
0
post-thumbnail

BMI 계산 결과 판정

let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m 
var body = "" 

if bmi >= 40 { 
 body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
 body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
 body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
 body = "정상"
} else {
 body = "저체중" 
}

print("BMI:\(bmi), 판정:\(body)")

Swift 문자열 서식(swift string format 자리수)

import Foundation
let weight = 60.0
let height = 170.0
let bmi = weight / (height*height*0.0001) // kg/m*m 
let shortenedBmi = String(format: "%.1f", bmi) 
var body = "" 
if bmi >= 40 { 
 body = "3단계 비만"
} else if bmi >= 30 && bmi < 40 {
 body = "2단계 비만"
} else if bmi >= 25 && bmi < 30 {
 body = "1단계 비만"
} else if bmi >= 18.5 && bmi < 25 {
 body = "정상"
} else {
 body = "저체중" 
}
print("BMI:\(shortenedBmi), 판정:\(body)")

BMI를 판정하는 calcBMI()함수 정의

import Foundation
func calcBMI(weight : Double, height : Double) -> String{
 let bmi = weight / (height*height*0.0001) // kg/m*m 
 let shortenedBmi = String(format: "%.1f", bmi) 
 var body = "" 

 if bmi >= 40{ 
  body = "3단계 비만"
 } else if bmi >= 30 && bmi < 40 {
   body = "2단계 비만"
 } else if bmi >= 25 && bmi < 30 {
   body = "1단계 비만"
 } else if bmi >= 18.5 && bmi < 25 {
   body = "정상"
 } else {
   body = "저체중" 
 }
 return "BMI:\(shortenedBmi), 판정:\(body)"
}

print(calcBMI(weight:62.5, height: 172.3))

if~else를 switch~case로

import Foundation
func calcBMI (weight : Double, height : Double) {  //Void형
 let bmi = weight / (height*height*0.0001) // kg/m*m 
 let shortenedBmi = String(format: "%.1f", bmi) 
 switch bmi {
   case 0.0..<18.5:
   print("BMI:\(shortenedBmi),판정:저체중")
   case 18.5..<25.0 :
   print("BMI:\(shortenedBmi),판정:정상")
   case 25.0..<30.0 :
   print("BMI:\(shortenedBmi),판정:1단계 비만")
   case 30.0..<40.0 :
   print("BMI:\(shortenedBmi),판정:2단계 비만")
   default :
   print("BMI:\(shortenedBmi),판정:3단계 비만") 
 }
}
calcBMI(weight:62.5, height: 172.3)

switch~case + 판정 결과 리턴하는 함수

import Foundation
func calcBMI(weight : Double, height : Double) -> String {
 let bmi = weight / (height*height*0.0001) // kg/m*m 
 let shortenedBmi = String(format: "%.1f", bmi) 
 var body = "" 
 switch bmi {
 case 0.0..<18.5:
 body = "저체중"
 case 18.5..<25.0:
 body = "정상"
 case 25.0..<30.0:
 body = "1단계 비만"
 case 30.0..<40.0 :
 body = "2단계 비만"
 default :
 body = "3단계 비만" 
 }
 return "BMI:\(shortenedBmi), 판정:\(body)"
}
print(calcBMI(weight:60.0, height: 170.0))

❗ 1급 객체(first class object) , 1급 시민(first class citizen)


first class object : (1)함수를 변수에 저장 가능

  • Swift는 함수를 데이터 타입처럼 처리할 수 있음

  • 다음과 같이 함수를 상수 또는 변수에 할당하는 것이 가능

    func inchesToFeet (inches: Float) -> Float {
    return inches * 0.0833333
    }

  • 함수를 호출하려면 원래의 함수 이름 대신에 상수 이름을 이용하여 호출 가능

    print(inchesToFeet(inches:10))
    print(toFeet(10)) //주의 : 매개변수명(inches:) 안씀


❗ (중요!) 함수 : 일급 객체 실습

func up(num: Int) -> Int {
   return num + 1
}
func down(num: Int) -> Int {
   return num - 1
}
let toUp = up        //1) 변수에 저장할 수 있다.
print(up(num:10))
print(toUp(10))
let toDown = down     //1) 변수에 저장할 수 있다.
print(down(num:10))
print(toDown(10))    
                      
func upDown(Fun: (Int) -> Int, value: Int) {  //2) 매개변수로 전달할 수 있다.
  
   let result = Fun(value)
   print("결과 = \(result)")
}
upDown(Fun:toUp, value: 10)   //toUp(10)
upDown(Fun:toDown, value: 10) //toDown(10)
func decideFun(x: Bool) -> (Int) -> Int {    //3) 리턴값으로 사용할 수 있다.           
             //매개변수형  리턴형이 함수형             
  if x {
    return toUp   
  } else {
    return toDown
  }
}
let r = decideFun(x:true) // let r = toUp
print(type(of:r))  //(Int) -> Int
print(r(10))  // toUp(10)
let r1 = decideFun(x:false) // let r = toUp
print(type(of:r1))  //(Int) -> Int
print(r1(10))  // toUp(10)

❗ 클로저(Closure)

클로저 표현식

  • 클로저 표현식은 독립적인 코드 블록
func add(x: Int, y: Int) -> Int { 
  return(x+y)
}
let add1 = {(x: Int, y: Int) -> Int in 
  return(x+y)
}
print(type(of:add1))

print(add(x:10,y:20))
print(add1(10,20))
// print(add1(x :10,y:20)로 쓸경우? error: closure expression is unused  


//
(Int, Int) -> Int
30
30

후행 클로저(trailing closure)

  • 클로저가 함수의 마지막 argument(인자)라면 마지막 매개변수명(cl)을 생략한 후 함수 소괄호 외부에 클로저를 작성

func someFun(cl: () -> Void) {

} 
// trailing closure를 사용 안하면 
someFun(cl: { 
  //closure’s body 
}) 
// trailing closure 사용 하면
someFun() { 
  //trailing closure's body goes here 
}

❗ (중요!) 클로저의 축약 표현들 : 과제(유사 예제 만들어 보기)

아래 코드를 단계별로 축약해보자( + 후행클로저 축약)

let add = {(val1: Int, val2: Int) -> Int  in
        return val1 + val2
}
var result = add(10, 20) 
//print(result)

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
// print(result)

result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int) -> Int  in
        return val1 + val2
})
print(result)

// 실행결과 : 30

1차축약

let add = {(val1: Int, val2: Int) -> Int  in
        return val1 + val2
}
var result = add(10, 20) 
//print(result)

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
//print(result)

result = math(x: 10, y: 20, cal: {(val1: Int, val2: Int)   in
        return val1 + val2
}) //리턴형 생략
print(result)

// 실행결과 : 30

후행클로저는?

result = math(x: 10, y: 20) {(val1: Int, val2: Int)  in
        return val1 + val2
} // trailing closure, 리턴형 생략
print(result)

2차축약

let add = {(val1: Int, val2: Int) -> Int  in
        return val1 + val2
}
var result = add(10, 20) 
//print(result)

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
//print(result)

result = math(x: 10, y: 20, cal: {
        return $0 + $1
}) //매개변수 생략하고 단축인자(shorthand argument name)사용
print(result)

// 실행결과 : 30

후행클로저는?

result = math(x: 10, y: 20) {
        return $0 + $1
} //trailing closure, 매개변수 생략하고 단축인자사용
print(result)

3차축약

let add = {(val1: Int, val2: Int) -> Int  in
        return val1 + val2
}
var result = add(10, 20) 
//print(result)

func math(x: Int, y: Int, cal: (Int, Int) -> Int) -> Int {
    return cal(x, y)
}
result = math(x: 10, y: 20, cal: add)
//print(result)

result = math(x: 10, y: 20, cal: {
         $0 + $1
}) //클로저에 리턴값이 있으면 마지막 줄을 리턴하므로 return생략 
print(result)

// 실행결과 : 30

후행클로저는?

result = math(x: 10, y: 20) { $0 + $1 } //return 생략
print(result)

❗ 클래스(class)

클래스 vs. 객체 vs. 인스턴스

클래스로부터 만들어진 객체를 인스턴스라 한다.

객체지향 용어 비교

Structures and Classes

https://docs.swift.org/swift-book/LanguageGuide/ClassesAndStructures.html


객체 인스턴스

  • 인스턴스(instance)
    • 실제로 메모리에 할당된 객체(object)
  • 소프트웨어 애플리케이션을 개발하는 데 사용되는, 쉽게 사용할 수 있으며 재사용할 수 있는 기능을 가진 모듈
  • 객체의 구성
    • 데이터 변수(data variable) or 속성(property)
    • 함수 or 메서드(method)

클래스란 무엇인가?

  • 청사진이나 설계도가 건물이 완성된 후의 모습을 나타내고 있는 것처럼 클래스(class)는 객체가 생성되었을 때 어떠한 모습을 보일 것인지를 정의

Swift 클래스 선언하기

  • 클래스의 기본 구조는 다음과 같다.

    class 새로운 클래스 이름 : 부모 클래스 {
    // 프로퍼티
    // 인스턴스 메서드
    // 타입(type) 메서드(클래스 메서드)
    }

  • 프로퍼티” 부분은 클래스 내에 포함되는 변수(var)와 상수(let)를 정의한다.
  • 인스턴스 메서드”는 객체가 호출하는 메서드를 정의한다.
  • 타입 메서드”는 클래스가 호출하는 메서드를 정의한다.

프로퍼티(property)

https://docs.swift.org/swift-book/LanguageGuide/Properties.html

클래스에 저장 프로퍼티(stored property) 추가하기

  • 프로퍼티는
    1. 초기값이 있거나
    2. init을 이용해서 초기화하거나
    3.옵셔널 변수(상수)로 선언(자동으로 nil로 초기화)
  • property는 저장 프로퍼티(stored property)과 계산 프로퍼티(computed property)

프로퍼티는 초기값이 있거나 옵셔널 변수(상수)로 선언

class Man{
var age : Int = 1 //stored property는 초기값이 있어야 함
var weight : Double = 3.5
}

class Man{
var age : Int? //stored property는 초기값이 있어야 함, nil
var weight : Double!
}

Method

https://docs.swift.org/swift-book/LanguageGuide/Methods.html

메서드 정의

  • 인스턴스(instance) 메서드, 클래스 또는 타입(class or type)메서드
  • 인스턴스 메서드는 인스턴스에서 동작

class Man{
var age : Int = 1
var weight : Double = 3.5
func display(){ //인스턴스 메서드
print("나이=(age), 몸무게=(weight)")
}
}

인스턴스 만들고 메서드와 프로퍼티 접근

class Man{
  var age : Int = 1
  var weight : Double = 3.5
  func display(){
   print("나이=\(age), 몸무게=\(weight)")
  }
}

var kim : Man = Man()
kim.display() //  인스턴스 메서드는 인스턴스가 호출
print(kim.age)

	출처:iOS프로그래밍기초 (22-2학기)한성현교수님 강의 내용 변형 및 요약 6주차
profile
초보개발자..ㅠ

0개의 댓글