개체
[Entity]와 객체
[Object]"An entity describes an object, including its name, attributes, and relationships"
타입
[Type]타입
은 개체를 대표하는 표현이다.타입
은 모든 개체의 행위와 특성을 한 곳으로 모아 표현 해 준 것이다.타입
은 설계도
와 같아서 특정한 개체의 실체는 아니지만
그 것을 만들기 위한 방법
이라 표현할 수 있다.*스위프트[Swift]에서는 타입을 여러가지 방식으로 표현하고 있다:
구조체[Struct]
클래스[Class]
열거형[Enum]
프로토콜[Protocol]
설계도
를 통해 만들어진 개체를 우리는 인스턴스
라 부른다.타입
으로 부터 실체화
되어 실제로 메모리에 할당된 실체
를 뜻한다.타입
을 만들 때는 우리는 일반화
와 추상화
를 거치게 된다일반화
[Generalization], 그리고 추상화
[Abstraction]일반화
더 상위의 개체 집합
을 만드는 것 개체
들의 공통된 개념을 추출
하고 묶는 것
Ex): 도로에 굴러가는 바퀴 4개 달린 물체 = 자동차
추상화
중요한 특징을 추출
해서 간단하게 표현
하는 것
일반화
해서 모아둔 모든 특성 중 꼭 필요한 특성을 filter
하는 작업
*print
함수를 우리가 실행하면 출력하기까지의 내부 과정은 알리지 않고 해당 함수의 기능만을 보여준다
은닉화
와 캡슐화
[Encapsulation]개체의 은닉화
개체의 캡슐화
캡슐화를 하기 위해 은닉화가 수반된다.
스위프트에서는 오류를 Error
라는 프로토콜을 준수하는 타입의 값으로 표현한다.
enum ComputerError: Error {
case invalidInput
case insufficientMemory(memoryRequired: Int)
case batteryDischarge
case numberInputError
}
해당 프로토콜
은 빈 프로토콜이지만 에러가 발생할 수 있다는 점을 암시한다.
그리고 주로 enum
은 오류를 포현하기위해 해당 프로토콜
을 채택한다.
오류를 포착하고 처리하는 4가지 방법:
func printKeyboardInput(input: String) throws {
guard let input = computer.type else {
throw ComputerError.invalidInput
}
}
함수, 메서드, 이니셜라이저 매개변수 뒤에 throws
를 사용하면 해당 함수, 메서드, 이니셜라이저는 오류를 던질 수 있다.
오류를 전달받은 코드 블록은 do-catch
구문을 활용하여 오류를 처리해주어야 한다.
do {
try 오류 발생 가능코드
오류가 발생하지 않으면 실행할 코드
} catch 오류패턴 1 {
처리코드
} catch 오류패턴 2 {
처리코드
}
class Computer {}
func printModelNumber(_ number: Int) throws -> Int {
var text = ""
guard number > 1 else {
throw ComputerError.numberInputError
}
return text
}
}
let computer = Computer()
//let computerNumberOutput = computer.printModelNumber(-2) // Wrong Approach
do {
let computerNumberOutput = try computer.printModelNumber(-2)
} catch invalidInput {
// 오류처리
} catch insufficientMemory {
// 오류처리
} catch numberInputError {
// 오류처리
}
단순히 함수만을 호출하는 것이 아니라 try
를 넣어줌으로서 우리는 해당 함수가 오류가 발생할 수도 있지만 그래도 시도해 보겠다고 선언
하는 것이다.
또한 do-catch
로 해당 선언을 감싸줘야 오류처리를 제대로 할 수 있다.
그리고 더 나아가 Enum
의 case
들을 활용하여 오류 케이스 별로 오류처리
를 할 수 있다.
let computerNumberOutput = try? computer.printModelNumber(-2)
print("\(computerNumberOutput)") // Optional('-2') 또는 nil
오류가 날 수 있음을 인정하기에 computerNumberOut의 리턴값을 옵셔널타입
또는 nil
로 받게 된다.
let computerNumberOutput = try! computer.printModelNumber(-2)
print("\(computerNumberOutput)")
해당 메소드
에서 오류가 절대 나지 않을 자신이 있으면 활용한다. 오류 발생 시 Runtime Error
가 발생한다.
개체
와 객체
의 차이점이 잘 이해가 안되어서 해당 부분을 이해하는데 많은 시간을 할애하였다오류처리
의 방법이 아직 익숙하지 않기에 해당 부분을 이해하려 고민하고 공부하였다.구글
과 애플공식가이드라인
그리고 야곰책
과 함께라면 부족한 부분을 채우기는 어렵지 않다.
다만 지속적인 복습
이 동반되지 않는다면 내 것으로 만들기 힘들어 보인다.
참고
야곰 아카데미 커리어 스타터 캠프 활동학습 자료
SWIFT 스위프트 프로그래밍 3판 - 야곰