Xcode 9.*에서 Swift를 사용하는 경우 구조체(값 형식)과 클래스(참조 형식)을 비교해 보는 데모 코드입니다.

in #kr7 years ago (edited)

클래스는 참조 형식이라고 부릅니다. 구조체는 값형식입니다.

두가지 형식의 차이는 참조 형식은 간접적으로 참조정보를 저장해서 사용합니다. 값형식은 직접 값을 저장해서 사용하는 형식을 의미합니다.

var x: Int = 5 
var y: Int = x 

위와 같이 코딩하면 y라는 변수에는 x가 대입되는 것이 아닌 x의 값이 복사되서 대입됩니다. Swfit에서 정수형, 실수형, 불린형등은 모두 구조체로 정의되어 있으며 값형식 입니다.
구조체와 클래스를 비교해 보기 위한 코드입니다. 값이 전달된 경우(Call By Value, Pass By Value)는 서로 영향을 받지 않지만 참조가 전달된 경우(Call By Reference, Pass By Reference)는 참조가 복사되면서 원본이 변경되면 같이 영향을 받게 됩니다.

struct Resolution {
    var width = 0
    var height = 0
    
    func desc() -> String {
        return "Resolution 구조체"
    }
}

class VideoMode {
    var interlaced = false
    var frameRate = 0.0
    var name : String?
    var resolution : Resolution = Resolution()
    
    func desc() -> String {
        return "VideoMode 클래스"
    }
}

//VideoMode클래스에 대한 인스턴스를 생성하고 상수에 할당합니다. 
let vMode = VideoMode()

print("vMode 인스턴스의 width값은 \(vMode.resolution.width)")

//점 구문을 이용해서 인스턴스의 프로퍼티에 값을 할당합니다. 
vMode.name = "Sample"
vMode.resolution.width = 1280

print("\(vMode.name!) 인스턴스의 width 값은 \(vMode.resolution.width)")

//구조체의 값 전달 방식(값에 의한 전달)
let hd = Resolution(width: 1920, height: 1080)
var cinema = hd

cinema.width = 2048
print("cinema 인스턴스의 width 값은 \(cinema.width)입니다")
//복사가 되었기 때문에 영향을 받지 않는 것이 정상입니다. 
print("hd 인스턴스의 width 값은 \(hd.width)입니다")

//클래스의 값 전달 방식(참조에 의한 전달)
let video = VideoMode()
video.name = "Original Video Instance"
print("video 인스턴스의 name 값은 \(video.name!)")
//참조가 복사된다.
let dvd = video
dvd.name = "DVD Video Instance"
print("video 인스턴스의 name 값은 \(video.name!)")
print("dvd 인스턴스의 name 값은 \(dvd.name!)")

//전역 함수를 하나 정의한다. 
func changeName(v : VideoMode) {
    v.name = "Function Video Instance"
}

changeName(v: video)
print("video 인스턴스의 name 값은 \(video.name!)")

//동일 인스턴스인지 비교할 때 ===
//다른 경우 비교는 !==
if (video === dvd) {
    print("video와 dvd는 동일한 Video 인스턴스를 참조한다")   //여기 출력
} else {
    print("video와 dvd는 다른 Video 인스턴스를 참조한다")
}

//다른 참조인 경우 결과
let vs = VideoMode()
let ds = VideoMode()

if (vs === ds) {
    print("vs와 ds는 동일한 VideoMode 인스턴스를 참조하고 있다")
} else {
    print("vs와 ds는 다른 VideoMode 인스턴스를 참조하고 있다")  //여기 출력
}

Coin Marketplace

STEEM 0.17
TRX 0.16
JST 0.028
BTC 74526.95
ETH 2591.86
USDT 1.00
SBD 2.44