[iOS/Swift] extension과 class의 차이

chaentopia·2023년 2월 26일
0
post-thumbnail

지난 시간에 extension에 대해서 알아봤습니다.
확장, extension이란

기존 클래스, 구조체, 또는 열거형 타입에 새로운 기능을 추가하는 것으로, 원본 타입에 접근하지 못하는 타입들도 확장하여 사용할 수 있다.

라는 의미를 갖고 있었는데요, 좀 더 간단히 말해서 Apple에서 기본적으로 제공하는 버튼, 라벨, 텍스트 필드 등에서 내가 필요한 코드들을 추가해서 더 확장해서 쓸 수 있는 수단입니다.
그렇다면 class의 상속과의 차이점은 무엇일까요??

클래스, class의 상속

swift 자체가 객체 지향 언어, OOP이기 때문에 class가 필수적입니다.

class Name {
	var name : String
	var age : Int
	
	init(name: String, age: Int) {
		self.name = name
		self.age = age
	}
	func my_name() {
		print("제 이름은 \(name)이고, 나이는 \(age)세 입니다.")
	}
}

let name1 : Name = Name(name: "정채은", age: 23)
let name2 : Name = Name(name: "최고심", age: 17)

name1.my_name() //제 이름은 정채은이고, 나이는 23세 입니다.
name2.my_name() //제 이름은 최고심이고, 나이는 17세 입니다.

class는 프로그램의 재사용을 용이하게 만들어줍니다. 만들어둔 클래스를 복사해서 같은 기능을 사용할 수 있고, 더 나아가 상속을 통해서 클래스의 기능을 모두 가져가서 새로운 클래스를 만들어낼 수 있습니다. 그렇다면 자식 클래스가 부모 클래스의 기능을 모두 사용할 수 있겠죠?!

class Name {
	var name = "정채은"
	var age = "23"

	func my_name() {
		print("제 이름은 \(name)이고, 나이는 \(age)세 입니다.")
	}
}

class YourName : Name { //클래스를 상속함
	var yourName = "최고심"
    
    func ourName() {
    	print("제 이름은 \(name)이고, 당신의 이름은 \(yourName)입니다./")
        }
    }
}

let name1 : YourName = YourName()

name1.my_name() //클래스 상속했기 때문에 my_name() 메소드를 사용할 수 있다.
//제 이름은 정채은이고, 나이는 22세 입니다.
name1.ourName() 
//제 이름은 정채은이고, 당신의 이름은 최고심입니다.
야우스에서 공부했던 거 쇽샥해옴 ㅋㅋ

상속 시에는 override라고 불리는 재정의가 가능합니다.

재정의란?

자식 클래스가 부모 클래스로부터 받은 메서드, 인스턴스 등을 그대로 사용하지 않고 자신만의 기능으로 다시 바꾸어서 사용할 수 있습니다. 이를 재정의 override라고 합니다.

class Name {
	var name = "정채은"
	var age = "23"

	func my_name() {
		print("제 이름은 \(name)이고, 나이는 \(age)세 입니다.")
	}
}

class YourName : Name { //클래스를 상속함
	var yourName = "최고심"
    
    override func my_name() { //부모클래스의 my_name() 메서드 재정의
    	print("제 이름은 \(name)이고, 당신의 이름은 \(yourName)입니다./")
        }
    }
}

let name1 : YourName = YourName()

name1.my_name() //재정의 했기 떄문에 YourName의 my_name() 메소드가 출력됨
//제 이름은 정채은이고, 당신의 이름은 최고심입니다.

확장, Extension

그러나 확장은 재정의를 사용할 수 없습니다. 타입에 새로운 기능을 추가할 수는 있지만, class의 상속처럼 재정의를 할 수는 없습니다!

결론

classextension
확장수직 확장수평 확장
타입클래스 타입클래스, 구조체, 프로토콜, 제네릭 등 모든 타입
재정의가능불가능

그래서 각자 상황에 맞게 필요한 것을 사용하면 된다!!

profile
the pale blue dot

0개의 댓글