itisjustK
코딩과 사람 사는 이야기
itisjustK
전체 방문자
오늘
어제
  • 분류 전체보기 (207)
    • 일이삼사오육칠팔구십일이삼사오육칠팔구십일이삼사오육칠.. (0)
    • Web (43)
      • html & css (9)
      • django & python (15)
      • java script (9)
    • iOS (51)
      • Swift (42)
      • SwiftUI (5)
    • CS (25)
      • 자료구조 (6)
      • 운영체제 (3)
      • 데이터베이스 (9)
      • 네트워크 (7)
    • PS (34)
      • 알고리즘 & 자료구조 (0)
    • Life (36)
    • Retrospective (15)
    • Book (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • CS
  • 세그멘테이션
  • AppleDevloperAcademy
  • binding
  • 독립서점
  • 생활코딩
  • mongodb
  • SWIFT
  • 개발자
  • 점주
  • 연결리스트
  • crud
  • POSTECH
  • ios
  • 생활코딩 #이고잉 #HTML #코딩 #개발자
  • SwiftUI
  • CoreData
  • 어플
  • 킨디
  • nosql

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
itisjustK

코딩과 사람 사는 이야기

[Swift] Struct, Initializer (구조체와 이니셜라이저)
iOS/Swift

[Swift] Struct, Initializer (구조체와 이니셜라이저)

2022. 5. 10. 22:51

※ Struct & Class

구조체와 클래스는

  • 프로그래머가 데이터를 용도에 맞게 묶어 표현하고자 할 때 유용
  • 프로퍼티, 메서드를 사용하여 구조화된 데이터, 기능을 가질 수 있음
  • 하나의 새로운 사용자 정의 데이터 타입을 만들어 주는 것임 ( ex. var animal : Animal 이 뜻은 Animal이라는 데이터 타입을 따르는 animal이라는 변수라는 뜻 )

 

구조체와 클래스의 차이는

  • 구조체 인스턴스는 값(value) 타입 : 전달될 값이 복사되어 전달
  • 클래스 인스턴스는 참조(reference) 타입 : 값을 복사하지 않고 참조(주소)가 전달

 

 

Struct

구조체 정의가 의미하는 것

  • 구조체를 정의한다는 것은 새로운 타입을 생성해주는 것
  • 기본 타입 이름처럼 Upper Camel Case 적용한다
  • 구조체에 들어가는 프로퍼티와 메서드는 Lower Camel Case 적용

 

구조체 정의 예시 코드

//'BasicInformation'이라는 새로운 데이터타입 정의
struct BasicInformation {
    var name: String
    var age: Int
}

 

 

구조체 인스턴스의 생성 및 초기화

  • 새로운 인스턴스를 생성하는 것을 초기화라고 한다. 그리고 생성자가 초기화를 담당한다.
  • struct가 붕어빵 틀이라면, 인스턴스는 생성되는 하나의, 별개의, 낱개의 붕어빵. 프로퍼티는 팥, 슈크림, 피자 등등 안에 들어가는 특징
  • 구조체 정의를 마친 후, 인스턴스를 생성하고 초기화하고자 할 때는 기본적으로 생성되는 memberwise initializer(멤버와이즈 이니셜라이저) 사용
  • 멤버와이즈 이니셜라이저 : 구조체가 자동으로 제공하는 생성자. 구조체에 기본 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름으로 자동 지정된다

디스 이즈 멤버와이즈 이니셜라이저. 메이비

//default값 없는 경우에서 인스턴스 생성
struct BasicInformation {
    var name: String
    var age: Int
}

var citizen = BasicInformation(name: "K", age: 50)
print(citizen.name)
//K


//default값 있는 경우에서 인스턴스 생성
struct SpecialInformation {
    var color: String = "blue"
}

var he = SpecialInformation()
print(he.color)
//blue

 

 

Initializer

  • initialization(초기화)는 클래스나 구조체 또는 열거형의 인스턴스를 사용하기 위한 준비 과정 : 준비를 하기 위하여 저장 프로퍼티의 초깃값을 설정하는 등의 일을 수행
  • initializer를 정의하면 초기화 과정을 직접 구현할 수 있음
  • 그렇게 구현된 이니셜라이저는 새로운 인스턴스를 생성할  수 있는 특별한 메서드가 됨.

밑의 코드는 매개변수가 없는 기본 이니셜라이저의 모습.

struct SomeStruct {
    init() {
        //초기화할 때 필요한 코드
    }
}

 

 

프로퍼티 기본값

  • 인스턴스를 처음 생성할 때 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 한다. 왜냐하면 초기화 후에 값이 확정되지 않은 저장 프로퍼티는 존재할 수 없기 때문.
  • 옵셔널 저장 프로퍼티는 초깃값 설정 안 해줘도 된다. 값이 자동으로 nil로 할당되기 때문이다.
  • 만약 애초에 프로퍼티를 설정할 때 default value를 설정해준다면 이니셜라이저에서 따로 초기값을 할당하지 않더라도 default value로 값이 초기화됨

 

이거는 Initial Value

struct Data {
    var title : String
    
    //이니셜라이저를 통한 인스턴스 초기화 & initial value 할당
    init(){
        title = "Initial Value"
    }
}

var article = Data()
print(article.title)
//Initial Value

 

 

 

이거는 Default Value

default value가 있다면, 필요한 매개변수만 사용하여 초기화할 수 있음

struct Data {
    //default value 할당
    var title : String = "Default Value"
    var length : Int = 5
}

var article = Data()
print(article.title)
//Dafault Value

var anotherArticle = Data(length:0)
print(anotherArticle.length)
//0

 

 

 

 

이니셜라이저 매개변수

struct Person {
    var name: String
    
    //1
    init (Myname my: String) {
        name = "난 " + my
    }
    
    //2
    init (YourName name: String) {
        self.name = "너는 "+name
        //좌항 self.name : 맨 처음 지정해주었던 name
        //우항 name : init의 매개변수 name 지칭
    }
    
    //3
    init (value: String) {
        name = value
    }
    
    //4
    init (_ value: String) {
        name = value
    }
}

let first = Person(Myname: "K")
print(first.name)
//난 K

let second = Person(YourName: "SE")
print(second.name)
//너는 SE

let third = Person(value: "안녕")
print(third.name)
//안녕

let fourth = Person("또 보자") //init에서 (_ value: String)이기 때문에 별도의 매개변수 필요 X
print(fourth.name)
//또 보자

self를 붙이는 이유 : 매개변수와 프로퍼티 이름이 겹치는 것을 구분하기 위해. self 붙은 게 프로퍼티임

 

 

 

이거는 예시 코드

struct Town {
    var name : String
    var family : [String]
    var description : [String : Int]

    init (name: String, family: [String], description: [String:Int]) {
        self.name = name
        self.family = family
        self.description = description
    }
}

var myTown = Town(
    name: "Happy", family: ["K","J","JS"], description: ["K" : 10]
)

print(myTown.family)
//["K", "J", "JS"]
myTown.family.append("P")
print(myTown.family)
//["K", "J", "JS", "P"]

 

궁금한 것 : 이렇게 다양한 이니셜라이저들 각각의 장단점. 어떤 상황에서 어떤 것을 왜 쓰는지?

저작자표시 (새창열림)

'iOS > Swift' 카테고리의 다른 글

[iOS - Swift] XCTest FAQ (XCTest를 공부하다 생긴 궁금증들)  (0) 2023.03.07
[iOS - Swift] static func vs func  (0) 2023.03.06
[iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스  (0) 2021.08.09
[iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G  (0) 2021.08.09
[iOS 앱 프로그래밍] 음원 재생기 애플리케이션 - 6. MVC  (0) 2021.08.08
    'iOS/Swift' 카테고리의 다른 글
    • [iOS - Swift] XCTest FAQ (XCTest를 공부하다 생긴 궁금증들)
    • [iOS - Swift] static func vs func
    • [iOS 앱 프로그래밍] 회원가입 화면 구현 - 2. 화면의 전환 (1) 내비게이션 인터페이스
    • [iOS 앱 프로그래밍] 회원가입 화면 구현 - 1. H.I.G
    itisjustK
    itisjustK

    티스토리툴바