part2. 구조체와 클래스

구름코딩·2020년 8월 29일
0

구조체와 클래스는 프로퍼티와 메서드를 사용하여 구조화된 데이터와 기능을 가질수 있다
즉, 하나의 사용자 정의 데이터 타입을 만드는 것
구조체의 인스턴스는 값 타입이며, 클래스의 인서턴스는 참조 타입이다

소스피일 하나에 복수의 구조체나 클래스가 들어와도 아무 상관이없고 중첩 함수와 같이 중첩 구조체, 중첩 클래스 등의 중첩 타입의 정의 및 선언이 가능하다

구조체

//struct키워드를 이용하여 정의
    struct Student {
        //프로퍼티와 메서드
        var age: Int
        var name: String
    }
    var student_1: Student = Student(age: 10, name: "woon")
    student_1.age = 20  //변경가능
    student_1.name = "woonsik"  //변경가능
    print(student_1)
    let student_2 : Student = Student(age: 20, name: "byeori")
    //student_2.age = 23 //변경 불가능
    //student_2.name = "byori" //변경 불가능
    print(student_2)
//출력    
Student(age: 20, name: "woonsik")
Student(age: 20, name: "byeori")

클래스

//class키워드를 사용하여 정의
    class Person/*( : 상속받을 부모 클래스 이름 )*/{
        //프로퍼티와 메서드
        var height: Double = 0.0
        var weight: Double = 0.0
        
        func printInfo() {
            print("height: \(height), weight: \(weight)")
        }
    }
    class StudentC : Person {
        var ID: Int = 0
        var PhoneNumber: Int = 0
    }
    //참조 타입인 클래스의 인스턴스는 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다
    let 학생: StudentC = StudentC()
    let 행인: Person = Person()
    학생.height = 177
    학생.weight = 70
    학생.printInfo()
    행인.printInfo()
//출력
height: 177.0, weight: 70.0
height: 0.0, weight: 0.0

클래스 인스턴스의 소멸

클래스의 인스턴스는 참조타입이므로 더이상 참조할 필요가 없을 때 메모리에서 해제된다
이 과정을 소멸이라 하고 소멸 되기 직전 deinit이라는 메서드가 호출된다

클래스 내부에 deinit메서드를 구현해주면 소멸되기 직전의 deinit메서드가 호출되고 이 deinit 메서드디이니셜라이저라고 부른다

deinit메서드는 클래스당 하나만 구현할 수 있으며 매개변수와 반환값을 가질수 없다, 매개변수를 위한 소괄호도 올수 없다

deinit메서드를 구현하여 삭제되기전에 추가적인 처리를 진행 후 삭제하게 할 수 있다

    class Info {
        var age: Int = 26
        var name: String = "woonsik"
        
        func InfoPrint() {
            print("나이: \(age)\n이름: \(name)")
        }
        
        deinit {
            InfoPrint()
            print("delete info")
        }
    }
    let _: Info = Info()
//출력
나이: 26
이름: woonsik
delete info

구조체와 클래스의 차이점

공통점

  • 값을 저장하기 위해 프로퍼티를 정의할 수 있다
  • 기능 실행을 위해 메서드를 정의할 수 있다
  • 서브스크립트 문법을 통해 구조체 또는 클래스가 같는 값(프로퍼티)에 접근하도록 서브스크립트를 정의할 수 있다
  • 초기화 될 때의 상태를 지정하기 위해 이니셜라이저를 정의할 수 있다
  • 초기 구현과 더불어 새로운 기능 추가를 위해 익스텐션을 통해 확장할 수 있다
  • 특정 기능을 실행하기 위해 특정 프로토콜을 준수할 수 있다

차이점

  • 구조체는 상속할 수 없다
  • 타입캐스팅은 클래스의 인스턴스에만 허용된다
  • 디이니셜라이저(deinit)은 클래스의 인스턴스에만 활용 할수 있다
  • 참조 횟수 계산(reference counting)은 클래스의 인스턴스에만 적용된다

구조체는 값 타입이므로 전달인자로 전달될 값이 복사되어 전달된다
클래스는 참조 타입이므로 전달인자로 값이 복사되지 않고 참조(주소)가 전달된다

정보

스위프트의 기본 타입은 모두 구조체로 구현되어 있다

선택해서 사용하기

  • 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 때
  • 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
  • 구조체에 저장된 프로퍼티가 값 타입이며 참조하는 것보다 복사하는 것이 합당할 때
  • 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때

대다수의 사용자 정의 데이터 타입은 클래스로 구현할 일이 더 많다

profile
내꿈은 숲속의잠자는공주

0개의 댓글

관련 채용 정보