[Swift] Structures & Classes

상 원·2022년 7월 10일
0

Swift

목록 보기
14/31
post-thumbnail
post-custom-banner

구조체와 클래스는 코드를 작성하는 데 매~~우 중요한 블럭들이다.
상수나 변수, 함수를 정의하는 것과 같은 syntax를 사용해서 구조체나 클래스에 functionality(기능)을 추가하는 프로퍼티나 메소드를 정의할 수 있음!!

다른 언어들과의 차이점이라면 Swift는 구조체와 클래스를 한 파일에 저장해두면 다른 파일들에도 알아서 쓸 수 있다는 것!!(진짜 편함)

구조체와 클래스의 비교

뭐가 다른지 솔직히 몰랐고, SwiftUI를 배울 때 클래스를 거의 안 써서 몰랐던 것들!

공통점

  • 값을 저장하기 위해 프로퍼티를 정의함
  • 기능을 제공하기 위해 메소드를 정의함
  • subscript syntax를 통해 특정 값에 접근할 수 있는 subscript 정의함
  • 초기값을 설정하기 위해 initializer를 정의함
  • 기본 형태에서 기능을 확장할 수 있음
  • 특정한 기능을 제공하기 위해 protocol을 따를 수 있음

구조체가 갖고있지 않은 클래스의 추가기능

  • inheritance : 다른 클래스의 기능 상속 가능
  • type casting : 클래스 인스턴스의 타입을 런타임에 확인하고 변환 가능
  • Deinitializer : 클래스 인스턴스가 가진 모든 리소스를 free 가능
  • Reference counting : 클래스 인스턴스를 한번 이상 참조 가능(ARC에서 자세히 다룰듯?)

이렇게 클래스가 갖고있는 기능이 더 많다 보니 복잡성이 늘어남. 그래서 보통 구조체를 선호한다. 실제로도 custom data type을 만들 때 구조체나 enumeration을 많이 사용함. 각각을 어떨 때 사용하는지는 여기에 자세히 나와있음!

선언하기

둘 다 비슷한 선언 문법을 가지고 있음. structclass를 앞에 붙여주는 거나, 중괄호 안에 모두 선언하는 거나.

struct SomeStructure{
	// struct definition
}
class SomeClass{
	// class definition
}

참고

새로운 구조체나 클래스는 Swift의 새로운 type을 정의하는 것과 같기 때문에 UpperCamelCase를 써야 하고, 이 안에서 메소드나 프로퍼티를 정의할 때는 type name과 구분하기 위해 lowerCamelCase를 써야 한다.

이런 식으로 만들 수 있음.

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

class VideoMode {
    var resolution = Resolution()
    var interlaced = false
    var frameRate = 0.0
    var name: String?
}

구조체, 클래스의 인스턴스

위에서 선언한 구조체나 클래스 자체는 Resolution이나 VideoMode를 묘사하는 것 뿐이지 이걸 사용하기 위해서는 인스턴스를 만들어 줘야 한다.

let someResolution = Resolution()
let someVideoMode = VideoMode()

인스턴스 만드는 것도 비슷함.

프로퍼티 접근하기

dot syntax를 사용해서 접근할 수 있다.
인스턴스 이름 바로 뒤에 .(dot)를 찍고 프로퍼티 이름을 쓰면 됨.

print("The width of someResolution is \(someResolution.width)")
// Prints "The width of someResolution is 0"

// drill in 할수도 있음.
print("The width of someVideoMode is \(someVideoMode.resolution.width)")
// Prints "The width of someVideoMode is 0"

Memberwise Initializers for Structure Types

구조체형의 멤버 초기화

모든 구조체는 자동으로 생성된 Memberwise Initializer 이라는 게 있음.
이런 식으로 멤버별로 초기화가 가능하다.

let vga = Resolution(width: 640, height: 480)

클래스는 이런 default memberwise initializer가 없기 때문에 초기화 방식이 조금 다르다. 초기화에서 설명할듯!

구조체와 Enumeration은 Value Type!

Value type은 앞에서도 말했듯이(언제 포스팅인지는 모르겠지만) 변수나 상수에 할당되거나 함수에 들어갈 때 복사돼서 들어가는 것이다.
원래 값이 변경되지 않음!!!

note

배열, 딕셔너리, 문자열 등 표준 라이브러리로 구성된 Collection은 복사의 cost를 줄이기 위한 최적화를 진행한다.
복사본과 원본 인스턴스의 메모리 공간을 같이 공유하다가, 복사본을 변경하기 직전에 복사가 완료됨.
약간 운영체제 들었던 거에서 shared page랑 비슷한듯?

클래스는 Reference Type!

클래스 인스턴스는 복사되는 것이 아니고 기존 인스턴스를 참조하는 형식으로 사용됨.
클래스 인스턴스를 만들고 그것의 멤버 값을 수정하면 기존의 클래스도 값이 같이 변경되는 식.

profile
ios developer
post-custom-banner

0개의 댓글