본문 바로가기

Language/Swift

클래스 vs 구조체 차이

클래스와 구조체의 차이

 

- 클래스는 call by reference 이고, 구조체는 call by value 이다. 이게 무슨 이야기냐면 얼핏 보면은 차이점이 없고 청사진을 만들기 위한 속성과 내용이 있는 것은 다름이 없게 느껴진다. 

클래스란?

Enemy라는 객체가 있고 클래스는 객체에 대한 주소 값을 저장을 한다. 이것을 코드로 먼저 풀어보자면

import Foundation


class Enemy{
    
    var health:Int
    var attackDamage:Int
    
    init(health:Int , attackDamage:Int){
        self.health = health
        self.attackDamage = attackDamage
    }
    
    func move(){
        print("Enemy move Forward")
    }
    
    func attack(){
        health -= 10
    }
    
    
}

그리고 이것을 실행시켜 주면

var enemy1:Enemy = Enemy(health: 100, attackDamage: 10)
var enemy2:Enemy = enemy1

enemy1.attack()
enemy2.attack()

print(enemy1.health)
print(enemy2.health)

프린트에 대한 값은

80
80

이렇게 출력이 된다.

왜 이렇게 되는 것일까? 위에 해골 사진을 보면 enemy1과 enemy2는 Enemy의 객체에 대한 주소 값을 저장하는 것이다.

그러니 enemy2는 enemy1과 같은 주소 값을 저장하기 때문에 서로 영향을 받는 것이다.

 

구조체란?

구조체는 객체에 대한 값을 저장한다.

이렇게 밑에와 같은 구조체를 작성하면 클래스와 다르게 init()를 작성하지 않아도 자동으로 만들어진다.

import Foundation


struct Enemy{
    
    var health:Int
    var attackDamage:Int
    
    
    func move(){
        print("Enemy move Forward")
    }
    
    mutating func attack(){
        health -= 10
    }
    
    
}

구조체를 프린트하기 위한 코드 작성

var enemy1:Enemy = Enemy(health: 100, attackDamage: 10)
var enemy2:Enemy = enemy1

enemy1.attack()
enemy1.attack()
enemy2.attack()

print(enemy1.health)
print(enemy2.health)

프린트 값

80
90

위와 같은 값들이 출력이 된다. 구조체는 값을 저장하기 때문에 서로 영향을 받지 않는다.

 

구조체와 클래스의 사용법

구조체와 클래스는 모두 새로운 데이터 타입을 정의하고 기능을 추가한다는 점에서는 같습니다. 하지만 구조체 인스턴스는 항상 값 타입이고, 클래스 인스턴스는 참조 타입입니다.
그 의미는 생긴 것은 비슷하지만 용도는 다르다는 의미입니다. 상황에 따라 차이점이 생길 수 있습니다. 그러니 애플 가이드라인을 보시면

  • 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때 
  • 캡슐화된 값이 참조되는 것보다 복사되는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조되는 것보다 복사되는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때 

구조체로 사용하기에 가장 적합한 예로는 좌표계가 있습니다. x, y 좌표 등을 표현하고 싶을 때 Int 타입으로 x, y 프로퍼티를 가질 수 있으며, 위와 같이 이런 몇 가지 상황을 제외하면 클래스로 정의하여 사용합니다.
대다수 사용자정의 데이터 타입은 클래스로 구현할 일이 더 많을 수 있습니다. 



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

Closure (클로저)  (0) 2022.03.24
클래스와 상속  (0) 2022.02.19
Swift 기본 문법 - 자료형  (0) 2022.02.08