티스토리 뷰

SMALL

1. 클래스 (class)

= 객체를 찍어낼 수 있는 설계도! = 붕어빵틀

 

- Java에서의 클래스와 동일한 구조이다.

 

- Property : 클래스 내의 변수와 상수.

- Method : 클래스 내의 함수.

- 생성자 : init()

 

// 클래스 생성. (객체의 설계도)
class Circle {
    var radius: Double
    let pi = 3.1415926535
    
	// 생성자 -> 프로퍼티를 초기화 해주는 용도.
    init() {
        radius = 10.0
    }
    init(radius: Double) {
        self.radius = radius // self -> 인스턴스 자기 자신을 가리키는 것.
    }
    
    // 원의 넓이를 반환하는 메소드.
    func area() -> Double {
        return radius * radius * pi
    }
}

// 인스턴스(객체) 생성.
let circle = Circle() // Circle.init()과 같음.
let circle2 = Circle(radius: 20.0) // Circle.init(radius: 20.0)과 같음.

circle.radius // 10.0
circle.area() // 314.15926535

circle2.radius // 20.0
circle2.area() // 1256.6370614

이로써 우리는 변수, 상수를 선언하는 방법을 한 가지 더 알게 되었다.

 

a. 리터럴을 통해 초기화.

var weight = 70
var message = "Hello"
var evenNumber = [2, 4, 6, 8]

b. 생성자를 통해 생성. → New!! 🤗

var weight = Int(70) // Int.init(70)
var message = String("Hello") // String.init("Hello")
var evenNumber = [Int](arrayLiteral: 2, 4, 6, 8)

2. 상속 (Inheritance)

Swift는 객체 지향 언어이다. (더 나아가면 프로토콜 지향 언어)

객체 지향 언어는 클래스를 기반으로 한다.

 

클래스 기반의 장점이 무엇인가?

바로 상위 클래스를 상속 받아서 코드의 재사용성을 늘리는 것이다.

 

상속을 받은 클래스를 하위 클래스, 서브 클래스, 자식 클래스 라고 하고,

상속이 되는 클래스를 상위 클래스, 슈퍼 클래스, 부모 클래스 라고 한다.

 

상위 클래스의 속성과 기능을 그대로 사용하면서, 하위 클래스만의 고유한 기능을 추가하여 새로운 클래스를 쉽게 만들 수 있다!

- 클래스 이름 옆에 콜론(:)을 붙이고 상속받을 클래스 이름을 적어준다.

 

// super class
class NoteBook {
    var name = ""
    
    func turnOn() {
        print("Booting...")
    }
}

// class 클래스이름: 상속받을 클래스이름
// sub class
class MacBook: NoteBook {
    var hasTouchBar = false  // MacBook만의 특징들을 추가.
    var macOSVersion = "12.2.1"
}

let macBook = MacBook()
macBook.name = "서리의 MacBook Air"
macBook.turnOn()

- super class에 정의된 특징과 기능들은 sub class에서도 사용 가능하기 때문에, 공통된 특징과 기능은 super class에 정의한다.

- NoteBook과 같은 super class를 상속받아 각자의 특징과 기능이 있는 다양한 sub class를 만들 수 있다. (MacBook, Gram, Ion, ...)

- 상속은 구조체와 클래스를 구분하는 큰 특징 중 하나가 된다.


3. 재정의 (Overriding)

위에서 상속을 사용하면 super class의 특징과 기능을 그대로 사용할 수 있다고 했는데,

상속받은 기능을 조금 수정하여 사용하고 싶을 때는 어떻게 하면 될까?

 

override 키워드를 사용하여 메소드를 재정의하면 된다!

- override 뒤에 재정의 하고 싶은 함수의 선언부를 똑같이 적어준다. (→ 메소드 이름, 파라미터, 리턴값이 모두 똑같아야 한다.) 

 

// super class
class NoteBook {
    var name = ""
    
    func turnOn() {
        print("Booting...")
    }
}

// class 클래스이름: 상속받을 클래스이름
// sub class
class MacBook: NoteBook {
    // MacBook만의 특징들을 추가.
    var hasTouchBar = false
    var macOSVersion = "12.2.1"
    
    // 재정의 키워드 override
    // override 재정의 하고 싶은 함수의 선언부
    override func turnOn() {
        super.turnOn()  // super class의 turnOn() 메소드 실행.
        print("\(name)'s current macOSVersion is \(macOSVersion)")
    }
}

let macBook = MacBook()
macBook.name = "서리의 MacBook Air"
macBook.turnOn()

- super 키워드 : super class(상위 클래스)를 가리킨다.

- super.turnOn() ⇒ NoteBook 클래스의 turnOn() 메소드를 실행한다.


4. 구조체 (struct)

 

- 문법은 클래스의 구조와 똑같다. class 키워드 대신 struct 키워드를 사용하면 된다.

- 클래스와 똑같이 구조체 내의 변수, 상수를 property라고 하고, 함수를 method라고 한다.

- 구조체에는 init()을 따로 만들어주지 않아도 자동으로 초기화 함수(생성자)가 만들어진다! 👍🏻

 

struct Coordinate3D {
    var x = 0
    var y = 0
    var z = 0
}

- 몇 가지 간단한 데이터 값을 캡슐화할 때 사용한다.

- 클래스와 달리 상속이 불가능하기 때문에 상속이 필요없을 때에 사용한다.


5. 클래스 vs 구조체

 

- 공통점 : 속성 정의,

               메소드 정의,

               생성자를 통한 초기 설정,

               extension과 protocol 사용 가능.

 

- 차이점 :

    - 클래스 : 상속 가능,

                    타입 캐스팅 가능,

                    소멸자를 통한 리소스 정리 가능,

                    참조 타입(Reference Type)이다.

    - 구조체 : 상속 불가능,

                    타입 캐스팅 불가능,

                    소멸자를 통한 리소스 정리 불가능,

                    값 타입(Value Type)이다. → 할당을 하거나 전달할 때 값이 복사가 되는 형태.

 

클래스에서 활용 가능한 소멸자를 통한 리소스 정리 예제를 살펴보자.

// 소멸자 예제.
class Circle {
    var radius = 9
    
    // 생성자.
    init() {
        print("Initializer called")
    }
    
    // 소멸자.
    deinit {
        print("Deinitializer called")
    }
}

if true {
    var circle1 = Circle() // 생성자 호출.
    print("아직 scope 안이야! 난 아직 살아있어")
}

/* 실행 결과
Initializer called
아직 scope 안이야! 난 아직 살아있어
Deinitializer called
*/

→ scope 안에서 생성된 circle1은 scope를 빠져나가는 순간 소멸된다. → 소멸자 호출됨.


6. 값 타입과 참조 타입

 

1. Circle이 클래스일 때

var circle1 = Circle()  // Circle 클래스 인스턴스의 참조 횟수: 1번
var circle2 = circle1   // Circle 클래스 인스턴스의 참조 횟수 + 1 -> 2번!

circle2.radius = 10     // Circle 클래스 인스턴스의 radius 값이 10으로 변경된다.

print(circle1.radius)   // 10
print(circle2.radius)   // 10

- Circle 클래스는 참조 타입이라서 위와 같은 코드에서 circle1과 circle2는 같은 인스턴스를 가리키게 된다.

→ circle2의 radius를 바꾸면 circle1의 radius 값도 바뀐다.

 

2. Circle이 구조체일 때

var circle1 = Circle()  // Circle 구조체 인스턴스 circle1 생성.
var circle2 = circle1   // Circle 구조체 인스턴스 circle2 생성. -> 따로 새 인스턴스가 생성된 것.

circle2.radius = 10     // Circle 구조체 인스턴스 circle2의 radius 값이 10으로 변경된다.

print(circle1.radius)   // 0 -> 원래 값.
print(circle2.radius)   // 10

- Circle 구조체는 값 타입이라서 위와 같은 코드를 실행하면 circle2에 새로운 인스턴스가 생성되어 할당된다.

→ 서로 다른 메모리 주소에 인스턴스가 각자 저장돼 있기 때문에 circle2.radius의 값을 변경해도 circle1.radius의 값은 영향을 받지 않는다.


7. 클래스 vs 구조체 선택 기준

 

- 상속이 필요없을 경우 구조체 사용.

- 할당 및 전달 시에 복사가 합리적인 경우 구조체 사용.

- 반드시 구조체를 사용해야 하는 경우는 많지 않기 때문에 대부분의 경우는 클래스로 정의하고 클래스의 인스턴스를 만들어서 사용하면 된다고 한다.


8. 열거형(Enumeration)

 

// 열거형
enum AppleOS {
    case iOS
    case macOS
    case tvOS
    case watchOS
}

// var osType: AppleOS = AppleOS.iOS
var osType: AppleOS = .macOS

func printAppleDevice(os: AppleOS) {
    switch os {
    case .iOS:
        print("iPhone")
    case .macOS:
        print("iMac")
    case .tvOS:
        print("Apple TV")
    case .watchOS:
        print("Apple watch")
    }
}

printAppleDevice(os: osType)

- 열거형은 switch문이랑 같이 많이 쓰인다.

- switch문은 원래 default을 쓰지 않으면 에러가 발생하는데, 열거형일 경우에는 어차피 이 4가지 케이스밖에 없기 때문에 안 써도 에러가 발생하지 않는다.

 

// 열거형
enum AppleOS: Int {
    case iOS = 5 // 원시값(rawValue) 지정 가능.
    case macOS
    case tvOS
    case watchOS
}

// var osType: AppleOS = AppleOS.iOS
var osType: AppleOS = .macOS
print(osType.rawValue)  // 6 출력됨.

- 원시값을 설정할 때에는 각 case마다 다른 값을 가져야 한다.

- 맨 위의 iOS에 원시값 5를 설정해 주었기 때문에 순서대로 macOS = 6, tvOS = 7, watchOS = 8로 설정된다.

 

제 글이 도움이 되었다면 좋아요 부탁드립니다! 😊


참고 사이트 : 

https://www.inflearn.com/course/%EC%95%84%EC%9D%B4%ED%8F%B0-%EC%95%B1-%EA%B0%9C%EB%B0%9C-%EC%9E%85%EB%AC%B8-2%ED%8E%B8/dashboard

→ 이 강의를 듣고 스스로 정리한 내용입니다!

LIST
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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
글 보관함