Skip to content

조회 수 46 추천 수 5 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 첨부

게임 캐릭터 속성을 클로저 빌더 패턴으로 정하는 방법 엿보기.

 

 

어떤 주니어 분이 이 프로젝트에 합류한 것은 아닌데 외주 나간 곳에서 너무 잘 배웠다고 하셨고,

이 프로젝트 캐릭터 옵션 생성이 쓰는 형태이기도 해서 이번에는 클로저를 이용한 빌더 패턴을 씁니다.

기 설명했었던, 회사 소스는 공개가 어렵습니다만, 다음처럼 따로 예제 소스를 만든 것이 더 도움 되실 것 같습니다.

 

그럼 ,

 


class Imadethis {
    var name : String 
    var family : Int
    var height : Float
    var weight : Float
}

 

 

OOP의 정수는 클레스 설계시, 우리가 세상을 보는 눈 그대로 만드는데 있습니다. 그래서 삶의 경험이 있는 사람은 누구든 이해할 수 있게 하는 것이죠.

그래서 네이밍이 가장 중요한데 Person 은 너무 흔하고 코딩계의 추상적 개념들이 그대로 옮겨지지도 않으니 바꿔봅니다.

 

클래스는 초기값을 줘야 합니다. 

 

 

class Imadethis {
    var name : String 
    var family : Int
    var height : Float
    var weight : Float
    init() {
        name = ""
        family = 0
        height = 0.0
        weight = 0.0
    }
}

 

클래스에서 객체를 생성해 봅시다. 메모리에 없어서 실체가 없다고 하는 것인데 new를 해서 만들던, malloc()으로 만들던 그냥 뒤에 ()를 붙여서 만들던 모든 프로그래밍 언어에서 메모리에 생성하는 순간 실체가 있다고 말합니다. 실체가 아니라 그냥 메모리에 공간 확보를 하는 것이죠.

 

var hjh : Imadethis = Imadethis()
var lsr : Imadethis = Imadethis()

 

2개를 만들어 봅니다.

 

 

hjh.name = "hajunho"
//값을 줘 봅니다. 
print(hjh.name)
//값을 찍습니다.

 

이 클래스를 다른 사람에게 주면 제 이름을 욕으로 바꾸겠죠?

hjh.name = “fuc-“

그래서 private 으로 선언합니다.

 

class Imadethis {
    private var name : String 
    var family : Int

 

-- 사실 앵간하면 private 이죠. ^^;;

 

private 으로 선언했으니 메소드로 바꾸게 해줘야 합니다. setter getter 만드는 것이죠.

 

    func setName(name : String) {
        self.name = name
    }
    func getName() -> String {
        return self.name
    }

//이제 이렇게 불러야 합니다.
hjh.setName(name: "hajunho")
print(hjh.getName())

 

 

if name == “fuc-“  구문을 setter에 넣어주면 fuc-가 들어왔을 때 값을 자동 수정해 주거나 다시 재입력 받게끔 할 수 있겠죠.

 

이것은 OOP에서 캡슐화라고 합니다. 캡슐로 감싸서 값의 변조를 방지하는 거죠. 이렇게 encapsulation 하는 행위를 방어코딩이라고 합니다.

 

별거 아닌 것 같은데 속도의 잘못된 세팅을 막는다고 하면 급발진을 막을 수도 있겠죠. 다른 사람이 못 짰어도 그걸 받는 곳에서 방지할 수 있습니다.

 

10년 동안 아무 일도 안 하다가 방어 코딩 클래스 한 번 이면 수 많은 사람들의 목숨을 살릴수도 있겠죠.

 

짧은 예제라 이런데…  실무에서 쓰는 클레스는 값이 이렇게 간단하지 않습니다.

 

엔티티 하나만 해도 필드가 꽤 됩니다. 클래스는 결국 DB 에 가서 박히니까요. 애트리뷰트, 프로퍼티, 속성, 멤버변수를 필드라고도 말했습니다.

(메모리 입장에서는 다 같은 녀석들) 그런데  1차원 적이라면 편하지만 보통 옵션을 만들다 보면 클래스가 다시 멤버가 됩니다. 즉,

 

프로퍼티를 접두어를 명확히 적어주는 Obj-C 코드로 보자면,

 

@property (nonatomic, strong)  Imadethis    * _Nullable Persons;

 

이렇게 들어가는거죠. 최소 2depth 이상을 가지는 캐릭터를 만들다 보면 만들때 마다 일일이 세팅해주지 않습니다.

 

물론, 캐릭터 생성 메뉴에서 default 값을 미리 넣어 두고 init param 으로 번에 넘길 수는 있겠죠.

 

    init(name: String, family: Int, height: Float, weight: Float) {
        self.name = name
        self.family = family
        self.height = height
        self.weight = weight
    }

 

init을 이렇게 만들고, 세팅 메뉴에서 textbox 만들고 placeholder에 넣고 싶은 기본 값을 미리 세팅해 두는 방식입니다.

 

그러면 값이 넘어갈 이렇게 넘어 가겠죠.

 

var hjh : Imadethis = Imadethis(name: "hajunho", family: 3, height: 170, weight: 80)

 

그러나 그건 UI 설계에서 넘기는 방식이고, 위에서 setter를 만든 것 처럼 값 검증을 할 수 없습니다.

 

그래서 builder 패턴을 씁니다.

 

builder 패턴은 setter self 라는 리턴값을 두면 됩니다.

 

    func setName(name : String) -> Self {
        self.name = name
        return self
    }

 

family setter 한 번 만들어 보세요 ^^

 

 func setfamily(family : Int) -> Self {
        self.family = family
        return self
    }

 

쉽죵. self 클래스 객체가 return 되기 때문에 .(dot) 계속 찍어 있습니다.

 

var lsr : Imadethis = Imadethis()
lsr.setName(name: "leesora").setfamily(family: 3)


//정리하면

lsr.setName(name: "leesora")
    .setfamily(family: 3)

 

그래서

 

.setAAA…

.setBBB…

 

로 세팅을 계속 해 나갈 수 있고 init()에 파라미터 넣는 것처럼 모든 값을 넣지 않습니다. 매우 긴 obj-c @property를 예제로 든 이유도 그렇습니다.

저걸 하나하나 다 세팅하기는 힘들죠.

 

 

자 여기까지가 일반적으로 인터넷에 설명하는 빌더 패턴입니다. 빌더 패턴이 꼭 필요한 이유를 넣어서 조합해 보았습니다.

 

그러면 객체의 상태(속성, property, attribute 다 비슷한 말) 세팅이 2중으로 되어 있는 경우는?

 

실무에서 쓰이는 혹은 제가 자주 실무에서 쓰는 2depth 이상은 다음과 같이 만듭니다.

 

 

class Characteristics {
    private var favorites : String = ""
    private var talents : String = ""
    private var preciousThings : Int = 0
    func setFavorites(f: String) -> Self {
        self.favorites = f
        return self
    }
    func setTalents(t: String) -> Self {
        self.talents = t
        return self
    }
    func setPreciousThings(p: Int) -> Self {
        self.preciousThings = p
        return self
    }
}

 

 

init() 없애고 코드를 줄였습니다. getter 만들겠습니다. 옵셔널은 아실테니

 

 

class Imadethis {
    private var name : String 
    private var characters : Characteristics = Characteristics()
.
.
.

 

이런 경우 Characteristics 클래스의 멤버를 어떻게 세팅할까요?

 

var lsr : Imadethis = Imadethis()
lsr.setName(name: "leesora")
    .setCharacters().setFavorites(f: "Cooking")

 

 

이렇게 세팅합니다.

 

getter를 만들어서 값을 뽑아 보세요 ^^(문제1)

 

실제로는 setter 함수들이 저렇게 간단하지는 않겠죠. 수 많은 작업들을 합니다. 3D 작업일 수도 DB 작업 일 수도 사용자 세팅일 수도 있죠.

 

.setCharacters().setFavorites(f: "Cooking”) 로는 반환되는 값이 Imadethis 가 아니라 캐릭터리스틱이라 다시 세팅을 못하죠?

 

그래서 init할 때 ImadeThis 를 넣어주고 return 에서 return self 가 아닌 ImadeThis를 받은 멤버변수를 넣어 주면 됩니다.

 

(요건 두 번 째 문제로 할께요.)

 

여기까지는 이해하는 단계입니다.

 

실제로는 이 전에 말씀드렸던 더블 클로저 개념을 이해하셨으면 Builder Factory로 갑니다.

 

클래스 메소드로 빌드 함수를 두는 것입니다. 이는 Swift 에서는 프로토콜, Obj-C 나 JAVA에서는 인터페이스 로 상속을 내리는 이유입니다.

(문제 3으로 생각하시고 만들어 보시면 되겠네요.)

 

문제1 만드셨으면

 

 

print(lsr.getCharacters().getFavorites())

 

 

가 되겠죠? 문제가 몰려… 짜증나실까봐 ^^

 

 

빌더 메소드에 파라미터를 던져주면 비로소 실무에서 쓰는 빌더 패턴이 됩니다. 더블 클로저에서 말씀드렸던 것처럼 ()를 안 적어주고

바로 {} 시작하면 세팅된 메소드 자체를 넘겨주게 되는거죠. 예제로 풀어 쓰면
 

var temp : Characteristics = Characteristics()
temp.setTalents(t: "Playing")
lsr.optionBuilder(alracter: temp) 
.
.
.
func optionBuilder(alracter: Characteristics) {
        self.characters.setTalents(t: alracter.getTalents())
    }

 

객체를 생성하고 옵션을 전달하는 것은 이렇게 하면 되는데 Swift에서는 클로저가 있지요!

 

클로저로 바꿉니다.

 

    func optionBuilder(_ alracter: (Characteristics)-> ()) {
        alracter(characters)
    }

 

캐릭터, 개랙터 하다보니 알렉터가 생각나서…(독수리 5형제, 저는 아재)

 

var lsr : Imadethis = Imadethis()

//이제,
lsr.setName(name: "leesora")
    .setCharacters().setFavorites(f: "Cooking")

//이런식보다

lsr.optionBuilder { c in
    c.setTalents(t: "English")
    c.setFavorites(f: "Love")
    c.setPreciousThings(p: 18)
}

 

이런식의 빌더 패턴이 눈에 확 들어오실 것 같습니다.

 

클로저는 사랑이죠.

 

함수는 내가 만들테니 함수를 통채로 받아서 적절한 곳(접근 제한자)에서 적당한 시기에(빌더를 만드는 순간)에 실행(()) 하도록!

 

초급자 분께는 다소 어려울 수 있으나 여기 나온 키워드로 시나브로 따라오시면 될 것 같습니다.

 

 

실무자 분께는 obj-c 에서도 이런 식의 빌더 패턴이 된다는 말씀을 드리고 싶네요.

 

[lsr optionBuilder :^(Characteristics * _Nonnull c) {
            [c setTalents:@"English”];
            [c setFavorites:@"Love”];
            [c setPreciousThings:18];
        }];

 

뭐 이런 식이겠죠 ^^ 더 명시적이라 좋다능....

 

그럼, 다음 한 주도 늘 건강하고 행복하시기 바랍니다. 

 

 

661c3b7dced6caecd13c098b12f43350.png

 


  1. notice

    일반개발강좌 게시판 이용안내 (등록포인트:1,000)

    여러분만의 iOS 관련 개발 노하우를 등록해 주세요. Objective-C, Swift, 맥에서의 개발노하우 등 iOS개발에 관한 어떠한 내용이든 상관없습니다. 강좌 작성 가이드 이미지첨부는 파일첨부한후 "본문삽입버튼"으로 본문에 삽입하는 해주세요 링크는 자동으로 ...
    Date2015.02.26 By아이폰데브 Views1033
    read more
  2. Swift Note 4 - 모든 앱이 내가 된다! (5/10)

    도메인 지식 편입니다.    도메인 지식은 맛집 레시피와 같아서 매우 간단하지만 아는 것과 모르는 것은 하늘과 땅 차이라는…     본론은 짧고 서론이 길어서 서론을 가장 뒤로 보냅니다(?)  단순히 아… 넷플릭스를 똑같이 구현하는 프로젝트를 알려주는 글 정...
    Date2021.11.24 Byinfighter Views43
    Read More
  3. Swift Note 4 - 모든 앱이 내가 된다! (4/10)

    게임 캐릭터 속성을 클로저 빌더 패턴으로 정하는 방법 엿보기.     어떤 주니어 분이 이 프로젝트에 합류한 것은 아닌데 외주 나간 곳에서 너무 잘 배웠다고 하셨고, 이 프로젝트 캐릭터 옵션 생성이 쓰는 형태이기도 해서 이번에는 클로저를 이용한 빌더 패...
    Date2021.11.16 Byinfighter Views46
    Read More
  4. No Image

    간단한 QRCode 생성에 관한 프로젝트 예제입니다.

    안녕하세요.   최근 질문에 QRCode 생성과 관련된 게시글이 올라와 있어서 다른 개발자 분들과 간단한 코드 생성 예제를 만들어 공유하고 싶어서 이렇게 글을 올립니다.   라이브러리는 ZXing-Objc 로 CocoaPods 기반으로 적용하여 작업하였습니다.   코드는 ...
    Date2021.11.15 By라임허브 Views38
    Read More
  5. Swift Note 4 - 모든 앱이 내가 된다! (3/10)

    서론 : 게임 센터를 선택한 이유에 대해서 적어야 하는데 사실, 본론보다 서론이 더 중요합니다.   GameCenter : 게임 센터(Game Center)는 애플이 출시한 온라인 멀티 플레이 소셜 게이밍 네트워크이다.[1][2] 사용자들이 친구들을 초대하여 게임을 즐길 수 ...
    Date2021.11.09 Byinfighter Views50
    Read More
  6. Swift Note 4 - 모든 앱이 내가 된다! (2/10)

     올려진 앱에 대해 조금 더 구체적으로 들어가 봅니다.    사실, 이번 강좌에서 말씀 드릴 것은 단 하나 입니다. 오픈 소스들을 통과해서 흐르는 데이터의 흐름을 먼저 생각하시면 됩니다. 소스 코드를 약간 보면서 풀어 써 봅니다. 참! 제 도그마에 갇히면 안...
    Date2021.11.02 Byinfighter Views47
    Read More
  7. Swift Note 4 - 모든 앱이 내가 된다! (1/10)

    서두   아이폰데브에 올리면서 완전히 새롭게 씁니다. 아재 개그라도 시도해 보는게 제가 진짜 원하는 것 같아서요. 부제를 제목으로 썼네요. 실패할 수도 있는 프로젝트라서 그렇습니다. 스타트업부터 소기업 중기업 대기업의 상품과 끝 단에서 개발을 했었기...
    Date2021.10.26 Byinfighter Views79
    Read More
  8. Swift Note 3 - Event Driven Programming (feat. Microsoft & MFC)

    개인사정으로 업데이트가 늦었습니다. 죄송합니다.(일주일에 하나씩 올리려고 했는뎅 ㅠㅠ)   내용은 경어체로 바꾸었습니다. 이번 편은 히스토리가 많아 대부분 이론입니다. 그리고 이미 이전 강좌가 이벤트 기반 프로그램 소스입니다. 다음 편에는 실제 proj...
    Date2021.10.20 Byinfighter Views52
    Read More
  9. Swift Note 2 - Atomic Programming

    Atomic Programming   제가 프로그래밍을 보는 시각을 공유합니다. 아이폰 데브 회원분들이 새로운 아이디어를 떠올릴 수 있는 발판이 되었으면 합니다. 그리고 이런 커뮤니티를 지속적으로 운영해 주는 미노님께 감사드립니다.   주의 : 1 2로 나누어져 있습...
    Date2021.10.07 Byinfighter Views67
    Read More
  10. Swift Note 1 - 함수의 타입은 ()->() 입니다.

    출판했던 책 속편을 쓰다 개인 사정에 의해 아이폰 데브의 온라인 강좌로 전환합니다. 제 글이 취향에 맞는 분들이 많이 계실지는 모르지만, 늘 공부하는 개발자의 태도 만큼은 공통 분모로 생각하기에 편히 시작해 봅니다. 미리 준비 한 부분 중 정말 필요한 ...
    Date2021.10.01 Byinfighter Views73
    Read More
  11. No Image

    Github Authentication failed 관련 이슈

    안녕하세요.    최근 Github의 인증 관련해서 이슈가 발생되어 해결 방안을 찾아보다 이곳에 공유해보면 좋을 것 같아 짧게나마 적어보려고 합니다. (이미 다들 해결하셨을 것 같기는 하지만 혹시 모를 저와 같이 찾아 헤메는 일이 없도록...)   지난 8월 13일...
    Date2021.08.15 By라임허브 Views57
    Read More
  12. Objective-C 노하우 2가지 공유(글 업뎃 on iOS 14.6)

    =결론=   Obj-C 2.0 이상이고, 본인 프로젝트에서 메모리 사용량이 100%에 달하는 구간이 있는 앱이라면, 데이터 처리는 class 변수 말고 @property로 가고 @synthesize는 필수로 쓰세요.  왠만하면 DB(sqlite)로 데이터 넘기는 구조가 안전합니다.   =내용=  ...
    Date2021.06.11 Byinfighter Views155
    Read More
  13. No Image

    Hohyeon Moon - SwiftUI 강좌 (한글)

    업무상 iOS 12도 지원해야 해서 아직 Storyboard로 개발하고 있지만, 개인적으로 개발하려는 앱을 SwiftUI로 시작하기 위해 검색하던 중 괜찮은 강좌가 있어 소개합니다. 전체적으로 깔끔하고 간결하게 정리되어 있고 무려 한글로 작성되어 있어 처음 시작하는...
    Date2021.05.31 By프랑비 Views192
    Read More
  14. 스위프트UI 개발 로드맵

    도표로 정리된 내용이 있어서 공유합니다. 참고하세요~   SwiftUI Developer Roadmap https://karinprater.medium.com/on-the-road-to-learn-swiftui-8b26b528199c        
    Date2020.11.18 By미노 Views1477
    Read More
  15. Autolayout Content Hugging 과 Compression Resistance 정리

        개념 정리 Content hugging : 최대 크기에 대한 제한. 주어진 크기보다 작아질 수 있다. Content compression resistance: 최소 크기에 대한 제한. 주어진 크기보다 커질 수 있다. intrinsicContentSize The natural size for the receiving view, conside...
    Date2020.05.20 ByHjoon Views323
    Read More
  16. No Image

    Swfit - AST - SubstitutionMap - 1 (간단한 설명)

    Swift source : https://github.com/apple/swift.git include/swift/AST/SubsitutionMap.h   SubstitutionMap is a data structure type that describes the mapping of abstract types to replacement types, together with associated conformances to use f...
    Date2020.05.11 Bystanley Views226
    Read More
  17. No Image

    IR - Intermediate Representation

    Swift IR에 관련해서 글을 올릴려고 이것저것 찾아봤는데 기본 개념을 집고 넘어가는 게 좋을듯 해서 IR에 관해서 올립니다. 아래의 순서로 올리겠습니다. IR LLVM IR LLVM IR 문법 Swift IR Swift IR 문법 https://en.wikipedia.org/wiki/Intermediate_repres...
    Date2020.04.14 Bystanley Views164
    Read More
  18. No Image

    swift의 reduce메소드의 소스코드 분석

    swift/stdlib/public/core/SequenceAlgorithms.swift     /// Returns the result of combining the elements of the sequence using the   /// given closure.   ///   /// Use the `reduce(_:_:)` method to produce a single value from the elements   ///...
    Date2020.04.01 Bystanley Views208
    Read More
  19. No Image

    swift의 map 소스코드 분석

    swift/stdlib/public/core/Map.swift 을 따라가다 보면  swift/stdlib/public/core/Sequence.swift 에서 기본 map메소드를 정의를 하고 있습니다.       /// Returns an array containing the results of mapping the given closure   /// over the sequence's...
    Date2020.04.01 Bystanley Views281
    Read More
  20. No Image

    LINE Free Call에 iOS 다크 모드 적용하기

    라인 개발자 블로그 링크 공유합니다. 참고하세요~   LINE Free Call에 iOS 다크 모드 적용하기 https://engineering.linecorp.com/ko/blog/line-free-call-ios-dark-mode/
    Date2019.12.18 By미노 Views308
    Read More
  21. 웹뷰 개발 미세팁.(사파리에서 콘솔로그 보기)

    안녕하세요. 빗방울입니다.   iPhoneDev 아이폰 개발자 분들이 늘어나고 있는 것 같아 제가 알고 있는 미세팁을 조금이라도 많은 분들께 공유하고자 합니다. (이미 알고 계시는 분들 매우 많을 것 같지만 그래도, 게시판에 글을 남겨 놓으면 나중에 신입 개발...
    Date2019.06.18 By빗방울 Views632
    Read More
Board Pagination Prev 1 2 3 4 5 6 Next
/ 6

미답변질문들

아이폰데브 미답변질문들

운영진홈페이지

미노웍스 홈페이지

불편사항접수

아이폰데브 불편사항접수

구독하기

아이폰데브구독하기

후원하기

아이폰데브 후원명단
아이폰데브 후원하기

아이폰데브 모바일앱

아이폰데브 모바일앱

Socail Media

회원수   전체 : 12,321   오늘 : 0   어제 : 7   |   방문자수   전체 : 2,568,167   오늘 : 127   어제 : 1,037   |   페이지뷰   전체 : 39,910,666   오늘 : 516   어제 : 5,454  

sketchbook5, 스케치북5

sketchbook5, 스케치북5

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소