티스토리 뷰

Swift

Swift Generic 살펴보기

hyeonii_12 2021. 3. 21. 21:37

Swift의 Generic 살펴보기

이직 준비를 하면서 받았던 질문들 중 제대로 답변을 하지 못했던 질문에 대해 공부를 해보려고 합니다.
사실 Generic은 가장 기초적인 내용 중 하나이기 때문에 이것을 깔끔하게 답변하지 못했을 때 굉장히 부끄러웠는데요,
이번 기회에 다시 한 번 개념을 다져보겠습니다.


Generic이란?

Swift Language Guide에서는 Generic에 대해 아래와 같이 설명하고 있습니다.

Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define. You can write code that avoids duplication and expresses its intent in a clear, abstracted manner.
Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define.

Generic 코드는 여러분이 정의한 요구사항에 따라 모든 타입에서 작동할 수 있는 유연하고 재사용 가능한 함수와 타입을 작성할 수 있습니다.

You can write code that avoids duplication and expresses its intent in a clear, abstracted manner.

중복을 피하고, 표현하고자 하는 의도를 명확하고 추상적이게 코드를 작성할 수 있습니다.

의역 같은거 1도 모르는 직독직해라서 너무 어려우시죠...ㅜ_ㅜ
쉽게 생각하면 Array나 Dictionary 같은 겁니다!
우리는 배열이나 딕셔너리를 정의할 때 저희가 원하는 타입을 쓰잖아요!

var intArray: [Int] = []
var stringArray: [String] = []

이런식으로요!
그렇다면 스위프트는 모든 배열 요소의 타입을 한땀한땀 정의해뒀을까요?
이 때 사용하는 것이 바로 Generic입니다.

<> 안에 있는 Element가 바로 Generic 입니다.
이 Element에 Int가 들어오던, String이 들어오던 상관없이 안에 있는 모든 함수 등을 해당 타입에 맞춰서 수행할 수 있다는 것이죠!

자, 결론적으로 Generic은 타입에 상관없이 모든 함수를 동일하게 수행할 수 있도록 하는 것이라고 요약할 수 있을 것 같습니다.

 

Generic 사용 예시

제가 Generic을 사용하는 곳은 주로 네트워크 통신할 때입니다.

enum HttpMethod<Body> {
	case get
	case post(Body?)
	case put(Body)
	case patch(Body)
	case delete(Body?)
}

네트워크 통신을 할 때 get을 제외한 나머지 메소드에는 Body를 보낼 수 있지만 해당 Body가 어떤 타입을 가지고 있을 지는 모릅니다.
따라서 Generic을 통해 get을 제외한 나머지 타입에서는 모든 타입을 Body로 보낼 수 있도록 설정하는 것입니다.

예를 들어서 get method를 통해 데이터를 가져오고자 한다면,

let session = URLSession(method: .get)

이런식으로 가져올 수 있습니다.

그리고 post를 통해 데이터를 보내고자 한다면,

struct User {
	let name: String
	let age: Int
}

let user = User(name: "hyeoni", age: 0)
let session = URLSession(method: .post(user))
struct Device {
	let name: String
	let id: String
}

let device = Device(name: "D01", id: "1")
let session = URLSession(method: .post(device))

이렇게 보낼 수 있습니다.

위의 예제와 아래의 예제는 post 통신을 한다는 것은 똑같지만, 보내는 Body의 타입은 다릅니다.
그러나 우리는 하나의 enum을 통해서 두 가지를 똑같은 함수를 처리하는 것처럼 보이게 만들었습니다.

이처럼 어떤 형식의 데이터가 Body로 들어가던지 상관하지 않고 네트워크 통신 부분을 모듈로 빼낼 수 있어서
코드의 재사용성이 높아지는 효과를 가져올 수 있습니다!


네트워크 통신의 모듈화 부분은 제가 굉장히 애정하는 (..) 코드 중 하나인데요!
기회가 된다면 이 부분도 정리해서 공유해 드릴 수 있도록 노력해보겠습니다.

이렇게 정리하고 보니 면접 때 왜 대답을 깔끔하게 하지 못했는지 너무 바보같네요...ㅠ_ㅠ
다음 번에 또 기회가 온다면 까먹지 않고 잘 대답할 수 있길 바랍니다...ㅎㅎㅎㅎ

댓글