신속한 구문 – 구조 및 클래스

구조체와 클래스

구조체와 클래스는 하나의 큰 코드 블록이며 구조체에 정의된 변수와 상수를 속성이라고 하고 함수를 메서드라고 합니다.

요약하자면

  • 속성 – 구조 및 클래스 내에서 정의된 변수 및 상수
  • 메서드 – 구조 및 클래스 내에서 정의된 함수

구조체와 클래스의 공통점은 무엇입니까?

  1. 속성을 정의하여 값을 저장할 수 있습니다.
  2. 기능 또는 동작을 구현하는 메서드를 정의할 수 있습니다.
  3. 구조/클래스의 값은 인덱스 구문을 통해 액세스할 수 있습니다.
  4. 초기화 상태는 이니셜라이저에 의해 정의될 수 있습니다.
  5. 새로운 기능을 추가하기 위해 확장으로 확장할 수 있습니다.
  6. 특정 프로토콜을 사용하여 특정 기능을 수행할 수 있습니다.

차이로

  1. 구조는 상속될 수 없지만 클래스는 상속될 수 있습니다.
  2. 구조체는 값 유형이고 클래스는 참조 유형입니다.
  3. 유형 캐스팅은 클래스 인스턴스 및 구조체에서 사용할 수 있습니다.
  4. Deinitializer는 클래스 인스턴스에서만 사용할 수 있습니다.

인스턴스 – 구조 또는 클래스에서 생성된 개체를 인스턴스라고 합니다.


구조

구조는 메모리 구조에서 볼 때 스택이라는 메모리 위치에 값을 저장합니다. 값을 전달할 때마다 복사본이 만들어집니다.

기본 문법 📝 
struct StructName {
    property
    method
    initializer
    subscript
}

구조체 이름은 UpperCamelCase에 선언하고 나머지 속성 및 메서드는 LowerCamelCase에 선언합니다.

struct Car {
        var name: String
        var number: Int

    func maker () {
        print("Audi")
    }
}


// 새로운 메모리공간이 생기고 차의 이름과 번호가 생성되었다.
let p = Car(name: "A6", number: 7777)

// 속성은 인스턴스의 이름으로 접근한다.
p.name
p.number
// 메소드도 인스턴스의 이름으로 접근한다.
p.maker()

수업

클래스는 힙이라는 메모리 위치에 값을 저장하고 힙에 저장된 값의 주소를 스택에 저장합니다. 값을 전달하면 복사본이 만들어지지 않고 주소만 전달됩니다.

기본 문법 📝 
class ClassName {
    property
    method
    initializer
    subscript
}

구조체, 명명 방법, 인스턴스화 방법 및 속성 액세스는 구조체와 동일합니다.

class Car {
        var name: String
        var number: Int

    // 프로퍼티에 초기값을 선언해주지 않으면 에러남
    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }

    func maker () {
        print("Audi")
    }
}

// 새로운 메모리공간이 생기고 차의 이름과 번호가 생성되었다.
let p = Car(name: "A6", number: 7777)

// 속성은 인스턴스의 이름으로 접근한다.
p.name
p.number
// 메소드도 인스턴스의 이름으로 접근한다.
p.maker()

초기화 구문

구조체 및 클래스의 인스턴스가 생성되면 모든 저장 속성에 초기 값을 저장해야 합니다. 저장된 속성에 초기 값이 없는 경우 초기화를 호출하여 초기 값을 저장할 수 있습니다. 키워드로 init()사용

이니셜라이저 선언 문법
init(parameters) {
    statements(생성자 초기화)
}

구조체 이니셜라이저

  • 기본 이니셜라이저
    struct Car {
      var name: String = "A6"
      var number: Int = 7777
    }
    

// 인스턴스화(기본 초기화)
모델 = 자동차()

저장 프로퍼티에 초기값이 전부 있는 경우에는 기본 이니셜라이저를 사용할 수 있다. 

- 멤버와이즈 이니셜라이저(Memberwise Initalizers)
프로퍼티의 이름으로 파라미터를 가지는 이니셜라이즈로 저장 프로퍼티에 초기값이 저장되어 있지 않은 경우에 사용한다. 클래스에서는 사용불가능
```swift
struct Car {
    var name: String
    var number: Int
}

// 인스턴스 생성 (멤버와이즈 이니셜라이저)
let model = Car(name: "A6", number: 7777)

클래스 이니셜라이저

구조체와 달리 클래스에는 초기 값을 할당해야 합니다.

class Car {
        var name: String
        var number: Int
}

저장 속성에 초기 값이 할당되지 않으면 오류가 발생합니다.

class Car {
        var name: String = "A6"
        var number: Int = 7777
}

초기값 할당

class Car {
        var name: String
        var number: Int

    init() {
        name = "A6"
        number = 7777
    }
}

초기 값은 초기화 선언으로 지정해야 합니다.

class Car {
        var name: String
        var number: Int

    init(name: String, number: Int) {
        self.name = name
        self.number = number
    }
}

// 새로운 인스턴스 생성
let car = Car(name: "A6", number: 7777)
car.name // A6
car.number // 7777

매개변수를 받는 이니셜라이저를 만들면 인스턴스가 생성될 때 매개변수를 받고 저장된 속성이 할당됩니다.


값 유형과 참조 유형의 차이점

값 유형에는 구조체, 열거형 및 튜플이 포함되고 참조 유형에는 클래스 및 클로저가 포함됩니다.

먼저 구조체의 값 유형을 살펴보겠습니다.

struct Car {
        var name: String = "A6"
        var number: Int = 7777
}

var car = Car()
var car2 = car

car2.name = "X6"
car2.name // X6
car.name // A6
var car = Car()

자동차 인스턴스 생성 시 “A6″과 7777로 초기화된 값이 저장됩니다.

var car2 = car

그리고 car에 저장된 초기값을 새로운 car2 변수로 저장하면 car와 car2라는 두 개의 저장 위치가 생성된다. 즉, 모든 인스턴스입니다.

car2.name = "X6"
car2.name // X6
car.name // A6

여기서 car2에 저장된 name의 값을 “X6″으로 변경하고 각 변수에 저장된 값을 확인하면 car.name은 “A6″으로 변경되지 않고 car2.name만 “X6″으로 변경됨 .

값 형식을 사용하면 값을 전달할 때마다 새 메모리 할당 복사본이 전달됩니다. 메모리 구조를 보면 스택이라는 메모리 영역에 값이 저장되고 값이 전달될 때마다 복사본이 만들어집니다.

다음으로 클래스 참조 유형을 살펴보겠습니다.

class Car {
        var name: String
        var number: Int
    init(){
        name = "A6"
        number = 7777
    }

}

let car = Car()
let car2 = car

car2.name = "X6"
car2.name // X6
car.name // X6
let car = Car()

자동차 인스턴스 생성 시 “A6″과 7777로 초기화된 값이 저장됩니다.

let car2 = car

위 코드의 결과를 보면 car에 저장된 초기값이 구조체처럼 새로운 car2 상수로 저장된다.

car2.name = "X6"
car2.name // X6
car.name // X6

car2에 저장된 name의 값을 “X6″으로 변경하고 각 상수에 저장된 값을 확인하면 이번에 car.name에 저장된 값도 “X6″으로 변경된 것을 확인할 수 있다.

이와 같이 참조형은 힙이라는 메모리 위치에 값을 저장하고, 힙에 저장된 값의 주소를 스택에 저장합니다. 그래서 값을 넘기면 복사본을 만들지 않고 주소만 넘기고 원래 값도 수정한다.

여기서 중요한 점은 저장 속성이 구조체나 클래스에서 변수로 선언되면 인스턴스가 상수로 선언되면

struct Car {
        var name: String = "A6"
        var number: Int = 7777
}

let car = Car()
car.name = "X6" // 에러 발생

구조에서 인스턴스 상수를 변수로 변경하여 값을 변경할 수 있습니다.

class Car {
        var name: String = "A6"
        var number: Int = 7777
}

let car = Car()
car.name = "X6"

클래스에서는 상수로 선언되어 있어도 값이 변경될 수 있습니다.

클래스, 구조 및 기타 구현 조건

  1. 객체 지향 프로그래밍에서 대부분의 객체는 참조 유형인 클래스로 구현됩니다.
  2. 상대적으로 적은 양의 데이터를 저장하고 상속이 필요하지 않은 경우 값 유형으로 구현됩니다.
  3. 값이 전달될 때마다 복사본을 만들어야 하지만 값 유형으로 구현하십시오.
  4. 관련 상수의 그룹을 나타낼 때 열거형으로 구현합니다.
  5. 코드에서 한 번만 사용되는 유형은 튜플로 구현됩니다.
  6. 나머지 값 유형은 구조로 구현됩니다.