[iOS] Struct

r1verfuture·2022년 4월 14일
0

iOS

목록 보기
18/30

Struct

  • 구조체
  • 값 타입 (value type / call by value)
  • 인스턴스의 값 (프로퍼티) 을 저장하거나 기능 (메소드) 을 제공하고 이를 캡슐화할 수 있는 타입
  • Swift 대부분의 큰 뼈대로 쓰이는데, 대표적인 예시로 데이터 타입들이 struct 로 이루어져 있다는 것을 들 수 있다. (실제로 Int, Double 등의 데이터 타입에 command 키 눌러서 정의를 보면 struct 로 이루어져 있는 것을 볼 수 있다.)
  • 상속은 불가능하지만, 프로토콜 채택은 가능하다. (데이터 타입 중 Int 의 정의 부분을 보면, 'public struct Int : SignedInteger, Comparable, Equatable' 이라고 되어 있는데 이때 ':' 뒤의 것들은 class 를 상속받은 것이 아니라 프로토콜을 채택한 것이다.)
  • extension 이 가능하다.
  • 일반적으로는 스택에 저장되며, 일정 크기 이상이 되면 에 저장된다.
  • init() 가 아니라 구조체의 프로퍼티들을 매개변수로 사용하여 초기화한다.
  • 인스턴스가 생성 & 초기화된 후에 인스턴스의 프로퍼티에 접근하고 싶을 경우에는 '.' 를 사용한다.
  • 구조체를 상수 (let) 로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없지만, 변수 (var) 로 선언하면 내부의 프로퍼티 값 중 var 로 선언된 것들은 변경 가능하다.
// MARK: [코드 1] Name 구조체 생성
struct Name {
	var name = "r1verfuture"
    
    func printMyName() {
    	print("My name is \(name) ! Nice to meet you ~")
    }
}

var r1verfuture : Name = Name()
print(r1verfuture.name)
r1verfuture.printMyName()

r1verfuture.name = "whatso sister"
r1verfuture.printMyName()
  • [코드 1] 을 실행하면 10번째줄에서 'r1verfuture' 이 출력되고, 11번째줄에서 'My name is r1verfuture ! Nice to meet you ~' 가 출력되고, 14번째줄에서 'My name is whatso sister ! Nice to meet you ~' 가 출력된다.
  • Name 이라는 구조체 안에 있는 name 은 프로퍼티 / 속성 이고, printMyName() 은 메소드이다.
// MARK: [코드 2] Name 구조체 생성 2
struct Name {
	var name: String
    
    func printMyName() {
    	print("My name is \(name) ! Nice to meet you ~")
    }
}

var r1verfuture : Name = Name(name: "r1verfuture")
print(r1verfuture.name)
r1verfuture.printMyName()
  • [코드 1] 은 구조체의 프로퍼티에 직접 값을 넣어둔 방식이지만, [코드 2] 는 구조체의 프로퍼티에는 값을 넣지 않고 매개변수를 통해 값을 넣어주는 방식이다.
// MARK: [코드 3] 구조체를 상수로 선언했을 때와 변수로 선언했을 때의 차이
struct MyInformation {
	var name: String
    var age: Int
}

var r1verfuture : MyInformation = MyInformation(name: "r1verfuture", age: 25)
r1verfuture.age = 100
r1verfuture.name = "r2verfuture"

let whatso : MyInformation = MyInformation(name: "whatso", age: 4)
whatso.age = 100
  • [코드 3] : 'r1verfuture' 랑 MyInformation 의 프로퍼티인 name & age 가 변수로 선언되어 있기 때문에 변경 가능하지만, 'whatso' 는 상수로 선언되어 있기 때문에 변경이 불가능하다. (MyInformation 의 프로퍼티들은 모두 변수로 선언되어 있을지라도 ..)

Value Type (Call By Value)

  • 데이터를 전달할 때 값을 복사하여 전달한다.
  • 원본은 그대로 유지된다. (안전하다.)
  • 시스템 리소스를 적게 먹는다. (속도가 빠르다.)

Struct 는 언제 사용할까 ?

  • 참조가 아닌 복사를 원할 때 (값 타입이기 때문이다.)
  • 자신을 상속할 필요가 없을 때
  • 자신이 다른 타입을 상속받을 필요가 없을 때
  • 연관된 몇몇의 값들을 모아서 하나의 데이터 타입으로 표현하고 싶을 때

참고

profile
#iOS #Swift #Developer #Python

0개의 댓글

관련 채용 정보