Araina’s Blog

Apply object-oriented principles: Quiz) Apply object-oriented principles 본문

Unity Learn 번역/Pathway: Junior Programmer

Apply object-oriented principles: Quiz) Apply object-oriented principles

Araina 2022. 3. 1. 17:10

출처

 

Quiz: Apply object-oriented principles - Unity Learn

This quiz will assess your understanding of the concepts covered in the Junior Programmer: Apply object-oriented principles mission.

learn.unity.com


 

 

문제 1

참 또는 거짓:

일반적으로 클래스들은 각 클래스가 1가지 목적만 가지도록 구성되고 작성되어야 합니다.

  1. 거짓

 

- 정답

더보기

답: 1

여러분의 클래스들을 1가지 목적만 가지도록 작성하면 가독성이 높아지고 디버깅도 수월해집니다.

 


 

문제 2

C#에서 메서드 확장 기능을 사용하는 이유는 무엇인가요?

  1. 확장 메서드에 더 많은 매개변수를 추가하기 위해
  2. 동일한 메서드 이름을 사용하여 기존 메서드의 기능들을 확장하기 위해
  3. 기존 메서드에 접근할 방법을 확장하여 다른 클래스들에서 접근이 가능하도록 만들기 위해
  4. 새로운 파생 타입을 생성하지 않고 기존의 타입에 새로운 기능들을 추가하기 위해

 

- 정답

더보기

답: 4

확장 메서드는 직접 수정이 불가능한 기존의 클래스들에 새로운 메서드들을 효과적으로 추가할 수 있도록 해줍니다. 이는 즉, 해당 클래스들을 다시 컴파일할 필요가 없음을 의미합니다.

 


 

문제 3

아래의 항목들 중 부모(기본) 클래스와 자식(파생) 클래스에 대해 옳게 설명한 것은 무엇인가요?

  1. 클래스는 오직 하나의 클래스에서만 상속할 수 있습니다.
  2. Protected 변수들과 메서드들은 별개의 스크립트여도 자식 클래스라면 접근이 가능합니다.
  3. Private 변수들과 메서드들은 별개의 스크립트여도 자식 클래스라면 접근이 가능합니다.
  4. 만약 클래스 C가 클래스 A에서 파생된 클래스 B의 파생 클래스라면, 클래스 C는 클래스 B의 기능들만 상속할 수 있습니다.

 

  1. 1번만 참
  2. 1번과 2번만 참
  3. 2번과 3번만 참
  4. 3번과 4번만 참
  5. 모두 참

- 정답

더보기

답: 2

3번 항목의 경우, private 변수들과 메서드들은 파생 클래스가 기본 클래스에 중첩된 경우에만 접근이 가능합니다. 4번 항목의 경우, 클래스 C는 클래스 B와 클래스 A를 포함하여 모든 기본 클래스로부터 상속을 받습니다.

 


 

문제 4

만약 사용자들이 고유의 차량들을 구성할 수 있는 애플리케이션을 프로그래밍한다면, 어떻게 해야 중복을 최소화하는 방법으로 상속의 개념을 사용하여 코드를 구성할 수 있을까요?

  1. "Cars"라는 이름의 네임스페이스(namespace)를 생성하고 모든 차량 타입을 해당 네임스페이스에 넣습니다.
  2. "Car" 이벤트를 생성하고, 모든 차량 타입이 해당 이벤트로부터 상속받도록 만듭니다.
  3. "Car" 부모 클래스를 생성하고, 서로 다른 타입의 Car 자식 클래스를 생성합니다.
  4. 자동차의 기능을 가져오는 "InheritCarBehavior"라는 이름의 메서드를 생성합니다.

 

- 정답

더보기

답: 3

상속은 여러분이 부모(기본) 클래스로부터 모든 기능들을 상속받는 자식(파생) 클래스를 생성할 수 있도록 해줍니다.

 


 

문제 5

부모 클래스(클래스 A)는 다음과 같은 코드를 포함합니다:

public virtual void Greet () 
{
   Debug.Log("Hello");
}

자식 클래스(클래스 B)는 클래스 A에서 파생되었으며, 다음과 같은 코드를 포함합니다:

public override void Greet ()
{
   Debug.Log("How are you?");
}

만약 클래스 B만 인스턴스화 되었고, Greet( ) 메서드를 호출했다면, 콘솔 창에 어떤 결과가 출력될까요?

  1. Hello
  2. How are you?
  3. Hello
    How are you?
  4. Hello
    Hello
    How are you?

 

- 정답

더보기

답: 2

override 메서드가 자식 클래스로부터 호출되면, 부모 메서드를 완전히 재정의(override)합니다. 만약 여러분이 부모 클래스로부터 동작을 상속받도록 만들고 싶으시다면, 다음과 같이 코드를 추가하여 해당 메서드를 호출해야 합니다: base.Greet();

 


 

문제 6

아래의 보기 중에서 C#의 "캡슐화" 원칙을 따르는 방법은 무엇인가요?

  1. getter와 setter를 사용한다.
  2. public 변수는 필요할 때만 사용한다.
  3. 가능한 사용하지 않는 오브젝트들은 씬에서 비활성화시켜둔다.
  4. 추상(abstract) 클래스들하고만 통신하는 이벤트를 사용한다.

 

  1. 1번과 2번
  2. 1번과 3번
  3. 1번과 4번
  4. 2번과 3번
  5. 2번과 4번
  6. 3번과 4번

 

- 정답

더보기

답: 1

캡슐화의 핵심 주제는 코드의 안전성입니다. - 즉, 코드가 오직 의도한 대로만 사용되고, 여러분이 조작 중인 값과 데이터가 손상되지 않도록 보장하는 프로세스입니다. 캡슐화된 코드는 다른 프로그래머들이 손쉽게 변수의 값을 변경하거나 오브젝트의 속성을 변경할 수 없도록 만들어줍니다. Getter와 Setter는 이를 지원하며, public 변수의 수를 제한하는 방법 또한 그렇습니다.

 


 

문제 7

아래의 public 변수를 프로퍼티(Property)를 사용해 보안이 향상되고 다른 클래스에서도 계속 접근할 수 있도록 만들려면 어떻게 코드를 수정해야 하나요?

public int score;
  1. public Property score;
  2. private int scre {protected};
  3. public int Score { get; set; }
  4. public static property score;

 

- 정답

더보기

답: 3

프로퍼티는 get과 set을 통해 private 필드에 접근할 수 있도록 만들어줍니다.

 


 

문제 8

아래의 코드를 재사용에 유용하도록 만들려면 어떻게 해야 하나요?

void DisplayInfo(string name1, string name2, string address1, string address2, string phone1, string phone2)
{
     print(name1);
     print(name2);
     
     print(address1);
     print(address2);
     
     print(phone1);
     print(phone1);

}
  1. DisplayInfo가 모든 문자열들로 구성된 배열을 반환하도록 만듭니다.
  2. 변수의 이름을 n1, n2, a1, a2, p1, p2로 줄입니다.
  3. print 메서드를 호출할 때 변수 대신 리터럴 문자열을 사용합니다.
  4. DisplayName, DisplayAddresses, DisplayPhoneNumbers라는 새로운 메서드를 생성하고, DisplayInfo( ) 메서드에서 각각의 메서드들을 호출합니다.

 

- 정답

더보기

답: 4

일반적으로 길거나 복잡한 메서드를 개별적인 메서드들로 추출한 뒤, 해당 메서드들을 메서드 안에서 호출하는 것이 코드를 단순하게 유지하는 좋은 방법입니다.

 


 

문제 9

아래의 예시 코드 로직은 이해하기가 매우 어렵습니다:

public float GetValue()
{
     float result;      
     
     if (bool1)
     {
          result = 1;
      }
      else
      {
         if (bool2)
         {
            result = 2;
         }
         else
         {
            result = 0;
         }
     }
     return result;
 }

참 또는 거짓: 아래의 코드는 동일한 결과를 출력하는 더 단순한 코드입니다.

public float GetValue() {
     if (bool1)
     {
         return 1;
     }
     if (bool2)
     {
         return 2;
     }
     return 0; 
}
  1. 거짓

 

- 정답

더보기

답: 1

코드 로직은 위에서 아래로 읽어 내려갈 때 항상 쉽게 평가할 수 있어야 합니다. 2번째 예시는 불필요한 else 문 대부분을 삭제했고, 동일한 결과를 보여줍니다.

 


 

문제 10

아래의 보기 중 변수에 대한 설명으로 옳은 것은 무엇인가요?

  1. 부모 클래스 안에 있는 private 변수들은 오직 자식 클래스를 통해서만 접근이 가능합니다.
  2. 지역 변수는 한 클래스 안에 있는 모든 메서드에서 접근할 수 있습니다.
  3. 프로퍼티(Property)는 getter와 setter를 통해 private 변수에 공개적인 접근을 제공합니다.
  4. 자식 클래스 안에 있는 public 변수는 부모 클래스를 통해 접근할 수 없습니다.

 

- 정답

더보기

답: 3

프로퍼티는 변수처럼 동작하며 private 멤버 변수를 캡슐화합니다. 이 캡슐화는 변수에 접근하거나 설정하는 시기와 방법을 더 잘 제어할 수 있도록 만들어줍니다. 물론 public 변수를 그냥 만들 수도 있겠지만, 프로퍼티를 사용하는 것이 모범 사례로 간주됩니다.

 


 

문제 11

프로파일러(Profiler)를 사용하여 CPU 사용률 관련 이슈를 진단할 때, 여러분의 애플리케이션에 대해 작성한 커스텀 스크립트에 대한 최적화 이슈는 어디에서 찾을 수 있나요?

  1. EditorLoop
  2. ScriptLoop
  3. RunLoop
  4. PlayerLoop

 

- 정답

더보기

답: 4

PlayerLoop는 여러분의 유니티 애플리케이션에 대한 모든 코드의 컨테이너입니다.

 


 

문제 12

아래의 시나리오 중에서 성능 이슈를 일으킬 가능성이 가장 높은 것은 무엇인가요?

  1. 수많은 리지드바디(RigidBody), 각각 충돌하는 관절들이 있는 오브젝트.
  2. 복잡한 메쉬(mesh)에 메쉬 콜라이더(Mesh Collider)를 사용하는 것 대신 중첩된 박스와 캡슐 콜라이더로 구성된 복합 콜라이더.
  3. 씬에서 서로 극도로 멀리 떨어져 있는 리지드바디들(RigidBodies).
  4. 메쉬 콜라이더(Mesh Collider)를 기본 상태로 두는 것 대신 볼록하게 만듦.

 

- 정답

더보기

답: 1

간단한 물리 결합은 매우 빠를 수 있지만, 기본적인 수학 연산은 매우 복잡합니다. 조인트(joint)는 리지드바디의 위치, 속도, 가속도, 회전 등에 대한 방정식 시스템을 설정합니다. 만약 여러분이 서로 다른 다양한 리지드바디들로 무언가를 설정할 경우, (모든 리지드바디들이 충돌하고, 관절의 요구사항을 모두 만족하며, 충돌을 통과하지 않아야 함) 이는 매우 빠르게 극도로 비싼 비용을 소모할 수 있습니다.

 


 


수고하셨습니다!


Comments