Araina’s Blog

Apply object-oriented principles: Submission) Programming theory in action 본문

Unity Learn 번역/Pathway: Junior Programmer

Apply object-oriented principles: Submission) Programming theory in action

Araina 2022. 3. 1. 17:14

출처

 

Submission: Programming theory in action - Unity Learn

Now that you understand the pillars of object-oriented programming and how they are implemented, you’re ready to apply them in a brand new project. This is also a good opportunity to practice branching and merging in a version control repo.

learn.unity.com


 

1. 과제가 업데이트되었습니다!

여러분이 없는 동안 미션의 내용이 바뀌는 것을 대비하기 위해, 이번 과제를 제출하기에 앞서 아래의 항목들을 모두 이수하였는지 확인해주세요.

● Mission — Junior Programmer: Manage scene flow and data

 Abstraction in object-oriented programming

 Inheritance and polymorphism in object-oriented programming

 Encapsulation in object-oriented programming

 Profile code to identify issues

 


 

2. 서언

이전까지의 튜토리얼에서 여러분은 객체-지향 프로그래밍의 4가지 기둥들과 그 기둥들을 어떻게 활용해야 하는지에 대해 학습했습니다:

● 추상화 (Abstraction): 반복되는 세부 사항이나 정보들을 "추상화"하여 코드 중복을 줄입니다.

● 캡슐화 (Encapsulation): 데이터를 "캡슐화"하고 클래스 안에서 데이터를 함께 조작하는 메서드들이 다른 클래스에서 오용되지 않도록 보호합니다.

● 상속 (Inheritance): 부모 클래스에서 동작을 파생(또는 "상속")하는 자식 클래스.

● 다형성 (Polymorphism): 메서드들을 다양한("많은") 형태로 변경("모핑")합니다. (즉, 메서드 오버로딩 또는 메서드 오버라이딩)

이번 과제에서는 코드에서 각 기둥들을 시연하면서 처음부터 새로운 프로젝트를 생성해볼 것입니다.

코딩을 시작하기에 앞서서 높은 수준에서 여러분의 프로그램 구조를 신중히 계획하세요. 그 과정에서 버전 제어 소프트웨어를 통해 코드 분기와 병합을 연습하실 수 있으실 겁니다.

이번 과제는 쉽지 않겠지만, 여러분이 과제를 마쳤을 때는 더 주의 깊고 전략적인 프로그래머가 되어있을 것입니다!

완성된 과제에는 아래의 요소들을 포함해야 합니다:

● 프로젝트의 깃허브(GitHub) 리포지토리 링크, 커밋 메시지와 최소 2개의 브랜치(branch)가 포함된 여러 개의 커밋

● 추상화 시연 (불필요한 세부 사항들을 추상화하는 상위 수준의 메서드)

● 상속 시연 (부모/자식 클래스)

● 다형성 시연 (메서드 오버라이딩 또는 메서드 오버로딩)

● 캡슐화 시연 (getter와 setter)

 


 

3. 새로운 리포지토리 생성 및 최초 커밋(initial commit) 등록하기

이론적인 프로그래밍 구조에 관여하기 전에 여러분의 프로젝트가 버전 관리를 위한 설정이 제대로 되어 있는지를 확인해주세요.

1. "Programming-Theory-Repo"와 같은 형태의 이름으로 새로운 리포지토리를 Unity용으로 생성합니다.

2. "Programming Theory Project"와 같은 이름으로 빈 3D Unity 프로젝트를 여러분의 리포지토리 안에 생성합니다.

3. 프로젝트가 생성되고 나면 리포지토리에 대한 최초 커밋을 수행합니다.

이제 여러분은 새로운 버전 관리 리포지토리 안에 백업된 빈 Unity 프로젝트가 있어야 합니다.

만약 위의 작업들을 어떻게 해야 하는지에 대해 상기할 필요가 있다면, 이전 과제를 수행하는 단계들을 상세히 살펴보세요.

 


 

4. 프로젝트 디자인하기

프로젝트와 리포지토리가 모두 준비되었다면, 시간을 내어 객체-지향 프로그래밍의 4개의 기둥을 시연할 여러분의 프로젝트 콘셉트를 구상해보세요.

이 프로젝트는 실제 본격적인 프로젝트가 아니라 프로토타입이 될 수 있음을 염두에 두세요. 이는 기본적인 형태만 사용하거나 순전히 텍스트 기반일 수도 있습니다. 빈 캔버스에서 시작할 필요도 없습니다. - 만약 여러분이 Create with Code 과정을 완수하셨다면, 작업하셨던 프로토타입들이나 챌린지 과제들 중에서 하나를 골라 에셋들을 변경하셔도 됩니다. 여러분의 목표는 처음부터 보기 좋은 걸작을 만드는 것이 아닙니다. - OOP 기둥들: 추상화, 캡슐화, 상속, 다형성과 같은 요소들을 보여주는 창의적인 것은 생각해내는 것입니다.

여러분의 콘셉트를 개발할 때, 디자인 문서 또는 프로젝트 개요에 아이디어의 윤각과 자취를 남기세요. 만약 여러분이 Create with Code 과정을 완수하셨다면, 개인 프로젝트 랩에서 사용한 템플릿에서 영감을 얻어보세요. 또한 직전에 작업했던 자원 관리 프로젝트의 디자인 요약본에서 이미지를 그려볼 수도 있습니다. 여러분의 문서에는 글머리 기호로 된 개요, 스케치, 다이어그램이 포함될 수 있습니다. - 여러분의 아이디어를 구성하고 반복할 수 있는 가장 좋은 방법이라면 무엇이든지 좋습니다.

물론, 프로젝트 개발의 일반적인 과정에서는 프로젝트 기능을 프로그래밍 개념을 시연해야 하는 필요성에 기초하지는 않습니다! 아마 그 반대일 것입니다: 프로그래밍 개념들은 프로젝트의 기능들에 의해 주도될 것입니다.  그러나, 우선순위를 뒤집는 것은 재미있는 디자인 챌린지를 제공해줍니다! 이 4가지 프로그래밍 개념들을 사용하는 프로젝트를 어떻게 디자인할 수 있을까요? 아래의 순서대로 4개의 기둥들을 통해 생각해보는 것이 큰 도움이 될 것입니다:

1. 상속 - 오브젝트를 선택하세요

브레인스토밍을 시작하기 위해, 더 일반적인 오브젝트로부터 동작이 유래한 오브젝트가 무엇인지 떠올릴 수 있으신가요? 다른 오브젝트의 하위 유형인 어떠한 오브젝트를 떠올릴 수 있으신가요? 예를 들면 다음과 같습니다:

● 동물 → 고양이 / 개

● 탈 것 → 비행기 / 자동차 / 보트

● 토스터 → 기본 토스터 / 디럭스 토스터 / 프리미엄 토스터 

이것이 여러분의 코드에서 상속을 통해 구현할 수 있는 부모/자식 관계의 몇 가지 예시들입니다. 상속 기둥에 대한 더 자세한 사항은 상속 튜토리얼을 참고해주세요. 

여러분의 디자인 문서 또는 프로젝트 개요에서는 다음의 작업을 수행합니다:

프로젝트 콘셉트의 시작점으로 사용할 오브젝트들 적기.

2. 다형성 - 행동을 선택하세요

여러분의 프로젝트에서 사용할 객체의 유형과 그 하위 유형을 결정한 후에는, 여러분의 프로그램에서 수행할 수 있는 이러한 오브젝트들의 동작 유형과, 이러한 동작들이 오브젝트의 하위 유형에 따라 어떻게 "모핑" 될 수 있는지 생각해보세요. 예를 들어:

● 모든 동물들은 Jump() 함수를 가질 수 있지만, 고양이는 개와 달리 다른 점프 능력을 가질 수 있습니다.

● 모든 탈 것들은 Move() 함수를 가질 수 있지만, 비행기는 3차원 모두 움직일 수 있으며, 역방향으로는 움직일 수 없습니다.

● 모든 토스터들은 Toast() 함수를 가질 수 있지만, 프리미엄 토스터는 특별한 "베이글" 설정이 있을 수도 있습니다.

여러분도 아시다시피, 다형성은 동일한 이름의 메서드들이 다른 매개변수 타입으로 오버로드되어 다양한 형태("다(Poly)" + "형성(morphs)")를 가질 수 있음을 나타냅니다. 여러분은 이러한 매서드들 중 하나가 취할 수 있는 다양한 매개변수 입력을 고려할 수도 있습니다. 예를 들어, Jump() 함수는 점프의 최대 높이[Jump(float maxHeight)] 또는 점프에 적용된 힘[Jump(Vector3 jumpForce)]을 취할 수 있습니다.

다형성 기둥에 대한 더 자세한 사항은 다형성 튜토리얼을 참고해주세요.

여러분의 디자인 문서 또는 프로젝트 개요에서는 다음의 작업을 수행합니다:

여러분의 애플리케이션 안에서 프로그래밍하려는 함수 또는 동작의 유형들을 나열하기.

3. 캡슐화 - 데이터를 선택하세요

캡슐화는 클래스 내부의 데이터를 보호하여 데이터가 오용되거나 여러분의 애플리케이션이 손상되지 않도록 합니다. 다른 클래스들이 데이터를 가져오거나 설정할 수 있게 하면서 이러한 방식으로 어떤 데이터를 보호할 것인지를 생각해보세요. 예를 들어: 

● 동물의 경우, 이름을 가져오거나 설정해야 하지만, 이름이 너무 길어지지 않도록 막습니다.

● 탈 것의 경우, 연도를 가져오거나 설정해야 하지만, 연도에 음수 값이 들어갈 수 없도록 확인합니다.

● 토스터의 경우, 빵의 종류를 가져오거나 설정해야 하지만, 유효한 종류의 빵인지를 확인합니다.

캡슐화 기둥에 대한 더 자세한 사항은 캡슐화 튜토리얼을 참고해주세요.

여러분의 디자인 문서 또는 프로젝트 개요에는 다음의 작업을 수행합니다:

프로젝트 내에서 캡슐화를 하고자 하는 함수 또는 데이터의 유형 기록하기.

4. 추상화 - 기능을 선택하세요

여러분이 이미 코딩을 하고 계신다면, 추상화는 구현하기 가장 쉬운 개념일 수도 있습니다. 하지만 코딩을 시작하기에 앞서서 여러분의 프로젝트 내에서 여러분이 원하는 상위-수준 함수들을 생각해보는 것이 도움이 될 수 있습니다. 예를 들어:

● 동물의 경우, Walk(), Jump(), Talk() 함수가 있을 수 있습니다.

● 탈 것의 경우, TurnOn(), Move, TurnOff() 함수가 있을 수 있습니다.

● 토스터의 경우 Start(), SetLevel(), Cancel() 함수가 있을 수 있습니다.

추상화 기둥에 대한 더 자세한 사항은 추상화 튜토리얼을 참고해주세요.

여러분의 디자인 문서 또는 프로젝트 개요에는 다음의 작업을 수행합니다:

코드 내에서 재사용하기 유용한 상위-수준 함수들 기록하기.

이제 여러분의 프로젝트 내에서 달성하고자 하는 것에 대해 아이디어가 있어야 합니다. - 여전히 매우 개념적으로 느껴지시더도, - 여러분의 아이디어들을 문서화하여 기록하셔야 합니다.

만약 여러분의 프로젝트를 위해 무엇을 해야 할지 아이디어가 전혀 떠오르지 않으신다면, 매우 단순한 프로젝트에 대한 아이디어를 제공해드리겠습니다:

● "Shape" 부모 클래스를 상속하는 3가지 서로 다른 색상의 Shape 클래스가 있습니다. (상속)

● 각각의 모양(Shape)을 클릭하면 재정의된(Overriden) DisplayText() 함수에 의해 화면에 서로 다른 결과물을 출력합니다. (다형성)

● 각각의 모양들은 이름 또는 색상처럼 데이터를 포함하며, 이는 getter, setter와 함께 속성으로써 저장됩니다. (캡슐화)

● 코드는 상위 레벨 메서드를 통해 코드 중복을 줄이는 방식으로 구성됩니다. (추상화)

 


 

5. 타이틀 화면을 위한 브랜치(branch)를 생성하고 커밋 변경하기

특히 다수의 개발자들과 일을 할 때는 버전 관리 도구에서 브랜치가 매우 유용합니다. 개발자들은 일반적으로 새로운 기능을 구현할 때 새로운 브랜치를 먼저 생성한 뒤 작업을 시작하며, 실험을 할 때 다른 개발자들의 코드를 간섭하고 싶지 않아 합니다.

새로운 기능을 구현한 뒤에는 브랜치를 메인 브랜치(main branch)와 병합한 다음, 발생하는 병합 충돌 문제를 처리합니다. 만약 병합 충돌이 무엇인지에 대해 기억이 나지 않으신다면, 버전 관리 도구 설정 튜토리얼을 참고해주세요.

이 과정에 익숙해지기 위해 여러분의 프로젝트 타이틀 스크린에 대한 새로운 브랜치를 생성하고 병합해봅시다.

만약 여러분의 앱에 타이틀 스크린이 없다면, 여러분의 프로젝트 중 다른 간단한 기능을 사용하셔도 됩니다.

1. 여러분의 리포지토리 안에 새로운 브랜치를 생성하고 이름을 "title-screen" 형식으로 설정합니다. 새로운 브랜치를 어떻게 생성하는지 잘 모르시겠다면 GitHub의 설명서를 참고해주세요. 해당 브랜치에서는, 다른 개발자의 작업물에 어떠한 영향도 받지 않고 안전하게 새로운 기능을 실험해볼 수 있습니다.

이제 "Current Branch" 필드의 이름이 방금 생성한 여러분의 새로운 브랜치로 설정되어 있어야 합니다.

2. 새로 생성한 브랜치에서 여러분의 타이틀 스크린을 개발하세요. 여러분의 프로젝트 내에서 과제에 대한 간단한 타이틀 스크린을 제작합니다. 여기에는 프로젝트 콘셉트와 관련이 있어야 하며, 아래의 예시와 같이 매우 간단해야 합니다.

여러분의 작업물을 개발하고 저장할 때는 여러분의 버전 관리 소프트웨어에서 Changes 패널 안에 반영된 브랜치에 대한 모든 수정 및 추가 사항들을 확인하셔야 합니다.

3. 해당 브랜치의 변경 사항들을 메인 브랜치와 병합하기 위해 여러분이 작업한 변경 사항들을 커밋(commit)합니다. 버전 관리 도구 내에서 요약 및 설명을 작성하고 commit to [branch-name] 버튼을 클릭합니다.

이제 변경 사항이 브랜치에 커밋되었으며, 마스터 브랜치(master branch)와 병합할 준비가 되었습니다. 

 


 

6. 브랜치를 마스터(master) 브랜치와 합치기

타이틀 스크린(또는 다른 기능)이 완성되었다면, 이제 실험 브랜치를 메인 개발 브랜치에 병합할 준비가 되었습니다.

1. 마스터 브랜치로 돌아가려면, Current Branch 드롭-다운 메뉴를 클릭하고 main 브랜치를 선택합니다. 

메인 브랜치로 다시 전환하면 여러분의 Unity 씬에서 모든 변경 사항들이 사라진 것을 보실 수 있으실 겁니다. 걱정 마세요. - 여러분이 새로운 기능 구현을 시작하기 이전 단계의 프로젝트로 돌아간 것이므로, 예상된 변화입니다. 여러분이 구현하셨던 기능들은 대규모 병합 이후에 프로젝트 내에 다시 나타날 것입니다.

만약 여러분이 마지막 커밋 이후에 프로젝트를 수정하신 경우, 브랜치 상에 "변경 사항 그대로 두기(Leave changes)" 옵션과 메인 브랜치로 "변경 사항 가져오기(Bring changes)" 옵션 중에 하나를 선택할 수 있는 창이 표시될 것입니다. 이는 여러분의 브랜치에 대한 변경 사항들이 아직 커밋되지 않았음을 의미합니다. 우선 Cancel 버튼을 클릭하고, 모든 변경 사항들이 여러분의 브랜치 상에 커밋되었는지 확인하신 다음, 다시 메인 브랜치로 전환해주세요.

2. 브랜치 드롭-다운 메뉴에서 Choose a branche to merge into main 버튼을 클릭합니다. 그런 다음, 다른 브랜치를 선택하고 Merge [branch-name] into main을 클릭합니다.

여러분의 Unity 씬으로 돌아와 보시면, 여러분의 브랜치에서 작업하셨던 변경 사항들이 이제 메인 브랜치에 반영되었음을 알 수 있습니다. 성공적으로 병합하신 걸 축하드립니다!

 


 

7. 과제 계속 수행하기

이제 여러분의 리포지토리에서 새로운 브랜치를 생성하고 병합하는 데 익숙해지셨으므로, 해당 기술을 사용하여 여러분의 프로젝트를 계속 개발해나가시면 됩니다.

명심하세요. 여러분의 프로젝트는 OOP의 4가지 기둥들을 코드 상에서 시연해야 합니다. 이는 그리 쉬운 일이 아닐 겁니다. 최소한 몇 시간 정도는 할애하셔야 할 것이며, 그중 대부분의 시간을 문제 해결 및 구글링에 쓰시게 될 것입니다.

 


 

8. 프로젝트 등록하기

여러분의 프로젝트 내에서 OOP의 4가지 기둥을 모두 구현하신 뒤에는 여러분의 프로젝트를 등록하고 공유해주세요! 하지만 그전에 테스트 플레이를 철저하게 하셨는지 확인해주세요. - 또는 친구들이나 가족들에게 테스트 플레이를 부탁하는 것이 더 좋습니다.

성공적인 과제 결과물에는 다음과 같은 요소들이 포함되어야 합니다:

● 프로젝트의 깃허브(GitHub) 리포지토리 링크, 커밋 메시지와 최소 2개의 브랜치(branch)가 포함된 여러 개의 커밋

● 상속 시연 (부모/자식 클래스). 코드 내에 "// INHERITANCE"라는 주석을 달아 구현된 위치를 표시해주세요. 

● 다형성 시연 (메서드 오버라이딩 또는 메서드 오버로딩). 코드 내에 "// POLYMORPHISM"이라는 주석을 달아 구현된 위치를 표시해주세요.

● 캡슐화 시연 (getter와 setter). 코드 내에 "// ENCAPSULATION"이라는 주석을 달아 구현된 위치를 표시해주세요.

● 추상화 시연 (불필요한 세부 사항들을 추상화하는 상위 수준의 메서드). 코드 내에 " ABSTRACTION"이라는 주석을 달아 구현된 위치를 표시해주세요.

여러분의 프로젝트 스크린숏을 첨부하시거나, 프로젝트를 시연하는 영상을 녹화하신 뒤, 여러분이 제작하신 것을 게시하여 저희와 공유해주세요.

최소한 1명 이상의 개발자분의 과제 제출물에 댓글을 다는 것을 강력히 추천드립니다. 다른 분들은 성공적으로 과제를 완수하셨나요? 프로젝트의 어떤 부분이 마음에 드셨나요? 그분들이 추가를 고려할 수 있는 멋진 새로운 기능은 무엇인가요? 

 


파일 업로드 (하단 링크 참조)

 

Submission: Programming theory in action - Unity Learn

Now that you understand the pillars of object-oriented programming and how they are implemented, you’re ready to apply them in a brand new project. This is also a good opportunity to practice branching and merging in a version control repo.

learn.unity.com


 


 


수고하셨습니다!


Comments