Struct는 '값 타입' 입니다.
스위프트의 대부분의 타입은 구조체로 이루어져 있습니다.
구조체는 클래스와 합께 OOP를 위한 필수요소이며,
프로그램의 코드를 추상화하기 위해 사용합니다.
siwft의 구조체는 다른 언어와는 다르게 별도의 인터페이스 파일을 만들 필요가 없습니다.
구조체와 클래스는 모두 새로운 데이터 타입을 정의하고 기능을 추가합니다.
하지만 구조체는 '값 타입', 클래스는 '참조 타입'이라는 차이가 있죠.
둘중 하나를 어떤 기준으로 선택해서 사용해야 할까요?
애플 공식 문서에서는 다음 조건 중 하나 이상에 해당된다면 구조체 사용을 권합니다.
- 연관된 간단한 값의 집합을 캡슐화 하는 것만이 목적일 때
- 캡슐화된 값이 참조되는 것보다 복사되는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값 타입이며 참조되는 것보다 복사되는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신이 상속될 필요가 없을 때
위의 문서를 클래스글까지 작성하고 나서 찾아보게 됬는데...
제가 만든 예시는 구조체를 사용하기 적합하지 않은 예시군요..ㅠㅠ
그래도 클래스와의 사용 차이점을 보기에 용이하니 참고만 해주세요 ^^...
기본 형태
struct 이름{
//구현
}
프로퍼티 및 메서드 구현
import Foundation
struct Food{
//불변 프로퍼티
let writer = "녹색하늘"
//가변 프로퍼티
var name = "초밥"
var price = 3000
static var location = "안양"
//인스턴스 메서드
func instanceMethod(){
print("리뷰 평이 아주 좋습니다.")
}
//타입 메서드
static func typeMethod(){
print("직원들도 친절합니다.")
}
}
출력 함수
func printFood(_ input : Food){
print( "작성자 : \(input.writer)" )
print( "\(input.name)은 \(input.price)원 입니다." )
print( "위치는 \(input.location)에 있습니다" ) //error
print( "위치는 \(Food.location)에 있습니다" )
input.instanceMethod()
input.typeMethod() //error
Food.typeMethod()
print("---------------------")
}
구조체의 인스턴스를 매개변수로 받아서 프로퍼티에 접근하는
간단한 출력함수를 만들어 보았습니다.
error의 위치를 보면 알 수 있듯 타입 프로퍼티는
인스턴스에서 접근이 불가능합니다.
직접 구조체에 접근해 사용해야 합니다.
구조체 사용
var food1 : Food = Food()
printFood(food1)
/*
작성자 : 녹색하늘
초밥은 3000원 입니다.
위치는 안양에 있습니다
리뷰 평이 아주 좋습니다.
직원들도 친절합니다.
*/
구조체는 이렇게 인스턴스를 생성해 사용합니다.
별다른 값 수정없이 단순히 인스턴스를 사용한 모습입니다.
var food2 : Food = Food()
food2.writer = "푸른하늘" //error
food2.name = "한정식"
food2.price = 104500
food2.location = "과천" //error
printFood(food2)
/*
작성자 : 녹색하늘
한정식은 104500원 입니다.
위치는 안양에 있습니다
리뷰 평이 아주 좋습니다.
직원들도 친절합니다.
*/
이번엔 인스턴스를 생성한 대신, 프로퍼티에 접근해
값을 변경해서 사용한 경우입니다.
불변 프로퍼티는 당연히 변경이 불가능하겠죠?
그리고 타입 메서드는 위의 출력함수에서 보았듯,
인스턴스에서 접근도 안되며 재정의도 불가능합니다.
아? 그러면 구조체 Food 안에 있는 타입 메서드는 변경 못해도
인스턴스 메서드는 변경하거나 재정의 할 수 있는거 아녜요?
네, 안됩니다.
구조체는 메서드를 변경하거나 재정의할 수 없습니다.
이는 클래스에서 구현이 가능합니다.
이 내용은 다음글 클래스에서 설명하도록 하겠습니다.
공부에 도움을 준 사이트들
전체적인 공부 가이드라인
구조체와 클래스 알아보기
구조체/클래스의 프로퍼티 종류에대한 상세한 예제와 설명
https://velog.io/@budlebee/Swift-5-프로퍼티Property
'Language > Swift' 카테고리의 다른 글
Swift 사용자 정의 타입 - enum (0) | 2021.03.11 |
---|---|
Swift 사용자 정의 타입 - Class (0) | 2021.03.11 |
Swift 옵셔널 (0) | 2021.03.11 |
Swift 반복문 (0) | 2021.03.10 |
Swift 다양한 switch-case 패턴들 (0) | 2021.03.09 |