Mar 01, 2021, TIL (Today I Learned) - entity, abstraction, encapsulation, error handling

inwoodev·2021년 8월 26일
0
post-thumbnail

수업 학습내용


개체[Entity], 객체[Object], 타입[Type], 인스턴스[Instance]


개체[Entity]와 객체[Object]

"An entity describes an object, including its name, attributes, and relationships"

출처: Configuring Entities | Apple Developer Documentation

타입[Type]

  • 타입 은 개체를 대표하는 표현이다.
  • 타입 은 모든 개체의 행위와 특성을 한 곳으로 모아 표현 해 준 것이다.
  • 타입설계도 와 같아서 특정한 개체의 실체는 아니지만 그 것을 만들기 위한 방법 이라 표현할 수 있다.

*스위프트[Swift]에서는 타입을 여러가지 방식으로 표현하고 있다:

  • 구조체[Struct]

  • 클래스[Class]

  • 열거형[Enum]

  • 프로토콜[Protocol]

인스턴스[Instance]

  • 설계도 를 통해 만들어진 개체를 우리는 인스턴스 라 부른다.
  • 타입 으로 부터 실체화 되어 실제로 메모리에 할당된 실체 를 뜻한다.

어떠한 타입을 만들 때는 우리는 일반화추상화를 거치게 된다

일반화[Generalization], 그리고 추상화[Abstraction]


일반화

  • 연관성 있는 두 개 이상의 개체 집합을 묶어 더 상위의 개체 집합을 만드는 것
  • 개체들의 공통된 개념을 추출하고 묶는 것

Ex): 도로에 굴러가는 바퀴 4개 달린 물체 = 자동차

추상화

  • 중요한 특징을 추출해서 간단하게 표현하는 것

  • 일반화 해서 모아둔 모든 특성 중 꼭 필요한 특성을 filter하는 작업

    *print 함수를 우리가 실행하면 출력하기까지의 내부 과정은 알리지 않고 해당 함수의 기능만을 보여준다

은닉화캡슐화[Encapsulation]


개체의 은닉화

  • 외부로 드러나지 않아야 할 정보를 숨기는 것

개체의 캡슐화

  • 관련된 데이터와 함수를 묶는 것.

캡슐화를 하기 위해 은닉화가 수반된다.

  • 현금 인출기를 예로 들어보자. 현금 인출기에 대해 사용자에게 전달할 정보 중 숨겨야 할 정보가 있다:

프로젝트 진행 중 학습 내용


오류처리[Error Handling]

오류의 표현

스위프트에서는 오류를 Error 라는 프로토콜을 준수하는 타입의 값으로 표현한다.

enum ComputerError: Error {
    case invalidInput
    case insufficientMemory(memoryRequired: Int)
    case batteryDischarge
  	case numberInputError
}

해당 프로토콜 은 빈 프로토콜이지만 에러가 발생할 수 있다는 점을 암시한다.

그리고 주로 enum 은 오류를 포현하기위해 해당 프로토콜 을 채택한다.

오류를 포착하고 처리하는 4가지 방법:

  1. 함수에서 발생한 오류를 해당 함수를 호출한 코드에 알리는 방법
func printKeyboardInput(input: String) throws {
  guard let input = computer.type else {
    throw ComputerError.invalidInput
  }
}

함수, 메서드, 이니셜라이저 매개변수 뒤에 throws를 사용하면 해당 함수, 메서드, 이니셜라이저는 오류를 던질 수 있다.

  1. try, do-catch 구문을 이용한 오류 처리 방법

오류를 전달받은 코드 블록은 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 로 해당 선언을 감싸줘야 오류처리를 제대로 할 수 있다.

그리고 더 나아가 Enumcase들을 활용하여 오류 케이스 별로 오류처리를 할 수 있다.

  1. 옵셔널 값으로 값으로 오류 처리
let computerNumberOutput = try? computer.printModelNumber(-2)
print("\(computerNumberOutput)") // Optional('-2') 또는 nil

오류가 날 수 있음을 인정하기에 computerNumberOut의 리턴값을 옵셔널타입 또는 nil로 받게 된다.

  1. 오류가 발생하지 않는다 확신하는 방법
let computerNumberOutput = try! computer.printModelNumber(-2)
print("\(computerNumberOutput)")

해당 메소드에서 오류가 절대 나지 않을 자신이 있으면 활용한다. 오류 발생 시 Runtime Error가 발생한다.

문제점 / 고민한 점


  • 개체객체의 차이점이 잘 이해가 안되어서 해당 부분을 이해하는데 많은 시간을 할애하였다
  • 오류처리의 방법이 아직 익숙하지 않기에 해당 부분을 이해하려 고민하고 공부하였다.

해결 방법


  • 구글애플공식가이드라인그리고 야곰책과 함께라면 부족한 부분을 채우기는 어렵지 않다.

    다만 지속적인 복습이 동반되지 않는다면 내 것으로 만들기 힘들어 보인다.

참고

야곰 아카데미 커리어 스타터 캠프 활동학습 자료

SWIFT 스위프트 프로그래밍 3판 - 야곰

[Swift] 예외처리 (throws, do-catch, try) 하기 | by EmilY | Medium

profile
james, the enthusiastic developer

0개의 댓글