λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🍏 Today I Learned/Swift 문법

[Swift] 객체 μ§€ν–₯

by Joseph Seong 2023. 12. 7.

 

 

 

객체 μ§€ν–₯

 

객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ° (Object-Oriented Programming)

 

  • μ€„μ—¬μ„œ OOP라고 λΆ€λ₯Έλ‹€.
  • ν”„λ‘œκ·Έλž¨μ„ μ–΄λ–»κ²Œ μ„€κ³„ν•΄μ•Όν•˜λŠ” 지에 λŒ€ν•œ 방법둠 쀑 ν•˜λ‚˜(νŒ¨λŸ¬λ‹€μž„)
  • 각 객체와 κ·Έ κ°μ²΄λ“€κ°„μ˜ 관계λ₯Ό μ„€κ³„ν•˜λŠ” 것
  • 객체 μ§€ν–₯으둜 μ§œμ—¬μ§„ ν”„λ‘œκ·Έλž¨μ€ μ—¬λŸ¬ κ°μ²΄λ“€μ˜ λͺ¨μž„
  • 각 κ°μ²΄λŠ” λ©”μ‹œμ§€λ₯Ό μ£Όκ³  받을 수 있으며, 데이터λ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.

πŸ“˜ OOP νŠΉμ§•

  1. 좔상화 (Abstraction): μΆ”μƒν™”λŠ” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°μ˜ 핡심 κ°œλ… 쀑 ν•˜λ‚˜
    • λ³΅μž‘ν•œ μ‹œμŠ€ν…œμ„ λ‹¨μˆœν™”ν•˜μ—¬ μ€‘μš”ν•œ 뢀뢄을 κ°•μ‘°ν•˜κ³  λΆˆν•„μš”ν•œ 뢀뢄을 μˆ¨κΈ°λŠ” 것을 의미
    • ν΄λž˜μŠ€λ‚˜ ν”„λ‘œν† μ½œμ„ 톡해 데이터와 λ™μž‘μ„ μΆ”μƒν™”ν•˜μ—¬ ν•„μš”ν•œ μ •λ³΄λ§Œμ„ λ…ΈμΆœμ‹œν‚€λŠ” 것을 포함
  2. μΊ‘μŠν™” (Encapsulation):
    • 객체의 μƒνƒœ(데이터)와 행동(λ©”μ„œλ“œ)λ₯Ό ν•˜λ‚˜λ‘œ λ¬Άκ³ , μ™ΈλΆ€μ—μ„œμ˜ 접근을 μ œν•œν•˜μ—¬ 객체 λ‚΄λΆ€μ˜ μ„ΈλΆ€ κ΅¬ν˜„μ„ μˆ¨κΈ°λŠ” 것을 의미
    • 이λ₯Ό 톡해 객체 κ°„μ˜ μ˜μ‘΄μ„±μ„ 쀄이고 μ½”λ“œλ₯Ό λ³΄ν˜Έν•˜λ©° μœ μ§€λ³΄μˆ˜μ„±μ„ 높일 수 μžˆλ‹€.
  3. 상속 (Inheritance):
    • κΈ°μ‘΄ ν΄λž˜μŠ€μ—μ„œ μ •μ˜λœ 속성과 λ©”μ„œλ“œλ₯Ό λ‹€λ₯Έ ν΄λž˜μŠ€μ—μ„œ μž¬μ‚¬μš©ν•˜λŠ” 것을 λ§ν•œλ‹€.
    • λΆ€λͺ¨ 클래슀(μƒμœ„ 클래슀, 슈퍼 클래슀)의 νŠΉμ„±μ„ μžμ‹ 클래슀(ν•˜μœ„ 클래슀, μ„œλΈŒ 클래슀)κ°€ λ¬Όλ €λ°›μ•„ μ‚¬μš©ν•  수 μžˆλ‹€.
  4. λ‹€ν˜•μ„± (Polymorphism):
    • λ™μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ°€μ§„ λ‹€λ₯Έ ν΄λž˜μŠ€λ“€μ΄ 각각의 λ°©μ‹μœΌλ‘œ λ™μž‘ν•  수 μžˆλŠ” λŠ₯λ ₯을 λ§ν•œλ‹€.
    • μ˜€λ²„λΌμ΄λ”©κ³Ό μ—°κ΄€λ˜μ–΄ 있으며, μ„œλ‘œ λ‹€λ₯Έ ν΄λž˜μŠ€λ“€μ΄ λ™μΌν•œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  λ•Œ 각 클래슀의 μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œκ°€ μ‹€ν–‰λœλ‹€.

μ˜€λ²„λΌμ΄λ”© (Overriding):

  • 상속 κ΄€κ³„μ—μ„œ λΆ€λͺ¨ 클래슀의 λ©”μ„œλ“œλ₯Ό μžμ‹ ν΄λž˜μŠ€μ—μ„œ μž¬μ •μ˜ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • μžμ‹ ν΄λž˜μŠ€μ—μ„œ λΆ€λͺ¨ 클래슀의 λ™μΌν•œ λ©”μ„œλ“œ 이름을 μ‚¬μš©ν•˜μ—¬ λ‚΄μš©μ„ λ³€κ²½ν•˜κ±°λ‚˜ ν™•μž₯ν•  수 μžˆλ‹€.

μ˜€λ²„λ‘œλ”© (Overloading):

  • λ™μΌν•œ ν•¨μˆ˜λ‚˜ λ©”μ„œλ“œ 이름을 κ°€μ§€μ§€λ§Œ λ§€κ°œλ³€μˆ˜μ˜ νƒ€μž…, 개수, μˆœμ„œ 등이 λ‹€λ₯Έ μ—¬λŸ¬ λ²„μ „μ˜ ν•¨μˆ˜λ₯Ό μ •μ˜ν•˜λŠ” 것을 λ§ν•œλ‹€.
  • 이λ₯Ό 톡해 λ™μΌν•œ μ΄λ¦„μ˜ λ‹€μ–‘ν•œ λ²„μ „μ˜ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

 

// 좔상화 - μ΄λ ‡κ²Œ νƒ€μž…μ„ μ •μ˜ν•˜λŠ” 것
class Account {}
struct Account {}
protocol Account {}

// μΊ‘μŠν™”
class Person {
  private var location = "μ„œμšΈ"

  private func doSomething1() {
    print("μž μ‹œ νœ΄κ²Œμ†Œμ— λ“€λ €μ„œ λ”΄μ§“")
  }
  private func doSomething2() {
    print("ν•œμˆ¨ μžλ‹€ κ°€κΈ°")
  }

  func currentLocation() {
    print("====")
    print("ν˜„μž¬ μœ„μΉ˜ :", location)
    print("====")
  }

  func goToBusan() {
    print("μ„œμšΈμ„ μΆœλ°œν•©λ‹ˆλ‹€.")
    doSomething1()
    doSomething2()
    print("뢀산에 λ„μ°©ν–ˆμŠ΅λ‹ˆλ‹€.")
    location = "λΆ€μ‚°"
  }
}

// 상속
class Animal {
	var species = "동물"
}

class Dog: Animal {
	var name = "μ΄ˆμ½”"
}

let dog = Dog()
dog.species // 동물
dog.name // μ΄ˆμ½”


// λ‹€ν˜•μ„±

1) μ˜€λ²„λΌμ΄λ”©

class Dog {
  func bark() { print("멍멍") }
}
class Poodle: Dog {
  override func bark() { print("μ™ˆμ™ˆ") }
}
class Husky: Dog {
  override func bark() { print("으λ₯΄λ₯΄") }
}
class Bulldog: Dog {
  override func bark() {
    super.bark()   // λΆ€λͺ¨μ— μžˆλŠ” 멍멍 μ‹€ν–‰
    print("bowwow")
  }
}

var dog: Dog = Dog()
dog.bark() // 멍멍

dog = Poodle()
dog.bark() // μ™ˆμ™ˆ

dog = Husky()
dog.bark() // 으λ₯΄λ₯΄

dog = Bulldog()
dog.bark() // 멍멍, bowwow


2) μ˜€λ²„λ‘œλ”©
// ν•¨μˆ˜λ₯Ό 식별할 땐 λ‹¨μˆœνžˆ ν•¨μˆ˜ 이름을 보고 ν•˜λŠ” 게 μ•„λ‹ˆλΌ
// ν•¨μˆ˜ 이름, νŒŒλΌλ―Έν„°(νƒ€μž…, 갯수, Argument Label), λ¦¬ν„΄νƒ€μž…μ„ λͺ¨λ‘ μ’…ν•©ν•΄μ„œ ν•¨μˆ˜λ₯Ό 식별
func printParameter() {
  print("No param")
}

func printParameter(param: Int) {
  print("Input :", param)
}

func printParameter(_ param: Int) -> Int {
  print("Input :", param)
	return param
}

func printParameter(_ param: Int) -> Double {
  print("Input :", param)
	return Double(param)
}

printParameter()
printParameter(param: 1)
let int: Int = printParameter(2)   // μœ„μ— _둜 선언이 λ˜μ–΄μžˆκΈ° λ•Œλ¬Έμ— paramμ΄λΌλŠ” ν‚€μ›Œλ“œ μ•ˆ 씀
let double: Double = printParameter(2)