티스토리 뷰

출처

http://kka7.tistory.com/11





클래스와 구조체 개념


Swift 는 사용자 정의 클래스와 구조체에 대해
인터페이스와 구현 파일 구분이 필요하지 않다.

클래스나 구조체를 하나의 파일로 정의하고
클래스나 구조체를 다른 코드에서 사용하기 위한
외부 인터페이스는 자동으로 만들어진다.

클래스의 인스턴스를 전통적으로 객체라고 한다.
하지만 Swift 의 클래스와 구조체는 다른 언어에 비해 함수에 더 가깝고
클래스 또는 구조체의 타입 중 하나의 인스턴스로 적용할 수 있는 기능을 알아본다.


클래스와 구조체 비교

클래스와 구조체는 공통적으로 아래 역할을 모두 할 수 있다.

- 값을 저장하기 위해 프로퍼티 정의
- 함수를 제공하기 위해 메소드 정의
- 값에 대해 서브스크립트 문법으로 접근하기 위해 subscript 정의
- 초기 상태를 설정하기 위해 초기화 정의
- 기본적인 구현을 넘어 기능을 확장
- 표준 기능을 제공하는 프로토콜 사용

클래스는 가능하지만 구조체는 불가능한 것들이다.

- 상속 기능
- runtime 타입 캐스팅
- memory deallocation
- reference counting


정의 문법


struct
 SomeStructure {

    

}


class SomeClass {

    

}


struct Resolution {

    var width = 0

    var height = 0

}


class VideoMode {

    var resolution = Resolution()

    var interlaced = false

    var frameRate = 0.0

    var name: String?

}



클래스와 구조체 인스턴스

let someResolution = Resolution()

let someVideoMode = VideoMode()

someVideoMode.resolution.width = 1280

print("The width of someVideoMode is now \(someVideoMode.resolution.width)")




구조체 타입에 대한 멤버 초기화

모든 구조체는 자동으로 생성된 멤버 초기화를 가지며
새로운 구조체 인스턴스의 멤버 프로퍼티는 초기화에 사용할 수 있다.

클래스 인스턴스는 기본 멤버 초기화가 제공되지 않는다.


let vga = Resolution(width: 640, height: 480)





구조체와 열거형은 값 타입이다.

값 타입은 변수나 상수에 할당하거나 함수에 전달될 때
값을 복사한다. (copied)

사실상 Swift 의 모든 기본타입 (정수형, 실수형, Boolean, 문자열, 배열과 딕셔너리) 은 값 타입이고
화면 뒤에서 구조체처럼 구현된다.

let hd = Resolution(width: 1920, height: 1080)

var cinema = hd

cinema.width = 2048


print("cinema is now \(cinema.width) pixels wide"// 2048

print("hd is still \(hd.width) pixels wide")    // 1920






클래스는 참조타입이다.

참조 타입은 변수나 상수를 할당하거나
함수로 전달할 때 복사되지 않는다.

복사 대신에 기존 인스턴스에 대해 참조한다.

let tenEighty = VideoMode()

tenEighty.frameRate = 25.0


let alsoTenEighty = tenEighty

alsoTenEighty.frameRate = 30.0


print("The frameRate property of tenEighty is now \(tenEighty.frameRate)"// 30





식별 연산자 ( ===, !== )

클래스는 참조 타입이기 때문에 동일한 하나의 클래스 인스턴스에 대해

여러 개의 상수와 변수로 참조가 가능하다.


두 개의 상수나 변수가 명시적으로 같은 클래스의 인스턴스를 참조하고 있는지

찾아내는 것은 유용하며, Swift 는 두 개의 식별 연산자를 제공한다.


if tenEighty === alsoTenEighty {

    print("tenEighty and alsoTenEighty refer to the same VideoMode instance.")

}


=== 는 클래스를 참조하는 두 개의 상수나 변수가

명시적으로 같은 클래스 인스턴스이다라는 것을 의미한다.




포인터

다른 언어들은 메모리 주소에 대한 참조를 위해 포인터를 사용한다.
Swfit 는 주소를 포인터로 직접 가리키지 않고
참조 생성을 나타내는 별표 ( * ) 작성도 필요하지 않다.
대신 참조는 스위프트의 모든 다른 상수나 변수처럼 정의된다.



클래스와 구조체 선택하기

클래스와 구조체 둘 다 사용자 정의 데이터 타입을 정의하기 위해
코드의 블록을 만들어 사용할 수 있다.

하지만 구조체 인스턴스는 값으로 전달되고
클래스 인스턴스는 참조 ( reference ) 로 전달된다.
이는 다양한 종류의 작업에 적합하다는 것을 의미한다.

구조체는 아래의 경우 생성을 고려한다.

- 비교적 단순한 데이터 값을 캡슐화 할 때
- 구조체의 인스턴스를 전달할 때 해당 인스턴스가 참조보다는 복사되는 것을 기대할 때

- 저장되어 있는 모든 프로퍼티가 값 타입일 때

- 기존 다른 타입으로부터 프로퍼티나 동작들 상속이 필요하지 않을 때


구조체의 좋은 예제로는

- 도형의 크기에서 width, height 를 캡슐화 할 때

- 시리즈의 범위를 참조하는 방법으로 start, length 를 캡슐화 할 때

- 좌표에서 x, y, z 를 정할 때

등이 있다.






문자열, 배열, 딕셔너리에 대한 할당과 복사

Swift 에서 String, Array, Dictionary 와 같은 기본 데이터 타입들은
구조체로 구현된다.

이는 문자열, 배열, 딕셔너리 같은 데이터가 새로운 상수나 변수에 할당하거나
함수나 메소드에 전달될 때 복사되는 것을 의미한다.

이 동작은 Objective-C 와 다르다.
NSString, NSArray, NSDictionary 는 구조체가 아닌 클래스로 구현된다.




공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함