본문 바로가기

App Dev/iOS

iOS Swift 클래스 vs 스트럭트 Class vs Struct 어떤걸 써야하나

반응형

클래스와 구조체는 프로그램의 코드를 조직화 하기 위해 일반적으로 사용합니다. OOP를 위한 필요 요소이기도 합니다. Swift는 다른 프로그래밍 언어와 다르게 interface파일과 implementation파일을 분리해서 만들지 않아도 됩니다. 하나의 파일에 구조체나 클래스를 정의하면, Swift가 자동으로 알아서 해당 클래스와 구조체를 사용할 수 있는 인터페이스를 생성해 줍니다.

 

클래스와 구조체의 비교 (Comparing Classes and Structures)
Swift에서 클래스와 구조체는 많은 공통점이 있습니다. 클래스와 구조체 둘다 다음과 같은 기능이 가능합니다.
  • 값을 저장하기 위한 프로퍼티 정의
  • 기능을 제공하기 위한 메소드 정의
  • subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
  • 초기 상태를 설정할 수 있는 initializer 정의
  • 기본 구현에서 기능 확장
  • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)
구조체로는 가능하지 않고 클래스만 가능한 기능은 아래와 같습니다.
 
  • 상속 (Inheritance) : 클래스의 여러 속성을 다른 클래스에 물려 줌
  • 타입 캐스팅 (Type casting) : 런타임에 클래스 인스턴스의 타입을 확인
  • 소멸자 (Deinitializers) : 할당된 자원을 해제(free up) 시킴
  • 참조 카운트 (Reference counting) : 클래스 인스턴스에 하나 이상의 참조가 가능
 

 

[Struct]

struct YoutuberStruct{
    var name : String
    var sub : Int
}


var DevJoonho = YoutuberStruct(name : "센텀준호" , sub : 99999)

이와 같이 구조체를 선언해줍니다. 

그리고 구조체에 맞는 값을 세팅해줍니다. 

이 DevJoonho 값을 복사해서 변경해 보겠습니다. 

 

var DevJoonho_Clone = DevJoonho


print("값 넣기 전 DevJoonClone.name : \(DevJoonho_Clone.name)")

DevJoonho_Clone.name = "홀롤로롤"

print("값 넣은 후 DevJoonClone.name : \(DevJoonho_Clone.name)")

print("값 넣은 후 DevJoon.name : "DevJoonho.name)

[결과]

값 넣기 전 DevJoonClone.name : 센텀준호
값 넣은 후 DevJoonClone.name : 홀롤로롤
값 넣은 후 DevJoon.name :  센텀준호

복사 값을 바꾼다고 해서 원본 값이 바뀌지 않는다 

 

[Class]

class YoutuberClass{
    var name : String
    var sub : Int
   
    init(name : String ,sub : Int) {
        self.name = name
        self.sub = sub
    }
}

 생성자 : 메모리에 값을 올린다
  init 생성자로 매개변수를 가진 생성자 메소드를 만들어야 값을 가진 객체(object)를 만들 수 있다.

var CentumJoon = YoutuberClass( name : "joonho" , sub : 999)

var CentumJoon_Clone = CentumJoon

print("값 넣기 전 CentumJoon_Clone.name : \(CentumJoon.name)")

CentumJoon_Clone.name = "라아랑"

print("값 넣은 후 CentumJoon_Clone.name : \(CentumJoon_Clone.name)")

print("값 넣은 후 CentumJoon.name : \(CentumJoon.name)")

[결과]

값 넣기 전 CentumJoon_Clone.name : joonho
값 넣은 후 CentumJoon_Clone.name : 라아랑
값 넣은 후 CentumJoon.name : 라아랑

Struct 와 대조되게 Class는 참조 값으로 원본도 변경된다. 

 

클래스는 참조 타입 (Classes Are Reference Types)
값 타입과 달리 참조 타입은 변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조 됩니다. 참조된다는 의미는 그 값을 갖고 있는 메모리를 바라보고 있다는 뜻 입니다.
반응형