오늘은 구조체에 대해 알아보았다.
sturct 이름 {
/* 구현부 */
}
구조체의 정의는 위 코드와 같다.
프로퍼티 및 메서드
// 메서드 - 타입 안에 들어가 있는 함수
struct Sample { // 프로퍼티 - 어떤 함수 안에 들어가 있는 변수
var mutableProperty: Int = 100 // 가변 프로퍼티
let immutableProperty: Int = 100 // 불편 프로퍼티
static var typeProperty: Int = 100 // 타입 프로퍼티
// 인스턴스 메서드
func instanceMethod() {
print("instance method")
}
static func typeMethod() {
print("type method")
}
}
메서드는 타입안에 들어가 있는 함수 를 의미하고 프로퍼티란 어떤 함수 안에 들어가 있는 변수를 의미한다.
위 코드를 보면 Sample 구조체를 만들게 되었는데, 구조체 안에 들어가 있는 것들을 살펴보면,
먼저 var 로 지정된 가변 프로퍼티가 보이고, let 로 지정된 불변 프로퍼티가 생성되어있다.
메서드는 구조체 안에 들어가 있는 함수라고 생각하자.
static을 붙이면 sample에서 사용할 수 있는 타입 프로퍼티가 된다.
func instanceMethod() 는 인스턴스에서 사용할 수 있는 메서드이고,
static func typeMethod() 는 타입에서 사용할 수 있는 메서드 이다.
그러니까 각자 사용할 수 있는 곳이 다르기 때문에 다 다르게 선언을 해줘야 한다.
구조체 사용
// 가변 인스턴스
var mutable: Sample = Sample()
// mutable.mutableProperty = 200
// 가변 프로퍼티는 변환이 가능하지만
// mutable.immutableProperty = 200
// 불변 프로퍼티는 변환이 불가능하다.
가변 인스턴스의 사용을 먼저 보겠다.
가변 인스턴스는 Sample 이라는 type이 됐다. 그리고 var 타입으로 선언이 됐기 때문에 구조체 내에서 가변 프로퍼티로 선언한 것만 변환이 가능하다. 마지막 줄의 불변 프로퍼티를 가지고와 변환을 시도하면, 에러가 발생한다.
// 불변 인스턴스
let immutable: Sample = Sample()
//immutable.mutableProperty = 200 // let 으로 선언한 불변 인스턴스는 아무리 안에 가변 프로퍼티로 만들어놨다고 해도 변경이 불가능하다.
//immutable.immutableProperty = 200 // 이것도 마찬가지이다.
불변 인스턴스를 보면
위와 같이 Sample을 선언했고, let으로 불변 인스턴스로 선언하였다.
따라서 구조체에서 가변 프로퍼티로 선언을 했다고 해도, 불변 인스턴스로 선언한 위 코드 때문에 구조체에 있는 프로퍼티는 다 변환이 불가능하다.
타입 프로퍼티 및 메서드
Sample.typeProperty = 300
Sample.typeMethod() // type method
//mutable.typeProperty = 400 // 인스턴스에서 타입 프로퍼티를 사용하려고 하면 에러가 발생한다.
//mutable.typeMethod() // 인스턴스에서 타입 메서드를 사용하려고 해도 에러가 발생한다.
//따라서 타입 프로퍼티와 메서드를 사용하려면 위와 같이 Sample 과 같은 타입이 있어야 한다.
Sample 타입 자체가 사용할 수 있는 프로퍼티와, 메서드를 뜻한다.
아래 주석처리 처럼 인스턴스에서 프로퍼티를 사용하려고 하면 에러가 발생한다.
struct Student {
var name: String = "unknown"
var `class`: String = "Swift"
// class 앞뒤로 있는 것을 사용할 경우 기존에 있는 단어들을 무시하고 오로지
// 단어 그 자체의 기능으로 사용할 수 있게 해준다.
// 타입 메서드
static func selfIntroduce() {
print("학생입니다.")
}
// 인스턴스에서 사용할 수 있는 인스턴스 메서드
func selfIntroduce() {
print("저는 \(self.class)반 \(name) 입니다.")
}
}
// Student 라는 타입이 자체적으로 사용할 수 있는 selfIntroduce() 라는 것을 만들어
// 뒀기 때문에 학생타입입니다 라고 실행되는 타입 메서드가 실행되었습니다.
Student.selfIntroduce() // 학생 타입입니다.
var ITlearning: Student = Student()
ITlearning.name = "ITlearning"
ITlearning.class = "스위프트"
ITlearning.selfIntroduce()
// 인스턴스를 만들어준 다음에, 인스턴스 메서드로 구현된 메서드를 호출하게 된다.
let jina: Student = Student()
// 불면 인스턴스이므로 프로퍼티 값 변경 불가
// 컴파일 오류 발생
//jina.name = "jina"
//그렇지만 메서드는 호출은 가능하다.
jina.selfIntroduce()
위 클래스 앞 뒤로 있는 것을 사용하면 오로지 단어 그 자체의 기능으로사용이 가능하다.
Student 라는 타입이 사용할 수 있는 selfIntroduce 라는 기능을 만들어놨기 때문에 Student.selfIntroduce() 를 사용할 수 있고,
그 아래 인스턴스를 만들어 준 다음, selfIntroduce()를 사용하면, 인스턴스용 selfIntroduce() 를 만들어 놨기 때문에 그걸로 구동이 된다.
마지막 단의 코드는 불변 인스턴스 이다.
불변 인스턴스는 프로퍼티 값이 변경 불가하다. 변경을 하려고 코드를 입력하면 컴파일 오류가 발생하기 마련이다.
그렇지만 메서드 호출은 가능하다.
어렵다..스위프트..
댓글