Struct & Class(1)

E_H·2021년 3월 22일
0

Swift

목록 보기
4/11

개요

클래스와 구조체는 OOP의 필수 요소이고 프로그램의 코드를 조직화 하기위해 사용된다.

그렇다면 Swift에서 클래스는 무엇이고 구조체는 무엇일까?

Class와 Struct의 공통점

우선 클래스와 구조체의 공통점은 무엇인지 알아보자

Swift에서 클래스와 구조체는 많은 공통점이 있다.

클래스와 구조체 둘다 다음과 같은 기능들이 제공된다.

  • Properties 정의 ( 값 저장 )
  • Method 정의 ( 기능 제공 )
  • Subscript 정의 ( 서브스크립트 문법을 이용해 값에 접근 )
  • Initializer 정의 ( 초기 상태 )
  • 기본 구현에서 기능 확장 ( extension )
  • 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응 ( protocol )

Struct

구조체는 Value Type이며 함수에서 상수나 변수에 전달될때 값이 복사가 된다.

Swift의 기본적은 타입들( Integers, Floating-point numbers, Booleans, Strings, Arrays and Dictionaries )은 전부 value type이며 내부적으로는 구조체로 구현되어 있다.

struct Resolution {
    var width = 0
    var height = 0
}

let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

Resolution 구조체의 hd 인스턴스를 선언하고 hd는 cinema라는 변수에 할당했다. 그렇다면 hd와 cinema는 같을까?
아니다. 할당하는 순간 복사(copy)되기 때문에 cinema와 hd는 같지 않고 완전히 다른 인스턴스이다.

cinema.width = 2048

print("cinema is now \(cinema.width) pixels wide")
// "cinema is now 2048 pixels wide" 출력

cinema 인스턴스의 width의 값에 2048을 할당하였더니 2048이 출력되었다.

print("hd is still \(hd.width) pixels wide")
// "hd is still 1920 pixels wide" 출력

하지만 hd 인스턴스의 width를 출력해보니 여전히 1920으로 나온다.
image.png
struct가 value type이기 때문에 값이 복사가 되어 같은 구조체를 가리키더라고
다른 값이 나온다는 것을 알 수 있었다.

구조체의 특징

  • Call by Value
  • 상속 불가
  • Codable 프로토콜을 이용하여 손쉬운 JSON <-> struct 변환 가능
  • Stack Memory 사용

Class

클래스는 refenece type이며 Value Type과 달리 값이 복사가 되지 않는다.
복사본 대신 기존 인스턴스의 참조(reference)가 사용되는 타입이다.

class VideoMode {
    var name: String?
    var frameRate = 0.0
}

let tenEighty = VideoMode()
tenEighty.name = "1080i"
tenEighty.frameRate = 25.0

let alsoTenEighty = tenEighty
alsoTenEighty.frameRate = 30.0

print("tenEighty is now \(tenEighty.frameRate)")
// tenEighty is now 30.0"

예제는 tenEighty 상수에 VideoMode 인스턴스를 선언했고
alsoTenEighty는 tenEighty를 선언받아 frameRate의 값을 변경하였다.
그 결과 tenEighty.frameRate의 값은 30.0 인걸 알 수 있다.
image.png

위의 이미지처럼 클래스가 reference type이기 때문에
tenEighty와 alsoTenEighty는 같은 VideoMode를 가리킨다는 것을 알 수 있었다.

클래스의 특징

  • Call by Reference
  • 상속
  • 타입 캐스팅 ( Type Casting )
  • Deinitializers
  • 참조 카운트 ( Reference Counting )
  • Heap Memory 사용

0개의 댓글