클래스 Class 와 상속 Inheritance

Lena·2022년 1월 9일
0

Swift

목록 보기
6/8
post-thumbnail
  • 스위프트의 클래스는 부모클래스 없더라도 상속없이 단독으로 정의가 가능하다.
  • 보통 객체지향프로그래밍에서는 '객체'라고 표현하지만 스위프트 공식문서에서는 한정적인 '인스턴스' 용어를 사용한다.

클래스 정의하기

class MyClass { }

Enemy.swift :

class Enemy {
    var health = 100
    var attackStrength = 10
    // properties
    
    func move(){
        print("Walk forwards.")
    }
    
    func attack() {
        print("Land a hit, does \(attackStrength) damage.")
    }
    // methods 
}

클래스 초기화하기

MyClass()

main.swift :

let skeleton = Enemy()
print(skeleton.health)

skeleton.move()
skeleton.attack()

let skeleton2 = Enemy()
let skeleton3 = Enemy()
  • 인스턴스 생성, 초기화된 후 property 값에 접근하고 싶다면 . 를 이용해서 접근할 수 있다.
  • 구조체와는 다르게 클래스의 인스턴스를 상수 let으로 선언해도 내부 property 값을 변경할 수 있다
    : 클래스의 인스턴스는 참조 타입이므로

상속

class Myclass: SuperClass {}

SuperClassSubClass

SubClass는 SuperClass의 모든 property들과 method들을 상속받는다.

override

subclass에서 override 키워드를 사용하여 method를 생성하면 이는 superclass의 함수를 재정의한다는 것.
Dragon.swift :

class Dragon: Enemy {
    var wingSpan = 2
    
    func talk(speech: String){
        print("Says: \(speech)")
        
    }
    
    override func move(){
        // Super Class의 move()함수와는 다른 함수를 재정의하겠다!
        print("Fly forwards")
    }
    
    override func attack(){
        super.attack() // super class의 attack () Method
        print("Spits fire, does 10 damage") // 재정의된 attack() method
    }
}

구조체 vs 클래스

공통점

  • property : 값을 저장하기 위해 property를 정의한다
  • mothod : 기능을 실행하기 위해 method를 정의한다
  • 서브스크립트 문법을 통해 구조체 또는 클래스가 갖는 property에 접근하도록 서브스크립트를 정의할 수 있다
  • 초기화될 때 상태를 지정하기 위한 이니셜라이저를 정의한다
  • 초기구현 및 새로운 기능을 추가하기 위해 익스텐션을 통해 확장할 수 있다
    특정 기능 실행을 위해 특정 프로토콜을 준수한다

차이점

  • 구조체는 상속 불가능 / 클래스만 상속이 가능하다
  • 타입캐스팅은 클래스의 인스턴스에만 허용된다
  • 디이니셜라이저는 클래스의 인스턴스에만 활용할 수 있다
  • Referencing Counting (참조 횟수 계산)은 클래스의 인스턴스에만 적용된다

값 타입

  • 어떤 함수의 전달인자로 값 타입의 값을 넘기는 경우 : 전달될 값이 복사되어 전달된다
    • 메모리에 전달인자를 위한 인스턴스가 새로 생성됨
    • 새로 생성된 인스턴스에 전달하려는 값이 복사되어 들어간다.

참조 타입

  • 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 주소가 전달된다
    • C의 포인터와 유사
  • 참조가 할당되는 경우 :
    함수의 전달인자로 넘기는 경우, 다른 변수 또는 상수에 할당되는 경우
  • 기존 인스턴스의 참조를 전달하므로 새로운 인스턴스가 아닌 기존의 인스턴스 참조를 전달한다.
  • 새로운 변수에 할당될 때도 마찬가지이다.
클래스의 경우
let skeleton1 = Enemy(health: 100, attackStrength: 100)
let skeleton2 = skeleton1
skeleton1.takeDamage(amount: 10)
skeleton1.takeDamage(amount: 10)
skeleton2.takeDamage(amount: 10)

skeleton2에 skeleton1을 넣고 실행하면 skeleton1.healthskeleton2.health가 모두 70이 된다.
(참조에 의한 복사이므로 skeleton1과 skeleton2는 한몸인 것!)

구조체의 경우
var skeleton1 = Enemy(health: 100, attackStrength: 100)
var skeleton2 = skeleton1
skeleton1.takeDamage(amount: 10)
skeleton1.takeDamage(amount: 10)
skeleton2.takeDamage(amount: 10)

skeleton1.health는 80, skeleton2.health는 90의 값을 갖는다.
(값에 의한 복사이므로 skeleton1과 skeleton2는 별개로 존재한다!)

식별연산자 Identity Operators

===, !==
: 클래스의 인스턴스끼리 참조가 같은지 확인할 때 식별연산자를 사용한다.

0개의 댓글