객체지향 프로그래밍이란?
- 속성과 행위 등을
미리 정의하여 필요할 때 사용
DTO, DAO로 보는 객체지향
- DTO(
DataTransferObject) - 데이터 전달 객체 (데이터 구조체)
- DAO(
DataAccessObject) - 데이터 접근 객체 (비즈니스 로직)
객체지향의 4대 특징
추상화
- 모델링, 개발자가 원하는 시점에 사용하고 싶은 부분만 사용하는 것
확장성: 기존 클래스를 수정하지 않고 필요 시 프로토콜을 채택하여 사용
// 프로토콜을 사용하여 추상화
// 추상화의 개념을 사용하기위해 구현한 Animal
protocol Animal {
func makeSound()
}
class Dog: Animal {
func makeSound() {
print("멍멍!")
}
}
class Cat: Animal {
func makeSound() {
print("야옹!")
}
}
let dog: Animal = Dog()
let cat: Animal = Cat()
dog.makeSound() // 멍멍!
cat.makeSound() // 야옹!
캡슐화, 은닉화
캡슐화: 관련 있는 속성, 메서드 등을 한개의 클래스로 한정지어 활용
은닉화: 데이터를 직접적인 접근을 제한하고 메서드를 통해 데이터를 조작
// 은닉화된 데이터를 사용하는 함수를 하나의 클래스로 묶어서 캡슐화
class Yoonds {
// 외부에서 직접 접근하지 못하도록 private 선언하여 은닉화
private var myScore: Int = 0
// 저장속성과 묶어 사용하는 캡슐화된 함수
func increase() {
myScore += 10
}
func getMyScore() -> Int {
return myScore
}
}
let yoonds = Yoonds()
yoonds.increase() // myScore += 10
// 직접적으로 myScore 속성에 접근하지 않고 private으로 두어
// 함수를 통해 간접적으로 접근한다.
상속성
- 부모클래스의 속성, 메서드를 자식 클래스에서 물려받는 개념
- 코드의
재사용으로 인하여 생산성 및 재사용성이 높아짐(상속은 클래스만 가능)
// 부모 클래스
class Animal {
func makeSound() {
print("동물이 소리를 냅니다.")
}
}
// 자식 클래스
class Dog: Animal {
// 오버라이드 하여 부모클래스의 함수를 재사용(코드의 재활용)
override func makeSound() {
print("멍멍!")
}
}
// 부모 클래스의 인스턴스 생성
let animal = Animal()
animal.makeSound() // 동물이 소리를 냅니다.
// 자식 클래스의 인스턴스 생성
let dog = Dog()
dog.makeSound() // 멍멍!
다형성
- 상속, 상속(+프로토콜)과 관련이 높음
- 하나의 인스턴스(객체)가
여러가지 타입 형태로 표현이 가능함을 의미