[iOS / Swift] Swift 문법을 알아보자! - 8편 : 구조체 (Struct)

프린스송·2021년 5월 24일
2

Swift 문법

목록 보기
8/21
post-thumbnail

안녕하세요~~ 오늘은 저번 시간에 배웠던 class에 이어서 구조체에 대해서 공부해 볼겁니다! 클래스와 구조체는 사용하는 데에는 굉장히 비슷하지만 각자의 장점과 단점이 있고 유용성과 한계점도 존재하였습니다. 구조체 또한 클래스와 마찬가지로 객체 지향 언어인 Swift에서 필수적인 요소이기도 합니다.그럼 이제 구조체에 대해 자세히 공부를 해보겠습니다. 클래스 복습하기!!


구조체 (Struct)

구조체란 인스턴스의 값(프로퍼티)을 저장하거나 기능(메소드)을 제공하고 이를 캡슐화할 수 있는 스위프트가 제공하는 타입(named type)입니다. 저번에 공부했었던 클래스처럼 인스턴스를 만들어서 실제 작업에도 쓸 수 있습니다. 그럼 저번 클래스 포스팅에서의 코드와 비슷하게 코드를 작성해보겠습니다.

struct Name {
    var name = "Song"
    
    func my_name() {
        print("my name is \(name)")
    }
}

var song : Name = Name()

print(song.name)
song.my_name()

song.name = "kim"
song.my_name()

클래스에서 짰던 코드와 거의 비슷합니다. class였던 것을 struct로 바꾼거 밖에는 변경 사항이 없네요! 이처럼 클래스와 구조체는 선언하고 사용하는방법까지 매우 비슷합니다!! 클래스와 같이 구조체 안의 변수도 속성이라고 부르고 함수도 메소드라고 부릅니다.

구조체 안의 변수 : "속성(property)"
구조체 안의 함수 : "메소드(method)"

클래스의 인스턴스 선언과 같이 var song : Name = Name()로 인스턴스를 선언해주고 변수를 출력해보고 메소드도 출력해보고, 변수를 바꿔보고 해서 결과를 출력 해보겠습니다.
결과도 잘 나오고 클래스때와 완전히 똑같이 나오네요!

여기서 클래스와 조금 다른 점을 하나 소개해 드리겠습니다. 저번 포스팅을 살펴보면 클래스에서는 초기화작업이 있었고 초기화 작업을 해서 인스턴스에 매개변수를 변경해줄 수 있엇습니다. (클래스 내부에 init()메소드 생성) 하지만 구조체에서는 자동으로 초기화 코드를 만들어 준답니다!! 매우 편리하죠~ 간단한 코드를 살펴보겠습니다.

struct Name {
    var name: String
    
    func my_name() {
        print("my name is \(name)")
    }
}

var song : Name = Name(name: "song")

print(song.name)
song.my_name()

위에 코드에서 name속성의 값을 선언하지 않고 인스턴스 선언시 매개변수로 넣어줬습니다. 클래스의 경우 init()메소드가 필요하지만 구조체에서는 이렇게만 코드를 작성하고도 문제없이 실행이 된답니다!

정말 실행이 잘 되었네요! 만약 클래스에서 name 속성의 값을 선언하지 않고 init()으로 초기화 함수까지 선언하지 않았다면 어떻게 될까요?
바로 오류가 뜨네요... 이렇게 클래스와 구조체의 차이점을 하나 발견했습니다.


구조체 초기화 (Initialization)

위에 보시는 것처럼 클래스와 달리 구조체는 구조체 멤버를 패러미터 네임으로하여 스위프트가 자동으로 초기화 코드를 만들어 줍니다. 물론 직접 초기화 코드를 작성할 수도 있습니다. 하지만 초기화 코드를 직접 정의하면 자동 초기화 코드는 저 이상 제공받지 못한답니다. 코드를 작성해보죠.

struct Name {
    var name: String
    var age: Int
    
    func my_name() {
        print("my name is \(name) and \(age) year's old")
    }
    
    init(name: String) {
        self.name = name
        self.age = 24
    }
}

var song : Name = Name(name: "song")

print(song.name)
song.my_name()

init() 초기화 함수를 이용하여 클래스와 동일한 방법으로 초기화를 해주었습니다. 하지만 여기서 눈여겨 봐야될 것이 변수 name과 age 저는 매개변수를 name밖에 선언을 안해주었습니다. init(name: String). 그리고 따로 age에는 24라는 정수형을 넣어주었구요. 하지만 인스턴스 생성을 할때 name의 매개변수밖에 정하지 못하게 되어있습니다. 즉, 자동 초기화에서는 정의할 수 있는 age변수를 직접 초기화를 쓴 여기서는 정의할 수 없는 거죠! 이것으로 초기화 코드를 직접 정의하면 자동 초기화 코드는 저 이상 제공받지 못한다는 사실을 알 수 있죠.


구조체 상속 (Inheritance)

클래스와 달리 구조체에는 상속할 수 없습니다. 정말 큰 차이점이라고 할 수 있네요. 두번째 차이점을 발견했습니다.


구조체는 상속도 할 수 없으니 클래스를 쓰는게 낫지 않을까라는 궁금증이 생길 수 도 있겠지만 클래스와 구조체는 비슷하지만 또 다른 차이점도 많이 존재한답니다. 다음 포스팅에서는 클래스와 구조체의 공통점, 차이점을 알아보고 언제 무엇을 써야할지 공부를 해보겠습니다. 그럼 오늘 하루도 수고많으셨습니다.

profile
[iOS / Swift] [React Native]

0개의 댓글