ji_iin
iOSLog
ji_iin
전체 방문자
오늘
어제
  • 분류 전체보기 (56)
    • Swift (8)
    • iOS (6)
    • 알고리즘 (34)
    • CS (3)
    • 회고 (3)
    • 제품리뷰 (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ios
  • django
  • 알고리즘
  • 브루트포스 알고리즘
  • 개발회고
  • 그래프이론
  • 구조체와 클래스
  • 2022년 회고
  • 정렬
  • 다이나믹 프로그래밍
  • 공식문서
  • 그래프탐색
  • 백준
  • 파이썬
  • 수학
  • 백트래킹
  • Python
  • 프로그래머스
  • opional
  • SWiFT
  • 대기업코테
  • swiftUI
  • 자바
  • Bye2023
  • 너비우선탐색
  • 알고리즘개념
  • 회고
  • 깊이우선탐색
  • 재귀
  • 깊은복사와 얕은복사

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ji_iin

iOSLog

[Swift] Class(클래스)와 Struct(구조체) 차이 - 깊은복사와 얕은복사
Swift

[Swift] Class(클래스)와 Struct(구조체) 차이 - 깊은복사와 얕은복사

2021. 9. 16. 20:18

Swift를 접한지 몇 달이 지났지만, 그래도 클래스와 구조체의 차이점이 뭔지 잘 모르겠고 헷갈린다.

이번 기회에 강의를 들은 내용 바탕으로 정리해봤다. 

클래스와 구조체의 차이뿐만 깊은복사와 얕은복사의 차이점도 제대로 짚고가게 되었다.

 

Class

  • 변수 선언시 값을 초기 값을 지정해줘야 함 
    // 생성자를 만들어서 이 클래스 사용시 매개변수 입력받게
    class Enemy {
        var health: Int
        var attackStrength: Int
        
        init(health: Int, attackStrength: Int){
            self.health = health
            self.attackStrength = attackStrength
        }
    
    		func takeDamage(amount: Int){
            health = health - amount
        }
    }​
  • //변수를 직접 지정 class Enemy { var health: Int = 100 var attackStrength: Int = 10 func takeDamage(amount: Int){ health = health - amount } }​
  • 생성자 선언 시 클래스 사용
    let Tom = Enemy(health: 100, attackStrength: 30)​

Class 사용

  • 얕은복사 : 같은 객체를 가리켜 sk1, sk2 중 하나를 수정해도 동시에 둘 다 변수 값이 변경됨.
let sk1 = Enemy(health: 100, attackStrength: 30)

//얕은 복사 -> 같은 객체를 가리킴
let sk2 = sk1

sk1.takeDamage(amount: 10)
sk1.takeDamage(amount: 10)

sk2.takeDamage(amount: 10)

print(sk1.health) //70
print(sk2.health) //70

👉 값을 줄이는 메소드를 사용해서 두 객체의 health를 줄이고 출력하면
같은 객체를 참조 하기 때문에 값은 모두 70이 나올 것이다. 10씩 3번 줄었으므로

얕은복사 설명


Struct

  • Class에서 Struct로 변경해보자
  • Struct는 immutable(불변)하다.
  • 그래서 mutating method로 바꾸라는 에러가 뜬다. 왜냐하면 변수 값이 해당 메소드에 의해 업데이트 되기 때문이다.

struct Enemy {
    var health: Int
    var attackStrength: Int
    
    init(health: Int, attackStrength: Int){
        self.health = health
        self.attackStrength = attackStrength
    }
    
    mutating func takeDamage(amount: Int){
        health = health - amount
    }

Struct 사용

  • 구조체를 사용할 때 let 키워드로 썼기 때문에 error 발생한다. var로 바꿔줘야 된다. (var은 mutable 하므로)
  • 깊은 복사 : 구조체를 사용해서 복사하면 객체의 껍데기만 복사되어 새로운 객체를 생성한 후 변수에 그 껍데기를 복사한다. 그러면 서로다른 2개의 객체가 생성되는 것이다.

👉 서로 다른 두개의 객체 값을 변경 했으므로 독립적으로 계산되어 값도 다르게 나온다.

깊은복사 예시


클래스 정리

  • 참조에 의해 전달
  • ex) 컴퓨터 파일에 사용하고 있는 폴더의 참조폴더를 만들어두고 참조폴더를 삭제하면 기존의 폴더까지 영향끼쳐 삭제된다.
  • 원본에 영향을 끼침
  • Inheritance( 상속성 )

구조체 정리

  • 값에 의해 전달된다.
  • ex) 하나의 사진을 구조체는 똑같은 걸 복사 복사본을 해서 전달하므로 복사본에 낙서하거나 손상시켜도 원본에 영향을 끼치지 않는다.
  • 애플에서는 default로 Struct(구조체) 사용을 권고하고 있다.

 

👍🏻  참고하면 좋을 자료

Swift 공식 Reference : Structures and Classes

저작자표시 (새창열림)

'Swift' 카테고리의 다른 글

[Swift] 접근제어자 (Access Control)  (0) 2022.05.16
[Swift] inout parameter  (0) 2022.01.05
[Swift] 타입 캐스팅(Type Casting) - in / as 키워드  (0) 2021.11.27
[Swift] Optinoal이란? Wrapping/Unwrapping  (0) 2021.10.02
[Swift] 구조체(struct) 공부하기!  (0) 2021.08.29
    'Swift' 카테고리의 다른 글
    • [Swift] inout parameter
    • [Swift] 타입 캐스팅(Type Casting) - in / as 키워드
    • [Swift] Optinoal이란? Wrapping/Unwrapping
    • [Swift] 구조체(struct) 공부하기!
    ji_iin
    ji_iin
    개발성장일지🐥

    티스토리툴바