클래스와 구조체 정리

Swift의 클래스와 구조체에 대해 정리해보고자 한다.

1. 클래스

클래스 정의

// 클래스 정의
class Monster {
    var clothes = "Orange"
    var speed = 5
    var power = 20
    var expoint: Double = 500
    
    func attack() {
        print("공격!")
    }
}

클래스 내부에 선언된 변수를 프로퍼티, 함수를 메서드라고 부른다.

위 코드에서 clothes, speed 등이 프로퍼티, attack()이 메서드!

 

인스턴스

var easyMonster = Monster() // Monster 클래스의 인스턴스 정의

easyMonster.clothes // "Orange"
easyMonster.speed // 5

클래스 사용을 위해 만들어지는 객체를 인스턴스라고 부른다.

위 코드에서 easyMonster가 Monster 클래스의 인스턴스이다.

클래스 내부의 프로퍼티는 dot syntax로 접근할 수 있다!

 

상속

class BossMonster: Monster {
	var level = 100

	func attackBossSkill() {
		print("보스 공격")
	}
}

let boss = BossMonster() // BossMonster의 인스턴스 boss
boss.level // 100

boss.clothes // "Orange" // Monster 클래스의 프로퍼티와 메서드 사용 가능
boss.speed // 5
boss.attack()

클래스는 다른 클래스로부터 프로퍼티나 메서드를 상속받아 사용할 수 있다.

위 코드에서 BossMonster 클래스는 Monster 클래스를 상속받은 클래스로,

Monster 클래스 내부의 프로퍼티나 메서드를 사용할 수 있다.

이때 상속받은 클래스를 자식클래스(SubClass), 물려준 클래스를 부모클래스(SuperClass)라고 부른다.

 

재정의

class BossMonster: Monster {
    var levelLimit = 500
    
    func bossAttack() {
        print("스페셜 공격")
    }
    
    **override** func attack() { // 부모클래스로부터 가져와서 재정의하기 override
        **super.attack()** // 부모클래스의 기능 사용
        print("오버라이드 공격!")
    }
}

부모클래스로부터 물려받은 프로퍼티나 메서드를 자식클래스만의 기능으로 변경하여 사용하고 싶을 때, **재정의(override)**한다.

부모클래스의 기능도 함께 사용하고 싶다면 super 키워드를 붙여 사용한다.

 

2. 클래스와 구조체의 비교

구조체는 값 타입, 클래스는 참조 타입이다.

값 타입(value type)이라는 뜻은, 상수나 변수에 값이 전달될 때 그 값이 복사되어 전달된다는 의미이다.

반면 참조 타입(reference type)이라는건 값을 할당하거나 전달할 때 복사되지 않고 참조된다는 뜻을 가진다.

구조체와 클래스는 프로퍼티나 메소드를 정의할 수 있고 초기화를 할 수 있다는 점 등에서 공통적인 특징을 가진다.