멀리 보는 연습

iOS 개발 강의 정리_구조체와 클래스 본문

iOS 앱 개발/Swift

iOS 개발 강의 정리_구조체와 클래스

푸실리 2022. 3. 9. 16:26

어느덧 iOS 앱 개발 과정을 듣기 시작한지도 3주차에 접어들었다. 진도가 느리지만 천천히 소화하면서 배워가려고 노력중이다. 1주차에 너무나 많은 개념들을 배워버려서 혼란스럽다 하하 그래서 노션에 정리해둔 것을 다시 정리하면서 복습하고 있다. 

 

오늘 정리할 개념은 구조체와 클래스이다. 클래스는 전 학원에서 Java를 배울 때 개념을 배워뒀기 때문에 나름 수월하게 받아들였지만 구조체는 대체 뭔지..!

 

구조체란?

구조체의 인스턴스는 값 타입이며, 파스칼 기법(함수 명을 대문자로 시작)을 사용한다. 구조체 변수를 새로운 변수에 할당할 때마다 새로운 구조체가 할당된다. 따라서 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시켜도 다른 변수에 영향을 주지 않는다.

 

struct 구조체 이름 {

프로퍼티와 메소드

}
struct User{
	//프로퍼티
    var nickname:String
    var age:Int
    // 메소드
    func information(){
        print("\(nickname) \(age)")
    }
}

var user = User(nickname: "Gahyun", age: 31)

user.nickname // "Gahyun"
user.nickname = "Mac"
user.nickname // "Mac"

user.information() // Mac 31

 

구조체를 상수로 선언하면 프로퍼티 값을 변경할 수 없지만, 변수로 선언하면 내부의 프로퍼티가 변수로 선언된 경우에 값을 변경할 수 있다. 

struct Coffee {
    var name: String
    var price: Int
 }
 
 var favoriteCoffee: Coffee = Coffee(name: "americano", price: 5000)
 favoriteCoffee.name = "cafeLatte"
 favoriteCoffee.price = 6000
 
 print(favoriteCoffee.name, favoriteCoffee.price)   //cafeLatte 6000
 
 let deliciousCoffee: Coffee = Coffee(name: "cafeMocha", price: 7000)
 deliciousFood.name = "steamMilk"   //오류 발생
 deliciousFood.price = 50000    //오류 발생

 

클래스란?

클래스의 인스턴스는 참조 타입이며, 더 참조할 필요가 없을 때 메모리에서 해제된다. 또한 클래스의 인스턴스는 참조 타입이므로 인스턴스를 상수로 선언해도 내부 프로퍼티 값을 변경할 수 있다. 

class 클래스 이름 {

프로퍼티와 메소드

}

 

class Quotes {
    var quote: String = ""
    var name: String = ""
}

let myQuote: Quotes = Quotes()
myQuote.quote = "언제나 현재에 집중할수 있다면 행복할것이다."
myQuote.name = "파울로 코엘료"

print(myQuote.quote, myQuote.name) //언제나 현재에 집중할수 있다면 행복할것이다. 파울로 코엘료

 

쉽게 생각하면, 구조체를 새로운 변수로 할당하면 그 순간 새로운 독립적인 변수가 생성되는 반면, 클래스는 계속 종속받는다고 보면 될 것 같다. (맞나?)

 

 

클래스와 구조체의 차이

1. 공통점

- 값을 저장할 프로퍼티를 선언할 수 있다. 

- 함수적 기능을 하는 메소드를 선언할 수 있다.

- 내부 값에 .을 사용하여 접근할 수 있다.

- 생성자를 사용해 초기 상태를 설정할 수 있다.

- extension을 사용하여 기능을 확장할 수 있다.

- protocol을 채택하여 기능을 설정할 수 있다. 

 

2. 차이점

2-1. 클래스

- 상속이 가능하다.

- 타입 캐스팅을 통해 런타임에서 클래스 인스턴스의 타입을 확인할 수 있다.

- deinit을 사용하여 클래스 인스턴스의 메모리 할당을 해제할 수 있다.

- 같은 클래스 인스턴스를 여러 개의 변수에 할당한 뒤 값을 변경시키면 모든 변수에 영향을 준다.

 

2-2. 구조체

- 상속이 불가능하다.

- 구조체 변수를 새로운 변수에 할당할 때마다 독립된 새로운 구조체가 할당된다.

(즉, 같은 구조체를 여러 개의 변수에 할당한 뒤 값을 변경시켜도 다른 변수에는 전혀 영향을 주지 않는다.)

 

 

 

 

 

이니셜라이저?

초기화(initialization)란 클래스, 구조체 또는 열거형의 인스턴스를 사용하기 위한 준비 과정

/*
 init(매개변수 : 타입, ...){
    // 프로퍼티 초기화
    // 인스턴스 생성 시 필요한 설정을 해주는 코드 작성
 }
 */

class User{
    var nickname: String
    var age:Int
    
    init(nickname: String, age: Int){
        self.nickname = nickname
        self.age = age
    }
    init(age:Int){
        self.nickname = "haha"
        self.age = age
    }
    // 인스턴스가 메모리에서 해제되는 시점에 자동 호출
    deinit{
        print("deinit user")
    }
}

// 인스턴스 생성
var user = User(nickname: "Gahyun", age: 31)
user.nickname
user.age

// 인스턴스 생성
var user2 = User(age: 29)
user2.nickname
user2.age

// 인스턴스 해제
var user3 : User? = User(age: 23)
user3 = nil // nil을 입력하면 인스턴스가 더 이상 필요하지 않다고 판단하여 deinit을 호출

 

Comments