본문 바로가기
프로그래밍/Spring

16. 구조체와 클래스

by Mr-후 2019. 2. 23.
반응형

구조체와 클래스 


구조체와 클래스에는 내용이 상당히 많은 편인데, 간략하게 정리하고 넘어간다. 이 파트를 재 학습을 한 이유는 실무에서 접한 코드에서 구조체가 다양하게 많이 쓰여지고 있었고 물론 클래스가 더 많지만, 구조체의 적절한 사용 방안에 대한 생각을 정립해보기 위해서다. 

구조체와 클래스의 가장 큰 차이는 값과 참조의 차이다. 이 개념은 값을 전달하느냐 참조를 전달하느냐에 차인데 참조란 C 의 포인터 같은 개념으로 어느정도 프로그래밍에 대한 사전 지식이 있다면 무난하게 이해할 수 있는 부분이다. 


구조체늬 인스턴스는 값 타입고, 클래스의 인스턴스는 참조 타입이라는 것이다. 


1.구조체 

구조체는 struct 키워드로 정의한다. (대문자 카멜케이스를 사용) 

struct Person {

var name: String 

var age: Int

기본적으로 생성된 이니셜라이저의 매개변수는 구조체의 프로퍼티 이름을 자동 지정한다. 인스턴스를 생성 후 프로퍼티에 접근하기위해서는 마침표 ( . )를 사용한다. 구조체를 상수 let으로 선언하면 인스턴스 내부의 프로퍼티 값을 변경할 수 없고 var로 선언하면 내부의 프로퍼티가 var로 선언된 경우에는 값을 변경할 수 있다. 


사용예: 

var aUser: Person = Person(name: "youghu", age: 99)

aUser.age = 45


let aUser: Person = Person(name: "younghu", age: 99)

aUser.age = 45 // 변경불가 Error 


2.클래스 

스위프트의 클래스는 부모를 상속받지 않고도 단독으로 정의가 가능하다. 클래스를 정의할 때는 class라는 키워드로 사용한다. 

클래스 역시 대문자 카멜케이스를 사용한다. 

class 클래스 이름 {

프로퍼티와 메서드들

}

부모 클래스를 상속받을 때는 

class 클래스 이름 : 부모 클래스 이름 { 

프로퍼티와 메서들 

}

콜론 ( : )을 사용해준다. 


class Person {

var height: Float = 0.0

var weight : Float = 0.0

}

구조체와 다르게 클래스의 인스턴스는 참조 타입이므로 클래스의 인스턴수를 상수 let으로 선언해도 내부 프로퍼티 값을 변경할 수 있다. 


클래스 인스턴스의 소멸에는 deinit이라는 디이니셜라이저가 호출된다. (구현하면...) 

class Person {

var height: Float = 0.0

var weight: Float = 0.0

deinit {

print("클래스가 소멸될 때 호출된다.")

}

}

var aUser: Person? = Person()

aUser = nil  // Person클래스의 인스턴스가 소멸된다 : deint이 호출됨 


3. 구조체와 클래스의 차이

같은점: 

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

다른점: 

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


스위프트의 기본 데이터 타입은 모두 구조체로 정의 되었다. 

public struct String {

///An empty 'String' 

public init()

Bool, Int, Array, Dictionary, Set 등등.. 


자 정리, 

구조체와 클래스를 각각 어떨 때 사용하면 좋은가? 

구조체와 클래스는 새로운 데이터 타입을 정의하고 기능을 추가한다는 점이 같다. 구조체 인스턴스는 항상 값 타입이고, 클래스는 인스턴스  참조타입이다. 생긴건 비슷하지만 용도는 다르다는 의미, 

프로젝트의 성격에 따라, 

데이터의 활용도에 따라, 

특정 타입을 구현할 때 구조체와 클래스 둘 중 하나를 선택해서 사용해야 한다. 


애플 가이드라인에서 제시한 구조체를 사용하는 것을 권장하는 다음 조건을 참고 

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


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


반응형