Swift문법 - (11)클래스와 구조체

Youth·2022년 9월 26일
0

swift문법공부

목록 보기
11/27
post-thumbnail
post-custom-banner

클래스와 구조체

⭐️ 가장 큰 차이는 메모리 저장 방식의 차이 ⭐️

1) 구조체

  • 값형식(Value Type)

  • 인스턴스 데이터를 모두 스택(Stack)에 저장

  • (복사시) 값을 전달할때마다 복사본을 생성 (다른 메모리 공간 생성)

복사한다는 의미

struct Animal {
	var name = "동물"
}

var p = Animal()
var p2 = p
  • 스택(Stack)의 공간에 저장, 스택 프레임 종료시, 메모리에서 자동 제거

2) 클래스

  • 참조형식(Reference Type)

  • 인스턴스 데이터는 힙(Heap)에 저장, 해당 힙을 가르키는 변수는 스택에 저장

  • 메모리 주소값이 힙(Heap)을 가르킴

  • (복사시) 값을 전달하는 것이 아니고, 저장된 주소를 전달

  • 힙(Heap)의 공간에 저장, ARC시스템을 통해 메모리 관리(주의해야함)

  • 주의점 - (참고) 클래스 내부에는 직접 메서드(함수) 실행문이 올 수 없다. ⭐️

struct Bird {
    
    func fly() {
        print("날아갑니다.")
    }

		fly()              // 클래스내부에서는 실행문이 올수없다(오류발생)    
    func sit() {       // 매서드 내부에서 실행은 가능(선언이기때문에)
        fly()
    }
}

생성자 옵셔널

클래스를 사용하기 위해서는 저장속성을 모두 초기화 해주어야하는데 기본 저장속성에 기본값을 넣거나 생성자를 통해 인스턴스생성시 초기값을 설정되도록 해주어야한다
그렇지 않으면 오류가 발생한다(생성자를 초기화 하라는)

class Dog {
    var name: String?            // var name: String? = nil
    var weight: Int                 옵셔널은 기본값이 nil로 설정됨
    
    init(weight: Int) {
        self.weight = weight
    }

    생성자에서 기본값을 넣어주면 인스턴스생성시 여러가지 선택지가 나옴
    init(name: String = "안녕", weight: Int) {
        self.name = name
        self.weight = weight
    }
    생성시
    Dog(weight:   )
    Dog(name:   , weight:   )이런 생성자들이 나옴
    
    func sit() {
        print("\(name) 앉았습니다.")
    }
    
    func layDown() {
        print("\(name) 누웠습니다.")
    }
}

클래스/구조체를 사용하는 이유

💡 Data Transfer Object(DTO) : 관련 데이터를 한 곳에 담는 역할 Data Access Object(DAO) : 데이터 처리(비지니스 로직) Helper Object : 유틸리티(도움을 주는 기능 / 날짜, 시간, 통화, 인코딩)
profile
AppleDeveloperAcademy@POSTECH 1기 수료, SOPT 32기 iOS파트 수료
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 3월 16일

👍🍚

답글 달기