Open yoogail105 opened 2 years ago
클래스
를 정의, 정의된 클래스를 통해 각각의 인스턴스
를 생성장점
단점
객체 지향 프로그래밍에서는 객체와 클래스에 대해서 알아야 한다.
속성(property)
, 함수(method)
를 가짐객체 지향 프로그래밍
속성, 데이터, 상태
|| 행위, 메서드, 동작
⊂ 클래스class Teacher {
var subject: String!
var gender: String!
func teach() {}
func ask() {}
func answer() {}
}
let jiyoungLee: Teacher = Teacher()
jiyoungLee.subject = "society"
jiyoungLee.gender = "woman"
jiyoungLee.teach()
jiyoungLee
객체 생성jiyoungLee
는 teach(), ask(), answer() 하는 동작을 할 수 있다.private
하게 관리함수
를 통해서 접근Overriding
서브클래스가 슈퍼클래스의 메서드를 재정의
동적 다형성: 런타임에서 어떤 메서드가 호출될 지 결정
class Animal {
func makeSound() {
print("Some generic sound")
}
}
class Dog: Animal {
override func makeSound() {
print("Bark")
}
}
let myAnimal: Animal = Dog()
myAnimal.makeSound() // Bark
Overloading
같은 이름의 메서드가 매개변수 타입이나, 개수에 따라 여러 개 정의
정적 다형성: 컴파일 타임에 어떤 메서드가 호출될 지 결정
class MathOperations {
func add(a: Int, b: Int) -> Int {
return a + b
}
func add(a: Double, b: Double) -> Double {
return a + b
}
func add(a: Int, b: Int, c: Int) -> Int {
return a + b + c
}
}
let math = MathOperations()
print(math.add(a: 1, b: 2)) // 3
print(math.add(a: 1.5, b: 2.5)) // 4.0
print(math.add(a: 1, b: 2, c: 3)) // 6
Generic
코드의 재사용성을 높이고, 타입에 의존하지 않는 유연한 함수 작성
정적 다형성
func swapTwoValues<T>(_ a: inout T, _ b: inout T) {
let temporaryA = a
a = b
b = temporaryA
}
var int1 = 1
var int2 = 2
swapTwoValues(&int1, &int2)
print("int1: \(int1), int2: \(int2)") // int1: 2, int2: 1
var string1 = "hello"
var string2 = "world"
swapTwoValues(&string1, &string2)
print("string1: \(string1), string2: \(string2)") // string1: world, string2: hello
프로토콜을 통해 특정 요구사항을 정의, 클래스, 구조체, 열거형 등이 이를 채택하여 해당 요구 사항을 충족
주로 동적 다형성
// 정적 다형성 예시
protocol Drawable {
func draw()
}
class Circle: Drawable {
func draw() {
print("Drawing a circle")
}
}
class Square: Drawable {
func draw() {
print("Drawing a square")
}
}
let shapes: [Drawable] = [Circle(), Square()]
for shape in shapes {
shape.draw() // Circle의 경우 "Drawing a circle", Square의 경우 "Drawing a square"
}
// 동적 다형성 예시
protocol Drawable {
func draw()
}
class Circle: Drawable {
func draw() {
print("Drawing a circle")
}
}
class Square: Drawable {
func draw() {
print("Drawing a square")
}
}
class Triangle {
// 이 클래스는 Drawable 프로토콜을 준수하지 않음
}
let shapes: [Any] = [Circle(), Square(), Triangle()]
for shape in shapes {
if let drawableShape = shape as? Drawable {
drawableShape.draw() // Circle과 Square의 경우 draw 메서드 호출
} else {
print("Object does not conform to Drawable") // Triangle의 경우 이 메시지 출력
}
}
객체 지향 프로그래밍(OOP: Object-Oriented Programming)
객체 지향 프로그래밍은 프로그램을 어떻게 설계해야 하는지에 대한 개념이자 방법론 중의 하나이다. 객체 지향 프로그래밍, OOP는 왜 등장하게 되었을까?
1. 절차적 프로그래밍(Procedural)
절차
. 기능을 처리하는순서
대로 코드를 작성하는 것데이터에는 관심이 없음1-1. 단점
2. 구조적 프로그래밍
함수
단위로 나눔2-1. 단점
구조화하지 못함