코드네임 :

🍏 함수와 클로저, 클래스, 구조체 본문

👥Club/🍀UMC🍀

🍏 함수와 클로저, 클래스, 구조체

비엔 Vien 2025. 4. 6. 19:27

함수

: 함수를 정의할 때는 파라미터와 반환 타입을 명시

func greet(person: String) -> String {
    let greeting = "Hello, " + person + "!"
    return greeting
}

 greet 함수는 사람의 이름을 입력으로 받아 그 사람의 인사말을 반환합니다.

이것을 수행하기 위해 person 이라 불리는 String 값인 하나의 파라미터와 인사말을 포함한 String 반환 타입을 정의해주고 있네요!

위 함수를 호출하기 위해서는 어떻게 해야 할까요?

print(greet(person: "Anna")) // Prints "Hello, Anna!"
print(greet(person: "Brian")) // Prints "Hello, Brian!"
파라미터에 String 타입의 인자를 넣어 함수를 실행하고, 반환 값으로 각각 String 타입의 값을 받아 print해주고 있는 것을 볼 수 있습니다.

 

+

반환값은 무시될 수 있지만 함수는 항상 값을 반환합니다.

(return을 안쓰는 것은 반환을 하지 않는다는게 아니라 반환값이 void일 뿐) 

 

아니 여기 근데 너무 당연한 소리를 하는디??

넘어가자~


 

클로저(Closure)

클로저 (Closures) 는 코드에서 주변에 전달과 사용할 수 있는 자체 포함된 기능 블럭입니다. Swift의 클로저는 다른 프로그래밍 언어에서 클로저, 익명 함수, 람다, 그리고 블럭과 유사합니다.

클로저는 정의된 컨텍스트에서 모든 상수와 변수에 대한 참조를 캡처하고 저장할 수 있습니다. 이러한 상수와 변수를 폐쇄 (closing over) 라고 합니다. Swift는 캡처의 모든 메모리 관리를 처리합니다.

클로저는 일급 객체로서, 변수나 상수 등으로 저장 가능한 형태를 뜻합니다.

일급 객체는 객체를 인자 값, 반환 값으로 사용 및 전달할 수 있어야 하고 데이터 구조 안에 저장할 수 있어야 합니다.

위에서 살펴본 함수는 클로저의 한 케이스라고 볼 수 있는데요! 클로저가 함수보다 더 큰 범위라고 생각하시면 좋을 것 같습니다.

조금 더 구분이 편하도록 설명해드리자면!

func 키워드를 사용하고 + 이름이 있다 → 클로저이면서 함수

func 키워드를 사용하지 않고 + 이름이 없다 → 클로저

편의 상 위의 경우를 함수, 밑의 경우를 클로저로 이해하시면 되겠습니다.

func pay(user: String, amount: Int) {
    // code
}

let payment = { (user: String, amount: Int) in
    // code
}

두 코드는 같은 결과 값을 가집니다. 그러나 pay()는 함수, payment는 클로저라는 차이가 있죠!

왜 클로저가 이름 없는 함수인지 약간 감이 잡히실까요?

이제 클로저를 표현하는 다른 식들에 대해 조금 더 알아보겠습니다.

{ <parameter> -> <return type> in
   <statements 실행구문>
}

 

클로저는 기본적으로 위와 같은 형식을 가지고 있습니다. 파라미터와 반환 타입, 내용으로 구성되는데요!

예시를 함께 보겠습니다.

let closure = { (name: String) -> String in
    return "Hello, \(name)"
}


closure("Zimi")
closure(name: "Zimi")  //error!
클로저에서는 따로 파라미터의 이름을 명시하지 않습니다!
클로저를 사용하실 때는 파라미터의 이름 없이 인자 값만 입력해주시면 됩니다.

 

 

<일급 객체로서 클로저 사용하기>

클로저는 일급 객체로서, 변수와 상수처럼 사용할 수 있다

let closure = { () -> () in
    return "Hello Zimging"
}

위 내용에서 파라미터와 반환 타입이 생략된 모습인데요! 이렇게도 클로저를 작성할 수 있습니다.

위 방법은 대입과 동시에 클로저를 작성하는 방법입니다.

let closure2 = closure

이렇게 클로저를 직접 새로운 변수나 상수에 대입하는 방법도 있습니다!

클로저는 일급 객체인 만큼 함수의 파라미터로 사용할 수도, 반환 타입으로 사용될 수도 있는데요, 함께 알아볼까요?

func doSomething(closure: () -> ()) {
    closure()
}

doSomething(closure: { () -> () in
    print("Hello!") // prints Hello!
})

위 doSomething이라는 함수는 함수를 파라미터로 전달받고 있어요.

그런데 이렇게 함수가 아닌 클로저를 파라미터로 전달해줄 수도 있습니다!

아래 클로저가 파라미터로 전달된 게 보이시나요?

 

 

<클로저 호출하기>

let closure = { () -> String in
    return "Hello Zimging!"
}

closure()

 closure 변수에는 클로저가 대입되어 있습니다.

클로저가 대입된 변수 closure를 호출 구문 ()을 이용해 실행시키고 있는게 보이시나요?

 

 

<클로저의 경량 문법>

doSomething(closure: { (a, b, c) in
    return a + b + c
})

위와 같이 타입을 생략한 채로 클로저를 경량화시켜 사용할 수 있습니다.

놀랍게도 여기서 조금 더 클로저를 경량화시킬 수 있는데요!

doSomething(closure: {  
    return $0 + $1 + $2
})

$0 에서 0은 인덱스 주소로, a, b, c가 차례대로 0, 1, 2의 인덱스 값을 가집니다.

파라미터 대신 $를 사용함으로써 파라미터에 순서대로 접근할 수 있는 것이죠!

클로저를 사용하면 함수를 사용하지 않고도 아주 간단하게 코드를 작성할 수 있습니다.

 


 

클래스 Class

클래스는 관련된 속성과 메소드를 하나의 청사진으로 묶어 데이터와 기능을 캡슐화하고, 객체 지향적인 설계 패턴을 효과적으로 사용할 수 있게 해줍니다. 클래스는 코드의 재사용성을 높이고, 복잡한 시스템을 구조적으로 관리할 수 있도록 해주는 중요한 개념입니다.

 

Class는 관련된 속성과 메서드를 하나의 청사진으로 묶어주는 역할을 합니다. Swift에서 클래스는 사용자 정의 타입의 일종으로, 데이터를 캡슐화하고 기능을 구현하며, 복잡한 프로그램을 구조적으로 설계할 수 있게 해줍니다.

 

<클래스 정의 및 선언>

 클래스 정의는 속성과 메서드를 포함할 수 있으며, 이를 통해 객체의 상태와 동작을 정의합니다.

class 클래스이름 {
    // 속성 정의
    var 속성1: 타입 = 초기값
    var 속성2: 타입 = 초기값
    
    // 메서드 정의
    func 메서드이름() {
        // 메서드 구현 내용
    }
}
class UMC {
	var name: String
	var count: Int
	
	init(name: String, count: Int) {
		self.name = name
		self.count = count
	}
	
	func message() {
		print("안녕하세요! UMC입니다")
	}
}

 

 

<클래스 인스턴스 생성>

클래스를 정의한 후에는 해당 클래스를 기반으로 인스턴스를 생성하여 사용할 수 있습니다. 클래스 인스턴스를 생성하려면 클래스 이름을 사용하고, 이니셜라이저를 호출하면 됩니다.

let umc = UMC(name: "ChungAng", count: 40)

 

~~ 

걍 읽을게

~~