iOS 프로그래밍 기초

[iOS 프로그래밍 기초] 4주차

kimbh 2024. 9. 26. 16:51

함수와 메소드의 차이점에 대해서 알아보도록 하겠습니다.

 

그전에 매개변수(parameter)와 인자(agument)에 대해서 알아야 하는데요.

 

(1) 매개변수(parameter)는 함수의 정의되는 변수를 의미하고,

 

(2) 인자(agument)는 함수의 호출 할 때 전달하는 값을 의미합니다.

 

1. 함수 

함수란  

 

func sayHello(){ // 스위프트에서 함수를 정의하는 방법 -> 이후에 리턴형을 선언해야함.
    //Void는 매개변수가 없는 함수는 -> Void는 생략 가능.
    print("hi")
    
}

sayHello()

 

해당 소스에서 문제는 인자 값을 10,20으로만 호출 한 상태이기 때문에 문제가 생겼습니다.

해결하는 방법은 x : 10, y : 20을 바꾸면 해당 소스에 문제점을 해결 할 수 있습니다.

 

func add(x : Int, y : Int) -> Int{
    return (x+y)
}
print(add(x : 10,y : 20)) // 함수를 바로 사용하는 방법(안좋은 방법임)
var b = add(x : 10, y : 20) // 함수를 변수에 저장해서 사용하는 방법(좋은 방법임)
print(b)

 

함수에서는 x : / y: 는 레이블이라고 부른다 즉, x : 는 x 레이블, y : 는 y 레이블이라고 부른다.

 

print(type(of: x)) // 시험문제에 나옴. 해당 변수가 어떤 자료형인지 알려주는 함수.

 

func add(x : Int, y : Int) -> Int{
    return (x+y)
}
var x : Int // 해당 변수를 Int형으로 바꿈
x = add(x : 10, y : 20) // 함수를 변수에 저장해서 사용하는 방법(좋은 방법임)
print(x)

print(type(of: x)) // 시험문제에 나옴.
print(type(of: add))

 

 

 

func sayHello(){ // 스위프트에서 함수를 정의하는 방법 -> 이후에 리턴형을 선언해야함.
    //Void는 매개변수가 없는 함수는 -> Void는 생략 가능.
   print("hi")

}
print(type(of: sayHello))

 

출처 : iOS 프로그래밍 기초 - smileHan

first 부분은 아규멘트 레이블(외부) , x 부분은 파라메터 이름(내부)이라고 부른다.

x : Int인 부분은 아규멘트 레이블을 생략하는 부분입니다. 

 

 

func add(_ x : Int, _ y : Int) -> Int{ // agument lable을 생략한 부분.
    return (x+y)
}
var x : Int // 해당 변수를 Int형으로 바꿈
x = add(10, 20) // 함수를 변수에 저장해서 사용하는 방법(좋은 방법임)
print(x)

아규멘트 레이블을 생략한 경우 함수를 호출할 때 값만 집어넣으면 된다(비추천)

 

func add(_ x : Int, _ y : Int) -> Int{
    print(#function) // 시험에 자주 나옴
    return (x+y)
}
var x : Int // 해당 변수를 Int형으로 바꿈
x = add(10, 20)
print(x)

 

외부 매개 변수명을 콜론( : )으로 나열하는 방법이 #function 입니다.

출력하게되면

 

func add(x : Int, y : Int) -> Int{
    print(#function) // 시험에 자주 나옴
    return (x+y)
}
var x : Int // 해당 변수를 Int형으로 바꿈
x = add(x: 10, y: 20)
print(x)

 

 

func add(first x : Int, second y : Int) -> Int{
    print(#function) // 시험에 자주 나옴
    return (x+y)
}
var x : Int // 해당 변수를 Int형으로 바꿈
x = add(first : 10,second : 20)
print(x)

위에 사진 2개 처럼 계속해서 달라지는것이 함수 명이다.

스위프트 함수명은 add()가 아니라 그 안에 있는 매개변수 값, 혹은 인자 값안에 있는 외부 매개변수명을 함수 명이라고 합니다.

first: / second: 등이 함수 이름이라고 합니다.

 

 

(_ tableView: UITableView, numberOfRowsInSection section : Int) -> Int에서

함수의 이름과 자료형은 무엇일까? 

자료형으로는 (UITableView, Int)이 자료형이라는것을 알 수 있고,

(_:numberOfRowsInSection:)이 함수 이름(외부명)이라는것을 알 수 있습니다. ( 이 부분 시험에 나올 수 있다. )

 

(guard-let)

 

var x = 1
while true {
    if x > 4 { break }
  print(x)
  x = x + 1
}

if문은 참일 때 실행하라 라는 의미의 소스코드입니다.

var x = 1
while true {
  guard x < 5 else { break }//조건(x<5)이 거짓일 때 실행(break)
  print(x) //1 2 3 4, 조건(x<5)이 참일 때 실행
  x = x + 1
}

guard는  if문과 반대로 x보다 5가 작을때 break가 실행이 되는것 즉 거짓인 경우 멈추는 코드입니다.

return , breadk, continue, throw등 제어문을 사용하고, 함수 내부에 있을 때 빠져나올 수 있도록 하는 방법입니다.

 

(guard let ~ else문)

 

// guard let 문을 사용한 함수
func multiplyByTen(value: Int?) {
    guard let number = value else {
        print("nil")
        return}
    print(number * 10)
}

// if let 문을 사용한 함수
func multiplyByTenWithIf(value: Int?) {
    if let number = value {
        print(number * 10)
    } else {
        print("nil")
    }
}

// 함수 호출
multiplyByTen(value: 3)    // 30
multiplyByTen(value: nil)  // nil
multiplyByTen(value: 10)   // 100

multiplyByTenWithIf(value: 3)    // 30
multiplyByTenWithIf(value: nil)  // nil
multiplyByTenWithIf(value: 10)   // 100

해당 소스에서 if문은 참인 경우에 number변수가 10곱해서 출력을 하게 되는 소스인 반면에,

guard - else문은 참이 아닌경우에 nil의 값을 먼저 출력하게 되고 else문까지 가지않도록 중단시키는 점이다. 

위에서도 설명했다 싶이  가드문을 사용하는 이유는 가독성 때문이 큽니다.

 

(디폴트 매개변수(아규멘트) 정의하기)

아규멘트로 전달하는 값이 없는 경우에 디폴트 매개변수를 사용하는것을 말합니다.

 

(가변 매개변수)

func displayStrings(strings: String...)
{
  for string in strings {
    print(string)
  }
}
displayStrings(strings: "일", "이", "삼", "사")  
displayStrings(strings: "one", "two")

 

var myValue = 10
func doubleValue (value: inout Int) -> Int {
  value += value
  return(value)
}
print(myValue)
print(doubleValue(value : &myValue))  //출력 값? 레포트
print(myValue)

스위프트에서는 변수를 넘겨받고 나서 값을 변경할려면 inout을 사용해야합니다.

inout을 사용하는것으로 끝이나는게 아닌, &를 붙여서 해당 변수의 주소로 가서 값을 출력시킬 수 있다.

 

(문자열 서식)

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단계 비만")
 }
}

해당 소스를 출력할려면 Foundation을 import를 해야됩니다.