[내일배움캠프] 260108 TIL - 제네릭 where, 값 타입과 참조 타입

Bambu·2026년 1월 8일

내배캠 TIL

목록 보기
15/52

1. 프로그래밍 기초 주차 과제

과제 풀이 Github

Generic where

→ 특정 조건일 때만 메서드를 사용할 수 있도록 하는 방법!

1) 제네릭 타입 정의

struct SortableBox<T> {
	var items: [T]
}

2) 확장 시 조건 부여

extension SortableBox where T: Comparable {
	mutating func sortItems() {
    	items.sort(by: <)
    }
}

→ 타입 T가 Comparable을 준수하지 않으면 sortItems() 메소드는 보이지 않음

➡︎ 매우 다양하게 쓰일 수 있는 패턴으로 숙지하기!

2. Swift에서의 값 타입과 참조 타입

튜터님이 보내주신 참고 블로그 읽어보기 - ValueTypes and Reference Types in Swift

1) 정의

  • 값 타입 - 구조체, 열거형
    : 연산이 실행되는 곳에 바로 저장
    : 각 변수는 자체적인 데이터 복사본을 가지고 있어 변수가 연산될 때 다른 변수에 영향을 끼치지 않음

  • 참조 타입 - 참조 타입
    : 메모리 어딘가에 저장되며 저장된 주소를 참조
    : 참조 타입의 변수는 같은 데이터를 가리킴
    → 한 변수의 연산은 같은 데이터를 가리키고 있는 다른 변수에 영향

2) 의미(Semantics)

  • 참조 타입 : '정체성'을 대표함
    → 예) 손님, 학교 등등
    ⇒ 어떠한 객체를 의미하는 단어의 정의(분류 혹은 범주?) 같은 것으로 이해하였음

  • 값 타입 : 값 그자체로 의미를 가지는 것으로 이해
    → 예) 위치

이해를 토대로 참조타입과 값 타입을 비교해보자면

  • '학교에 갔어' - '학교'에 갔구나~ 라고 바로 이해
  • '위치에 갔어' - '위치' 어디에 갔는데?
    : '위치'가 가지는 값이 필요함
    → '위치(위도 50도 경도 38도)'에 갔어 - (위도와 경도값을 가진) 그 '위치'에 갔구나~ 라고 이해

3) 메모리 할당

일반적으로 클래스(참조 타입)는 heap에, 구조체(값 타입)는 stack에 저장

클래스(참조 타입)이 stack에 할당되는 경우

  • 클래스의 사이즈가 고정되어 있을 때
  • 클래스의 수명(lifetime)을 예측 가능할 때

⇒ 컴파일 단계에서 stack에 할당됨

구조체(값 타입)이 heap에 할당되는 경우

  • 프로토콜을 준수할 때
  • 값 타입과 참조 타입이 혼재할 때
  • 제네릭 타입일 때
  • escaping 클로저의 캡처(중 몇몇 경우)
  • inout 인자

4) 복사 비용

값 타입

  • Int, Float, Double과 같은 원시타입
    : 복사 시간은 O(1)으로 매우 빠름
    → CPU 레지스터에 저장되어 복사 시 램에 접근할 필요가 없기 때문

  • String, Array, Set, Dictionary와 같은 실존 타입(existential Type)
    : copy-on-write 방식으로 복사

💡 지연 메소드 .lazy
지연 프로퍼티처럼 메소드도 사용 가능!

let a = [1, 2, 3].lazy // a는 ~~Sequence 타입
	.filter { $0 % 2 == 0 }
    .map { "\($0)" }

for num in a { // 접근할 떄 .filter, .map을 계산
	print(num)
}

접근을 많이 하지 않아도 되거나 필요한 경우라면 활용해도 좋을 듯

참조 타입

데이터를 직접 저장하지 않으므로 참조 카운트만 늘어남

기타

예전에 정리(번역)했던 공식 문서 구조체와 클래스 관련 포스팅
노션에 대충 정리한 것

profile
안녕하세요, iOS 개발을 공부하고 있는 Bambu입니다. (프로필: Swifticons)

0개의 댓글