수행 내용

  • 묵찌빠 게임 Step 1 구현
  • 모둠원 Steven과 코드 병합 작업 및 PR (to 하이디)
  • 익스텐션을 통한 프로토콜 구현 학습 및 프로젝트 활용
  • 출근, 퇴직원 작성 상신 및 퇴직 면담 (와중에 진급함..)

학습 내용

프로토콜 (Protocol)

특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 정의한 것. 구조체, 클래스, 열거형은 프로토콜을 채택해서 특정 기능을 실행하기 위한 프로토콜의 요구사항을 구현할 수 있다. 프로토콜은 정의를 하고 제시를 할 뿐 스스로 기능을 구현하지는 않는다.

protocol Sendable {
    var from: String { get }
    var to: String { get }
}

class Message: Sendable {

    var sender: String
    var from: String {
        return self.sender
    }

    var to: String

    init(sender: String, receiver: String) {
        self.sender = sender
        self.to = receiver
    }
}

class Mail: Sendable {

    var from: String
    var to: String

    init(sender: String, receiver: String) {
        self.from = sender
        self.to = receiver
    }
}

익스텐션 (Extension)

구조체, 클래스, 열거형, 프로토콜 타입에 새로운 기능을 추가할 수 있는 기능. 기능을 추가하려는 타입을 구현한 소스 코드를 알지 못하거나 볼 수 없다고 하더라도 타입만 알면 그 타입의 기능을 확장할 수 있다. 타입에 기존에 존재하는 기능을 재정의할 수는 없다.

Swift 익스텐션이 타입에 추가할 수 있는 기능

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 메서드 / 인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가
//
extension Int {
	var isEven: Bool {
    	return self % 2 == 0
    }
	func multiply(by n: Int) -> Int {
    	return self * n
	}
}

print(2.isEven)				// true
print(3.multiply(by: 2))	// 6

익스텐션을 통한 프로토콜의 구현

// 1 ~ 3 범위의 무작위 숫자를 생성하는 메서드를 여러 타입에서 활용
protocol GenerateRandomNumber {
	func generateRandomNumber() -> Int
}

extension GenerateRandomNumber {
	func generateRandomNumber() -> Int {
    	let randomNumber = Int.random(in: 1...3)
        return randomNumber
    }
}

// 이 메서드가 필요한 타입은 프로토콜을 준수하게 지정함으로써 코드를 재작성하지 않고도 얼마든지 사용 가능
struct rockPaperScissorsGame: GenerateRandomNumber {
	...
    let randomNumber = generateRandomNumber()
    ...
}

class numberBaseballGame: GenerateRandomNumber {
	...
    generateRandomNumber()
    ...
}

의사코드 활용이 주는 편익

'모두를 위한 컴퓨터 과학 (CS50) 2019' 강의를 보면서 의사 코드 (pseudo code)라는 개념을 보았다. 말인 즉슨 컴퓨터 언어 문법에 맞도록 코딩을 하는 것이 아니라 우리가 사용하는 언어를 토대로 프로그램이 동작하는 순서와 판단 논리 등을 적어보는 것을 뜻하는데, 어제 신규 프로젝트 Step 1 작성 전 정말 빠르게 프로그램이 가져야할 메서드와 프로퍼티 작동 순서에 대해 간단히 이야기해보며 코드 작성 공간에 우리말로 내용을 기록해두었다. 이후 혼자서 코딩을 통해 기능을 구현하는데 말로 표현된 것을 swift 작성 문법에 맞게 코드를 작성하니 생각한 대로 작동하였다. 10 분 남짓한 논의로 작성한 의사코드 한 페이지가 전체적으로 코드의 구조를 어떻게 구성할지를 고민하는 시간을 획기적으로 줄여준다는 것을 느꼈다. 시간을 더 들여서 메서드의 세부 구현 방법까지 협의하였다면 정말 비슷한 코드를 짰을 수도 있겠다는 생각이 들었다.

문제점 / 고민한 점

프로젝트 수행 (Step 1)

고민한 점

  • 개행 스타일: 상수/변수부와 메서드부 사이에 개행을 한 번만 사용
  • 메서드 단위: 개별 메서드가 적은 기능을 수행하도록 메서드를 기능별로 최대한 분할
  • 메서드, 프로퍼티, 변수/상수명: API Design Guidelines 작명법 숙지, 준수
  • 실제와 같은 상황을 모사하여 타입 구현: 컴퓨터와 사용자에게 각각 Player 클래스의 인스턴스를 부여
  • 승리 판단 로직: 1, 2, 3 중 두 수를 선택하였을 때 1 차이만큼 큰 수가 이기되 3은 1이 이긴다 -> 나머지 연산 활용하여 컴퓨터가 제시한 수를 이기는 수를 먼저 도출 (이기는 수 = 컴퓨터가 고른 수 % 3 + 1) -> 사용자의 선택이 이기는 수이면 승리, 컴퓨터와 같으면 비김, 아니면 패배

해결이 되지 않은 점

do try catch 구문을 활용하지 않고 옵셔널 바인딩으로 정수 이외의 입력 여부와 if 문으로 유효 범위 여부를 판단하여 처리하고자 하였으나 프로그램 동작을 위해 열거형에서 무의미한 rawValue를 지정하여 사용하였음.

익스텐션을 통해 프로토콜의 요구사항을 구현했을 때 장단점

프로젝트의 규모에 따라 장단점이 있어 보임. 가져다 쓰기는 편할 것 같은데, 프로젝트 규모가 커질수록 꼬일 수 있지 않을까?

해결 방법

  • 고민한 점에서 언급한 해결 방식을 채택
  • 리뷰어의 코드 리뷰 대기 중. 의견이나 공부해볼 것들을 알려주실 것으로 예상함. 추가 학습!!
profile
합리적인 해법 찾기를 좋아합니다.

0개의 댓글