처음부터 차근차근

Swift 문법 정리 4 본문

프로그래밍/Swift

Swift 문법 정리 4

_soyoung 2021. 9. 30. 21:15
반응형
1급 객체(first class object)

 

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

1급 객체란, 아래의 조건을 만족하는 객체를 말한다.

<1급 객체의 조건>

1. 변수에 저장할 수 있다.
2. 매개변수로 전달할 수 있다.
3. 리턴 값으로 사용할 수 있다.

 

그래서 Swift의 함수는 1급 객체이다.

 

 

 

 

 

함수 예시

 

1. 변수에 저장할 수 있다.

func convertMlToL(ml: Double) -> Double { 
    return ml / 1000.0 
} 
let toL = convertMlToL // 변수에 함수를 대입 : 1급 객체 조건 충족 
print("\(convertMlToL(ml: 12))L") 
print("\(toL(12))L") // 매개변수명(ml:)을 쓰지 않는다. 
//결과 : 0.012L 
//0.012L

변수에 함수를 대입하면 호출할 때 매개변수 명을 적지 않아도 된다.

 

2. 매개변수로 전달할 수 있다.

func convertMlToL(ml: Double) -> Double { 
    return ml / 1000.0 
} 
func executeFunc(funcToRun: (Double) -> Double, inputMl: Double) { // 함수를 매개변수로 사용 : 1급 객체 조건 충족 
    print(funcToRun(inputMl)) 
} 
let toL = convertMlToL // 변수에 함수를 대입 
executeFunc(funcToRun: toL, inputMl: 12) 
//결과 : 0.012

 

3. 리턴 값으로 사용할 수 있다.

func convertMlToL(ml: Double) -> Double { 
    return ml / 1000.0 
} 
func convertMlToMicroliter(ml: Double) -> Double { 
    return ml * 1000.0 
}  
func chooseFunc(funcName: String) -> (Double) -> Double { // 함수를 리턴값으로 사용 : 1급 객체 조건 충족 
    if funcName == "toL" { 
        return convertMlToL
    } else { // toMicroL or another 
        return convertMlToMicroliter 
    } 
} 
func executeFunc(funcToRun: (Double) -> Double, inputMl: Double) { // 함수를 매개변수로 사용 
    print(funcToRun(inputMl)) 
} 

executeFunc(funcToRun: chooseFunc(funcName: "toL"), inputMl: 12) 
executeFunc(funcToRun: chooseFunc(funcName: "toMicroL"), inputMl: 12) 
//결과 : 0.012 
//12000.0

 

 

 

 

 

클로저(Closure)

 

클로저(Closure)란, 익명함수다.

함수를 클로저로 구현하면 코드의 가독성이 좋아지고, 깔끔하게 정리할 수 있다.

 

<클로저 구현 방법>

func sub(num1: Int, num2: Int) -> Int {
    return num1 - num2 
}

// sub()함수 closure로 구현
let subtract = {(num1: Int, num2: Int) -> Int in 
    return num1 - num2 
} 
print(subtract(3, 1)) // 주의 : 매개변수 명 적으면 안됨!!!

func sub을 지우고 앞에 { 를 쓴다.

그리고 원래 { 가 있던 자리에는 in을 써준다.

 

 

 

 

후행 클로저(trailing closure)

 

후행 클로저란, 함수를 호출할 때함수의 마지막 매개변수가 클로저(closure)라면 마지막 매개변수 명을 생략하고 함수 소괄호 외부에 클로저를 구현하는 것이다.

 

<후행 클로저 구현 방법>

func sub(num: Int) -> Int {
    return num - 1
}
func executeFunc(param: Int, inputFunc: (Int) -> Int) -> Int {
    return inputFunc(param)
}

// 함수 호출
// 기본
result = executeFunc(param: 10, inputFunc: sub)

// closure
result = executeFunc(param: 10, inputFunc: {(num: Int) -> Int in
    return num - 1
})

// trailing closure
result = executeFunc(param: 10) {(num: Int) -> Int in
    return num - 1
}

마지막 매개변수명 , inputFunc :를 지우고 )를 쓴다.

그리고 명령줄 맨 끝에 있는 )를 지워준다.

 

 

 

 

class

 

class란, 객체의 청사진이다.

 

<class 구현 방법>

class Animal {
    // 프로퍼티
    // 인스턴스 메서드	
    // 타입 메서드
}

프로퍼티 : 클래스 내의 상수, 변수

인스턴스 메서드 : 객체가 호출하는 메서드

클래스(타입) 메서드 : 클래스가 호출하는 메서드

 

 

 

 

프로퍼티(property)

 

프로퍼티란, 클래스 안에서 선언되는 변수나 상수이다.

  1. 저장 프로퍼티(Stored Properties)
  2. 연산(계산) 프로퍼티(Computed Properties)

이렇게 크게 2가지가 존재하는데 저장 프로퍼티에 대해서 설명하겠다.

 

 

 

 

저장 프로퍼티(Stored Properties)

 

저장 프로퍼티란, 가장 일반적인 프로퍼티이다.

클래스 내부에서 값을 저장할 때 사용한다.

 

class Animal() {
    var name = "lulu" // 꼭 초기화를 해줘야 함
    var age : Int? // 옵셔널로 선언하면 초기화 안해줘도 됨(자동으로 nil 초기화)
}

 

저장 프로퍼티는 선언할 때

1. 직접 초기화를 해주거나

2. 옵셔널 변수로 선언하거나

3. init을 통해 초기화 해야한다.

 

 

 

 

메서드(Method)

 

메서드란 클래스 내부에 정의된 함수이다.

  1. 인스턴스 메서드(instance method)
  2. 클래스(타입) 메서드(class method or type method)

이렇게 2가지가 존재하는데, 인스턴스 메서드에 대해 설명하겠다.

 

 

 

 

인스턴스 메서드

 

인스턴스 메서드란, 인스턴스(객체)가 호출하는 메서드이다.

 

class Animal() {
    var name = "lulu"
    var age : Int?
    
    func cry() { // 인스턴스 메서드
        print("aaaah")
    }
}
var animal : Animal = Animal() // 아래에서 설명
animal.cry() // Animal 클래스 인스턴스가 인스턴스 메서드 호출

 

 

 

 

인스턴스

 

인스턴스란, 클래스 객체이다.

 

var 변수명 : 클래스명 = 클래스명()

이렇게 생성한다.

클래스명()은 생성자를 뜻하고,

: 클래스명 은 생략해도 된다.

 

예시

class Animal() {
    var name = "lulu"
    var age : Int?
   
    func cry() { 
        print("aaaah")
    }
}
var animal : Animal = Animal() // 인스턴스
animal.cry()
print(animal.name) // 인스턴스가 Animal class의 name 접근
print(animal.age) // nil

 

 

 

 

 

 

출처 : iOS프로그래밍기초(21-2학기)한성현교수 강의 내용 변형 및 요약

반응형

'프로그래밍 > Swift' 카테고리의 다른 글

Swift 문법 정리 5  (0) 2021.10.08
Swift 실습 5  (0) 2021.10.07
Switf 실습 4  (0) 2021.09.30
Swift 문법 정리 3  (0) 2021.09.26
Swift 실습 3  (0) 2021.09.25
Comments