[Swift] 구조체와 클래스

김태형·2023년 3월 19일
0

Swift

목록 보기
10/22

이번 포스팅은 구조체와 클래스에 대해 작성하고자 한다.
사실 우리가 변수 하나만 가지고 원하는 것을 만드지 못한다. 따라서 여러 가지 변수를 통해 모델을 만드는데, 이 모델을 class와 struct로 생성할 수 있는 것이다.


구조체 (struct)

  • 기본 데이터 타입은 모두 구조체로 이루어져 있음
  • upper camel case (타입을 정의하는 것이기 때문)
  • 생성자를 자동으로 만들어주기 때문에 꼭 생성할 필요는 없음
  • 값 타입 : 전달될 값이 복사되어 전달됨 --> 선언된 인스턴스들은 다 다른 것들임 (singleton 제외)
  • 값 타입이기 때문에 참조 횟수 계산이 적용되지 않음
  • 값 타입이기 때문에 멤버변수의 이름을 그냥 바꾼다고 해서 바뀌지 않음
    -> mutating을 통해 바꿔줌
  • 상속할 수 없음
struct Student {    //구조체 선언
	var name: String = "unknown"    //가변 프로퍼티
	var `class`: String = "Swift"   //백틱 : class라는 변수명을 쓰고 싶어서 사용,   가변 프로퍼티
	
	static func selfIntroduce() {   //타입 메서드
		print("학생타입입니다")
	}

	func selfIntroduce() {   //인스턴스 메서드
		print("저는 \(self.class)반 \(name)입니다")
	}
}



Student.selfIntroduce()   //학생타입입니다. (구조체 타입 자체(Student)를 가져왔기 때문에 타입메서드를 사용 가능

var yagom: Student = Student()   //인스턴스 선언 (가변 인스턴스)
yagom.name = "yagom"
yagom.class = "스위프트"
yagom.selfInroduce()   //저는 스위프트반 yagom입니다. (가변 인스턴스이기 때문에 인스턴스 메서드가 사용됨)


클래스 (class)

  • upper camel case (타입을 생성하는 것이기 때문)
  • 참조 타입
  • 상속 가능
    - 클래스 이름 뒤에 콜론(:)을 붙이고 부모클래스 이름을 명시
  • init을 통해 생성자를 만들어줘야 함 (메모리에 올린다)
  • 참조 횟수 계산(reference counting)이 적용됨
  • 참조가 필요없을 때 메모리에서 해제됨 (ARC 관련)
    - deinit을 통해 인스턴스가 메모리에서 해제되기 직전에 처리할 코드를 작성할 수 있음
  • 인스턴스에서 타입캐스팅이 허용됨
  • 참조 타입이기 때문에 인스턴스를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있음
  • 식별 연산자(===, !==)를 통해 참조가 같은지 확인 가능
let jenny: Person = Person()    
jenny.height = 123.4    //가능
jenny.weight = 123.4    //가능  

구조체 vs 클래스

구조체 : 값타입
클래스 : 참조타입

구조체 : 전달될 값이 복사되어 전달됨 (새로운 것이 계속 생성되는 느낌)
클래스 : 전달될 값이 복사되는 것이 아니라 기존 인스턴스의 참조(주소)가 전달됨 (그렇다고 모든 인스턴스들이 같은 값을 가진다는 뜻은 아님. 그냥 주소에서 클래스만 가져오는 느낌,,?)

class Person {
  var name: String
  var age: Int

  init(name: String, age: Int) {
    self.name = name
    self.age = age
  }
}

var A = Person(name: "aa", age: 12)
var B = Person(name: "bb", age: 13)

print(A.name)    //aa
print(B.name)    //bb
print(A.name)    //aa

//기존 인스턴스의 참조를 전달한다고 해서 변수에 들어가는 값이 같아진다는 뜻은 아님!


[출처] 스위프트 프로그래밍 (야곰), 야곰의 스위프트 기초문법 강좌, 개발하는 정대리 스위프트 강좌

0개의 댓글