[Swift 프로그래밍] 구조체와 클래스 (Struct and Class)

이정훈·2022년 5월 17일
0

Swift 기본

목록 보기
6/22
post-thumbnail

본 내용은 스위프트 프로그래밍 3판 (야곰 지음) 교재를 공부한 내용을 바탕으로 작성 하였습니다.

구조체 정의


구조제란 간단하게 말하면 프로퍼티메서드를 사용하여 사용자가 정의한 데이터 타입이라고 할 수 있다.

구조체는 struct 키워드로 정의하며 그 형태는 다음과 같다.

struct 구조체 이름 {
	프로퍼티와 메서드
}

구조체의 사용은 먼저 구조체를 정의 후 인스턴스를 생성과 초기화를 하여 사용한다.

//구조체 정의
struct PersonInformation {
    var name: String
    var age: Int
}

//구조체 인스터스 생성 및 초기화
var personInfo: PersonInformation 
= PersonInformation(name: "joe", age: 24)

personInfo.name = "mark"    //구조체 프로퍼티가 변수로 선언시 변경 가능
personInfo.age = 35

구조체의 인스턴스 생성 후 프로퍼티 값이 접근하려면 마침표 . 를 사용하여 접근한다.

클래스


클래스의 형태는 다음과 같다.

class 클래스 이름 {
	프로퍼티와 메서드
}

다음은 클래스를 정의하고 인스턴스를 생성하는 과정이다.

//클래스 정의
class Person {
    var name: String = "jeunghun"
    var age: Int = 24
    var height: Double = 0.0
    var weight: Double = 0.0
    
    //디이니셜라이저
    deinit {
        print("Person 클래스의 인스턴스가 소멸됩니다.")
    }
}

var jeunghun: Person = Person()     //인스턴스 생성
print(jeunghun.name)
print(jeunghun.age)
jeunghun.height = 173.3
jeunghun.weight = 60.8
print(jeunghun.height)
print(jeunghun.weight)

var joe: Person? = Person()
joe = nil   //메모리 해제

클래스의 인스턴스 생성 후 초기화는 위의 코드의 경우, 기본적으로 이니셜라이저를 따르는데 매개변수를 활용한 이니셜라이저로 초기화도 가능하다.
(이니셜라이저는 다른 언어의 생성자와 동일하다.)

클래스에서도 마찬가지로 인스턴스 생성 후 프로퍼티에 접근하고 싶다면 마침표 .를 사용하여 접근한다.

클래스의 인스턴스는 더 이상 참조할 필요가 없을때 메모리에서 인스턴스를 해제한다.
위의 코드에서 참조 변수 joe의 인스턴스에 nil이 할당되면 더 이상 참조 할 것이 없어 메모리에서 해제가 되고 메모리에서 해제 되기 전 디이니셜라이저(deinir 메서드)가 호출된다. 인스턴스 해제 전 데이터를 저장하거나 인스턴스의 해제를 알리기 위하여 디이니셜라이저를 사용 할 수 있다.
이러한 디이니셜라이저는 클래스당 하나만이 존재 가능하며, 매개변수와 반환값을 가지지 않는다.

구조체와 클래스의 차이


구조체와 클래스의 형태를 보면 매우 유사한 형태를 보인다. 필자가 생각하기에 구조체와 클래스의 가장 큰 차이는 구조체는 Int, Float, String과 같은 값 타입이라는 것이고, 클래스는 인스턴스 참조 타입이라는 것이다.
값 타입이라는 것은 매개변수의 전달인자로 값 타입이 전달 될때 전달 값이 복사 되고 기존의 값에는 영향을 주지 않는다.
반면 참조 타입은 전달인자로 기존의 인스턴스의 메모리 위치를 참조하여 전달한다.

인스턴스의 참조가 같은지 확인하기 위하여 다음과 같이 식별 연산자를 사용하여 확인이 가능하다.

//식별 연산자 사용
var mark: Person = Person()
let friend: Person = mark
let anotherFriend: Person = Person()

print(mark === friend)
print(mark === anotherFriend)
print(friend !== anotherFriend)

구조체를 let으로 선언하면 인스턴스 내부 프로퍼티가 var로 선언되어 있더라도 접근이 불가능하다.
반면 클래스는 참조 타입으로 let으로 선언하였더라도 내부 프로퍼티가 var인 경우 접근이 가능하다.

profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글