클래스와 구조체에 대해 알아보겠다.
클래스와 구조체란 OOP(Object Oriented Programming)을 위한 필수적인 요소로 코드 추상화를 위해 사용된다.
Swift에서 클래스와 구조체는 많은 공통점이 있다.
- 값을 저장하기 위한 Property(변수,상수..) 정의
- 기능을 제공하기 위한 Method(func) 정의
- subscript 문법을 이용해 특정 값을 접근할 수 있는 subscript 정의
- 초기 상태를 설정할 수 있는 initializer 정의
- 기본 구현에서 기능 확장
- 특정한 종류의 표준 기능을 제공하기 위한 프로토콜 순응(conform)
구조체는 불가능 하지만 클래스는 가능한 것은
- 상속 (Inheritance) : 클래스의 여러 속성을 다른 클래스에 물려 줌 (SuperClass - SubClass)
- 타입 캐스팅 (Type casting) : 런타임에 클래스 인스턴스의 타입을 확인
- 소멸자 (Deinitializers) : 할당된 자원을 해제(free up) 시킴
- 참조 카운트 (Reference counting) : 클래스 인스턴스에 하나 이상의 참조가 가능
선언
struct Greetings {
let kor = "안녕하세요"
let us = "Hello"
let de = "Guten Morgen"
}
class Sir {
let korMan = "지성"
let deMan = "Dogil"
let usMan = "Alice"
let greetings = Greetings() //위 구조체를 인스턴스로 사용
}
왜 첫줄이 저래 넘어가는진 모르겠지만. . 코드블럭 상이니 신경쓰지말자
프로퍼티 접근
//인스턴스 생성
let greetingInstance = Greetings()
let sirInstance = Sir()
//프로퍼티 접근
print("\(greetingInstance.kor), \(sirInstance.korMan)")
print("\(sirInstance.greetings.kor), \(sirInstance.korMan)")
dot(.) 문법을 통해 하위 프로퍼티나 메소드에 접근할 수 있다.
구조체는 값 타입이다. (Value Type)
값 타입이란 함수에서 상수나, 변수로 전달 될 때 그 값이 복사되서 전달되는 것이다. 구조체(Structue)와 열거형(Enum)은 값 타입이다.
증명해보자
//struct, enum 값 타입
var jsInform: Inform = Inform(name: "Js", age: 22 )
jsInform.age = 50
print(jsInform.age) // 50
var jsJJacktung: Inform = jsInform
jsJJacktung.age = 100
print(jsJJacktung.age) // 100
jsJJacktung의 age 프로퍼티를 변경시켜도 값만 복사되었기때문에 본체인 jsInform에겐 아무런 영향을 주지 않는 것을 알 수 있다.
하지만
클래스는 값 타입과 달리 참조 타입이고, 참조 타입은 변수나 상수에 값을 할당을 하거나 함수에 인자로 전달할 때 그 값이 복사되지 않고 참조 됩니다. 참조된다는 의미는 그 값을 갖고 있는 메모리를 바라보고 있다는 뜻입니다.
예제
class Student {
var name : String
var age : Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func print() {
print("name: \(name), age: \(age)")
}
//기본 print() 함수를 사용하면 주소값이 출력되기 때문에 직접 함수로 구현함.
}
let std1 = Student(name: "Peter", age: 17)
std1.print()
//name: Peter, age: 17
let std2 = std1
std2.print()
//name: Peter, age: 17
std2.name = "Ken"
std2.print()
std1.print()
//name: Ken, age: 17
//name: Ken, age: 17
//std2의 프로퍼티 값을 변경하면 원본인 std1의 프로퍼티 값도 함께 변경된다.
내가 이해하기위한 요약
superclass = 부모
subclass = 자식
superclass -> subclass 에게 가르침. properties, method.. etc
subclass는 부모에게 배운 것을 스스로 개발, 성장 할 수 있음
구조체 struct의 내부 메소드는 구조체 내부에서 변경할수 없음(Compile Error) - mutating func 활용, 차후 알아볼 계획
구조체와 클래스의 차이점은 예를 들어 내가 찍은 사진을 남에게 주고싶을때 구조체는 사진을 복사해서 주지만,
클래스는 reference, 즉 내 컴퓨터나, 핸드폰에서 사진의 위치를 알려주고, 권한을 부여해주는 것이다.
내 컴퓨터나, 핸드폰에서 사진을 지우면 친구는 그 사진을 가질 수 없음 또한 엑세스를 부여받은 친구가 사진을 실수로 망가뜨리거나, 삭제한다면 사진의 주인인 자신 또한 그 사진을 더 이상 볼 수 없게된다.
그래서 애플은 항상 기본적으로 구조체를 생성할 것을 권장한다.
따라서 새 객체를 생성할때 마다 구조체를 생성하는 것으로 시작하는 것이 좋다.
그러나 상속이 필요하거나 오래된 objc 코드로 작업해야 하는 경우 구조체를 클래스로 변경하여 사용하면된다.
구조체: immutable, passed by value / 클래스: passed by reference, inheritance
'iOS > Swift' 카테고리의 다른 글
[Swift] Optional (1) (0) | 2021.08.18 |
---|---|
[Swift] Struct Mutating (0) | 2021.08.11 |
계산기 (0) | 2021.08.07 |
[Swift] 컬렉션 타입 (Dict) (0) | 2021.08.02 |
[Swift] 컬렉션 타입 (Set) (0) | 2021.06.05 |
댓글