Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generic에 대해 설명하시오. #23

Closed
Taehyeon-Kim opened this issue Dec 5, 2021 · 4 comments
Closed

Generic에 대해 설명하시오. #23

Taehyeon-Kim opened this issue Dec 5, 2021 · 4 comments
Assignees

Comments

@Taehyeon-Kim
Copy link
Contributor

No description provided.

@hyesuuou
Copy link
Member

hyesuuou commented Dec 9, 2021

제네릭은 '포괄적인'이라는 뜻을 가지며, 타입을 특정하지 않고도 함수와 타입을 만들 수 있게 합니다.

제네릭을 사용하면 훨씬 유용하고 재사용이 가능한 코드를 작성할 수 있고, 타입에 유연하게 대처할 수 있게 됩니다. Swift에서 Array, Dictionary, Set 등 표준 라이브러리의 대다수는 제네릭으로 선언되어 다양한 타입을 지정할 수 있습니다.

제네릭 타입의 매개변수를 넘기는 함수를 만들기 위해서는 함수 이름 뒤에 <T>를 적어주고, 매개변수 타입으로 T를 넘겨주면 됩니다. 이렇게 하면 실제 함수를 호출할 때 타입이 결정됩니다.

func printInput<T>(a: T, b: T) {
	print("\(a), \(b)")
}

printInput(1, 2)
printInput("kim", "hye")

또한 <T>를 붙여 구조체, 열거형, 클래스 타입에도 제네릭을 선언할 수 있습니다.

https://spark-chive-e55.notion.site/Swift-Generic-52fd7515b6814b0285603c354439262e

@heerucan
Copy link

Generic 범용 타입

더 유연하고 재사용 가능한 함수와 타입의 코드를 작성하는 것을 가능하게 해준다.

Generic 함수

제네릭을 사용하면 인자값의 타입만 다르고 수행하는 기능이 동일한 것을 하나의 함수로 만들 수 있다.

func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
    let temporaryA = a
    a = b
    b = temporaryA
}
  • 함수명 뒤에 타입 이름 플레이스 홀더를 선언하고,
  • a, b 파라미터를 T로 선언한다.
  • 플레이스 홀더인 T는 타입이 어떤 타입인지 명시하지 않는다.
  • 그냥 a, b 파라미터의 타입이 같다는 것을 알려준다.

T타입 파라미터라고 부른다.
실제 함수가 호출될 때 해당 인자의 타입으로 대체되는 플레이스 홀더다.


Generic 타입

제네릭 함수에 이어서 제네릭 타입을 정의할 수 있다.
구조체, 클래스, 열거형 타입에도 선언할 수 있다.

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

만약 해당 타입이 특정 클래스를 상속받거나, 특정 프로토콜을 따라야 할 경우,
아래와 같이 작성할 수 있다.

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // function body goes here
}

@dlwns33
Copy link
Member

dlwns33 commented Dec 12, 2021

Generic code는 유연하고 재사용 가능한 함수와 타입을 작성할 수 있게 해준다.
중복 작성을 피하고, 의도가 명확하고 추상화된 방식으로 코드를 작성할 수 있다.
image
꺽새<>를 이용해서 안에 타입처럼 사용할 이름(T)를 선언해주면, 그 뒤로 해당 이름(T)를 타입처럼 사용할 수 있다.

여기서 이 T를 Type Parameter라고 부르는데, T라는 새로운 형식이 생성되는 것이 아니라, 실제 함수가 호출될 때 해당 매개변수의 타입으로 대체되는 Placeholder이다.
따라서 똑같은 내용의 함수를 오버로딩 할 필요 없이 제네릭을 사용하면 된다.

@Taehyeon-Kim
Copy link
Contributor Author

Generic(제네릭)은 중복을 피하면서 유연하고 재사용 가능한 함수와 타입을 작성할 수 있도록 해준다.

제네릭을 사용하려고 할 때에는 사용하려고 하는 함수 또는 타입 뒤에 꺽쇠(<>)를 붙이고 원하는 이름을 붙여주면 된다.

일반적으로 T, V, U 기호를 많이 사용한다. 중요한 것은 이 기호가 의미하는 것이 완전히 새로운 타입을 의미하는 것은 아니라는 점이다. 제네릭을 사용하게 되면 호출 시에 타입이 결정되게 된다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants