본문 바로가기
⌨️ Language/swift

[Swift] 클래스(Class)와 구조체(Struct)

by hyebin (Helia) 2023. 2. 6.

클래스(Class)

  • 클래스를 정의하여 객체를 만들고 사용 가능
  • 클래스를 만들어 클래스에서 생성된 객체인 인스턴스를 만들어 사용
  • 클래스 안의 변수 프로퍼티(Property)와 클래스 안의 함수 메서드(Method)로 구성
class Name {
    var name = "Hyebin" //프로퍼티
    
    //메서드
    func my_name() {
        print("my name is \(name)")
    }
}

//인스턴스 생성
let hyebin : Name = Name()

print(hyebin.name)	// Hyebin
hyebin.my_name()	// my name is Hyebin

hyebin.name = "yoo"
hyebin.my_name()	// my name is yoo

 

클래스 초기화 (Initialization)

  • 인스턴스를 만들 때 자동으로 호출되는 초기화 처리 전용의 메서드
class Name {
    var name : String
    var age : Int
    
    init(name:String, age:Int) {
        self.name = name
        self.age = age
    }
    
    func my_name() {
        print("my name is \(name) and \(age) year's old")
    }
}

let name1 : Name = Name(name: "hyebin", age: 25)
let name2 : Name = Name(name: "abc", age: 32)

name1.my_name() //my name is hyebin and 25 year's old
name2.my_name() //my name is abc and 32 year's old

Name 클래스 안의 프로퍼티에 값을 지정하지 않고 init() 함수를 사용해 초기화

self는 자기 자신을 가리키는 것, self. 이 붙은 변수들은 클래스 내의 변수라는 것

 

클래스 상속 (Inheritance)

  • 기존의 클래스의 모든 기능을 이어받아 새로운 클래스를 정의하는 것
  • 이미 편리한 클래스가 있다면, 그 클래스를 상속받아 기능을 덧붙여 새로운 클래스 생성 가능
class Name { //부모 클래스
    var name = "Hyenbin"
    
    func my_name() {
        print("my name is \(name)")
    }
}

class Email : Name {  //자식 클래스
    var email = "123@naver.com"
    
    func myInfo() {
        print("my name is \(name) and my email is \(email)")
    }
}

let hyebin : Email = Email()

print(hyebin.name)  // Hyenbin
print(hyebin.email) //123@naver.com

hyebin.my_name()    //my name is Hyenbin
hyebin.myInfo()     //my name is Hyenbin and my email is 123@naver.com

 

 

구조체 (Struct)

  • 인스턴스의 값(프로퍼티)을 저장하거나 기능(메서드)을 제공하고 이를 캡슐화할 수 있는 스위프트가 제공하는 타입(named type)
  • 구조체 안의 변수 프로퍼티(Property)와 구조체 안의 함수 메서드(Method)로 구성
struct Name {
    var name : String = "Hyebin"
    
    func my_name() {
        print("my name is \(name)")
    }
}

var hyebin : Name = Name()

print(hyebin.name)  //Hyebin
hyebin.my_name()    //my name is Hyebin

hyebin.name = "Yoo"
hyebin.my_name()    //my name is Yoo
  • 클래스와 달리 프로퍼티의 값을 선언하지 않고 인스턴스 선언 시 매개변수로 선언 가능
struct Name {
    var name : String
    
    func my_name() {
        print("my name is \(name)")
    }
}

var hyebin : Name = Name(name: "hyebin")

print(hyebin.name)  //Hyebin
hyebin.my_name()    //my name is Hyebin

 

구조체 초기화 (Initialization)

  • 구조체 멤버를 파라미터 네임으로 하여 스위프트가 자동으로 초기화 코드를 만들어줌
  • 직접 init()을 사용하여 초기화 코드 작성 가능, 초기화 코드 직접 작성 시 자동 초기화 코드 제공 안됨
struct Name {
    var name : String = "Hyebin"
    var age: Int
    
    func my_name() {
        print("my name is \(name) and \(age) year's old")
    }
    
    init(name: String){
        self.name = name
        self.age = 25
    }
}

var hyebin : Name = Name(name: "hyebin")

print(hyebin.name)  //hyebin
hyebin.my_name()    //my name is hyebin and 25 year's old

 


클래스와 구조체의 공통점

  • 프로퍼티와 메소드를 사용하여 구조화된 데이터와 기능을 가짐
  • 새로운 사용자 정의 타입을 만들어 줌
  • 초기화(init)을 정의하여 초기 상태를 설정 가능
  • 확장(extension) 가능
  • 프로토콜(protocol) 사용이 가능
  •  특정 값에 접근할 수 있는 서브스크립트(subscript) 문법이 사용이 가능
  • 프로퍼티 값에 접근하고 싶다면, 점(dot) 문법을 사용

클래스와 구조체의 차이점

  • 클래스
    • 참조 타입 (Reference Type) 
      • 참조 타입: 변수나 상수에 값을 할당하거나 함수에 인자로 전달될 때 그 값이 복사되지 않고 참조된다는 의미
      • Call by reference : 할당 또는 파라미터 전달 시에 객체를 가리키고 있는 메모리의 주소 값이 복사됩니다.
    • Heap Memory 영역에 할당됩니다. 따라서 속도가 느림
    • 런타임에 직접 allocate 하며 reference counting 을 통해 deallocate가 필요
    • 상속이 가능
    • 런타임에 타입캐스팅을 통해 클래스 인스턴스에 따라 여러 동작이 가능
    • deinitializer 가 존재, 클래스 인스턴스의 메모리 할당을 해제 가능
  • 구조체
    • 값 타입 (Value Type) 
      • 값 타입: 함수에서 상수나 변수로 전달될 때 그 값이 복사되서 전달된 다는 의미
      • Call by value : 할당 또는 파라미터 전달 시 value copy가 발생
    • 값 타입이기 때문에 멀티 스레드 환경에서 공유 변수로 인한 문제를 일으킬 확률이 적음
    • Stack Memory 영역에 할당되므로 속도가 빠름
    • Scope based lifetime : 컴파일 타임에 컴파일러가 언제 메모리를 할당/해제할지 정확히 알고있음
    • Data loclity : CPU 캐쉬 히트율이 높음
    • 상속이 불가능
    • AnyObject로 타입 캐스팅이 불가
반응형

'⌨️ Language > swift' 카테고리의 다른 글

[Swift] assert와 guard  (0) 2023.02.06
[Swift] 타입 캐스팅  (0) 2023.02.06
[Swift] 옵셔널 (Optional)  (0) 2023.02.06
[Swift] 열거형 (Enumerations)  (0) 2022.02.08
[Swift] 함수(Functions)  (0) 2021.12.02

댓글