본문 바로가기
iOS/Swift

[Swift] Class & Structure

by Jiseong 2021. 8. 11.

클래스와 구조체에 대해 알아보겠다.

 

클래스와 구조체란 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

댓글