반응형
Notice
Recent Posts
Recent Comments
Link
Today
Total
07-05 05:44
«   2024/07   »
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
Archives
관리 메뉴

iOS 개발 기록 블로그

iOS(Swift) Class의 모든 것 (SuperClass, SubClass, Inheritance, Override) 본문

iOS

iOS(Swift) Class의 모든 것 (SuperClass, SubClass, Inheritance, Override)

crazydeer 2022. 5. 25. 16:00
반응형

이번 글에서는 Swift 뿐만 아니라 다른 언어에서 너무나도 중요한 개념인

'Class'에 대해서 알아볼 것이다.

 

개념

Class는 아래 링크에서 알아봤던 Struct (Structure, 구조체)와 비슷하고

프로그래밍이 오랜 기간 성장해오면서 발달, 도태, 변화해온 결과물 중 하나이다.

 

iOS(Swift) 구조체(struct) 사용 방법

Swift에서도 역시 구조체(struct)가 있고 그 사용 방법에 대해 알아보자. 개념 스위프트에서 데이터 타입은 Int, Float, String, Boolean, Array, Dictionary 등 여러 가지가 존재한다. 우리는 직접 개인화(커스터

crazydeer.tistory.com

구조체는 Property나 Method들이 담겨 있는 설계도면과 같다고 설명했다.

이렇게 만들어 놓은 구조체를 init()하여 사용했다.

 

Class 역시 비슷하지만 코드를 작성하는 업계 표준이 자연스럽게

Struct를 사용했던 부분을 다른 이점들을 갖고 있고

객체지향 프로그래밍 (OOP) 개념이 대두되면서

Struct는 순수한 Property들을 사용하기 위한 Custom Data Type으로

쓰는 추세이고 Class를 통해 method들을 추가하고

상속하여 쓰이곤 한다.

이 상속(Inheritance)이라는 게 중요한 개념 중 하나인데

이걸 이해하기 위해서는

Super Class, Sub Class, Override, super.method() 등을

또 알아야 한다.

 

이것들을 이제 새로운 프로젝트를 생성하여 함께 이해해보도록 한다.

 

Xcode에서 새 프로젝트 생성하여 macOS 탭에서 Command Line Tool을 선택한다.

 

Xcode Create New Project

 

 

좌상단에 네비게이터에서 해당 폴더를 우클릭하여 새로운 swift 파일을 생성한다.

Enemy.swift

 

New file (Enemy.swift)

 

 

Class를 정의할 때 반드시 생성한 swift 파일 이름과 같아야 한다.

마찬가지로 중괄호 { } 안에 Property나 Method를 생성할 수 있다.

 

Enemy.swift

 

 

Code Example

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

 

 

Usage

만든 클래스 사용하기

 

property와 method를 위와 같이 사용할 수 있다.

이렇게 보면 글 초반에 달아 놓은 구조체 링크의 내용과 크게 다를 게 없어 보인다.

 

 

 

Inheritance, 상속

크게 다른 점 중에 하나가 바로 Super Class (parent)로부터 받는 inherit(상속)이다.

class MyClass: SuperClass { }

 

우리는 SuperClass를 통해 SubClass를 생성할 수 있다.

그리고 우리의 functionality(properties nd methods)들을 그곳에 추가할 수 있다.

SubClass는 SuperClass의 Child라고 생각하면 된다.

 

 

Action in Xcode Project

우리가 아까 생성한 Enemy 보다 더 강한 Enemy를 생성하고 싶다고 생각해보자.

Dragon.swift 파일을 생성해주고 class를 입력하면 

Xcode는 아래와 같이 Subclass를 추천해준다.

 

 

마찬가지로 파일명과 동일하게 클래스를 만들어주고

콜론과 상속받을 부모. 즉, SuperClass를 쓴다.

 

main.swift로 돌아와서 아래와 같이

initialize 해주고 Super Class (부모)인 Enemy의 함수를

사용할 수 있게 된다.

 

 

 

Dragon.swift에서 새로운 함수를 생성한다.

드래곤 클래스

 

main.swift

 

 

Dragon.swift에서 만든 talk 함수를 당연히도 쓸 수 있다.

 

 

 

Override

기존의 부모 클래스에서 만든 함수를

상속받은 자식 클래스에서 수정해서 쓸 수 있다.

 

코드

class Dragon: Enemy {
    var wingSpan= 2// meters
    
    func talk(speech: String) {
        print("Says: \(speech)")
    }
    
    // 기존의 부모 클래스에서 만든 함수를 오버라이딩해서 수정할 수 있다.
    override func move() {
        print("Fly forwards.")
    }
}

 

 

결과

Override 결과

 

수정한 "Fly forwards."로 출력되는 걸 볼 수 있다.

 

 

아래와 같이 드래곤 파일을 수정할 때

super. 키워드를 사용하여 부모 클래스의 property를 가공해서

사용할 수도 있다.

 

 

 

이 상속 개념을 가진 Class는 프로그래밍하는 데 있어서

아주 큰 힘을 가져다 준다.

 

Xcode Help 메뉴에서 Developer Documentation를 들어가서

uibutton을 검색해본다.

 

Declaration 아래 UIButton은 UIControl의 상속을 받는다.

UIControl을 들어가 본다.

 

 

 

UIControl은 UIView로부터 상속을 받는다.

UIView를 들어가 본다.

 

 

 

UIView는 UIResponder의 상속을 받는다.

또 들어가 보면 UIResponder는 NSObject로부터 상속을 받는다.

 

 

도대체 왜 이런 구조로 만들어져 있을까?

역으로 생각하면 

애플은 NSObject (Next Step) 베이스로 하여

위로 쌓인다고 생각해본다.

 

이렇게 될 것이다. 기능과 요소들이 계속해서 새로 만들어질 때

각각 필요한 기능들을 다시 만들지 않고

기존의 만들어놓은 것들을 상속받아서 만들기 위함이다.

 

 

 

참고

안젤라유 강의: https://www.udemy.com/course/ios-13-app-development-bootcamp/

 

iOS & Swift - The Complete iOS App Development Bootcamp

From Beginner to iOS App Developer with Just One Course! Fully Updated with a Comprehensive Module Dedicated to SwiftUI!

www.udemy.com

 

반응형