1. 상속

CodeGym 게임 엔진으로 작업하려면 상속을 사용해야 합니다 . 하지만 그것이 무엇인지 모른다면? 한편으로는 이 주제를 이해하고 연구해야 합니다. 반면에 엔진은 매우 단순하도록 특별히 설계되었으므로 상속에 대한 피상적인 지식만 있으면 문제를 해결할 수 있습니다.

그렇다면 상속이란 무엇입니까? 간단히 말해서 상속은 두 클래스 간의 관계입니다. 그 중 하나는 부모 클래스 역할을 하고 다른 하나는 자식(자식) 클래스가 됩니다. 게다가 부모 클래스는 자신에게 자손 클래스가 있다는 사실조차 모를 수 있습니다. 즉, 부모는 자손 클래스를 갖는 것으로부터 많은 이점을 얻지 못합니다.

그러나 상속은 자식 클래스에 많은 이점을 제공합니다. 그 중 가장 중요한 것은 마치 부모 클래스 의 코드를 자식 클래스에 직접 복사한 것처럼 부모 클래스의 모든 변수와 메서드가 자식 클래스에 나타난다는 것입니다 . 이것은 완전히 정확하지는 않지만 상속에 대한 기본적인 이해에는 충분합니다.

다음은 상속을 더 잘 이해하는 데 도움이 되는 몇 가지 예입니다.

예 1 — 가장 간단한 예는 다음과 같습니다.

public class Parent
{
}
클래스 는 키워드 의 도움으로 클래스를 Child상속합니다 .Parentextends
public class Child extends Parent
{
}

예제 2 — 상위 클래스의 변수 사용

public class Parent
{
  public int age;
  public String name;
}
클래스 는 클래스 자체 에서 선언된 것처럼 클래스 의 및 필드를 Child사용할 수 있습니다 .agenameParentChild
public class Child extends Parent
{
  public void printInfo()
  {
    System.out.println(name + " " + age);
  }
}

예제 3 — 부모 클래스의 메서드 사용

public class Parent
{
   public int age;
   public String name;
   public getName() {
      return name;
   }
}
클래스 Child는 부모 클래스의 변수와 메서드를 클래스에서 선언한 것처럼 사용할 수 있습니다 Child. 이 예에서는 getName()방법을 사용합니다.
public class Child extends Parent
{
   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}

몇 가지 세부 사항을 생략하면 Java 컴파일러의 관점에서 간단히 부모 클래스의 코드를 자식 클래스의 코드로 복사했다고 말할 수 있습니다.

public class Child extends Parent
{
   public int age;        // An inherited variable
   public String name;    // An inherited variable
   public getName() {     // An inherited method
      return name;
   }

   public void printInfo()
   {
      System.out.println(getName() + " " + age);
   }
}
Child다음은 컴파일러의 관점에서 클래스가 나타나는 방식입니다.


2. 메서드 재정의

때로는 우리 Child클래스가 매우 유용한 Parent클래스를 상속하도록 하여 자식이 부모의 모든 변수와 메서드를 상속하게 하는 상황이 있습니다. 그러나 이러한 방법 중 일부는 우리가 원하는 대로 작동하지 않거나 전혀 작동하지 않을 수 있습니다.

이 경우 어떻게 합니까? 구현이 마음에 들지 않는 메서드를 재정의 할 수 있습니다 . 이것은 간단한 일입니다. Child클래스에서 클래스의 메서드와 동일한 시그니처를 사용하여 메서드를 선언 Parent한 다음 그 안에 우리 자신의 코드를 작성하기만 하면 됩니다.

예제 1 — 메서드 재정의

public class Parent
{
   public String name;
   public void setName(String nameNew) {
      name = nameNew;
   }

   public getName() {
      return name;
   }
}
printInfo()메서드는 다음 문구를 표시합니다.
Luke, No!!!
public class Child extends Parent
{
   public void setName(String nameNew) {
      name = nameNew + ", No!!!";
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

상황을 다소 단순화하면 상속으로 인해 부모 클래스의 코드가 자식 클래스로 복사됩니다. 그러나 자손 클래스가 이미 조상 클래스에 존재하는 메서드인 경우 해당 메서드는 조상 클래스에서 복사되지 않습니다. 여기서는 자식 클래스의 메서드가 부모 클래스의 메서드를 재정의한다고 말합니다. 아래 예를 보십시오. 어쩌면 상황을 좀 더 명확하게 만드는 데 도움이 될 것입니다.

다음은 컴파일러의 관점에서 Child 클래스가 나타나는 방식입니다.
public class Child extends Parent
{
   public String name;    // An inherited variable

   public void setName(String nameNew)  // The overridden method replaces the inherited one
   {
      name = nameNew + ", No!!!";
   }

   public getName()    // An inherited method
   {
      return name;
   }

   public void printInfo()
   {
      setName("Luke");
      System.out.println(getName());
   }
}

예제 2 - 약간의 상속 마법(및 메서드 재정의)

public class Parent
{
   public getName() {
      return "Luke";
   }

   public void printInfo()
   {
      System.out.println( getName() );
   }
}
public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }
}

printInfo()메서드가 유형에 대해 호출 되면 클래스 의 메서드를 Parent차례로 호출합니다 .getName()Parent

printInfo()메소드가 객체에서 호출 되면 클래스 의 메소드를 Child차례로 호출합니다 .getName()Child

즉, printInfo()메서드는 클래스 내에서만 선언되지만 객체 에서 메서드를 호출 하면 클래스 의 메서드를 Parent호출한다 .getName()ChildprintInfo()Child

예:

Parent parent = new Parent();
parent.printnInfo();
이 코드는 화면에 다음 텍스트를 표시합니다.
Luke
Child child = new Child();
child.printnInfo();
이 코드는 화면에 다음 텍스트를 표시합니다.
Luke, I am your father

그리고 컴파일러의 관점(매우 단순화된 버전)에서 클래스의 코드는 Child다음과 같기 때문입니다.

public class Child extends Parent
{
   public getName() {
      return "Luke, I am your father";
   }

   public void printInfo()
   {
      System.out.println(getName());
   }
}
Child다음은 컴파일러의 관점에서 클래스가 나타나는 방식입니다.


3. 목록

다음은 목록( )에 대한 간략한 알림입니다 List. 목록은 배열과 공통점이 많습니다.

  • 특정 유형의 많은 데이터를 저장할 수 있습니다.
  • 색인으로 요소를 얻을 수 있습니다.
  • 요소의 인덱스는 에서 시작합니다 0.

목록의 장점:

배열과 달리 목록은 크기를 동적으로 변경할 수 있습니다. 생성 직후 목록의 크기는 0. 항목이 목록에 추가되면 크기가 커집니다. 목록 작성 예:

ArrayList<String> myList = new ArrayList<String>();
새로 만들기ArrayList

꺽쇠 괄호 안에 표시된 값은 목록이 저장할 수 있는 데이터 유형입니다.

다음은 목록 작업을 위한 몇 가지 방법입니다.

암호 간단한 설명
ArrayList<String> list = new ArrayList<String>();
새 문자열 목록 만들기
list.add("name");
목록 끝에 요소 추가
list.add(0, "name");
목록의 시작 부분에 요소 추가
String name = list.get(5);
인덱스로 요소 가져오기
list.set(5, "new name");
색인으로 요소 변경
int count = list.size();
목록의 요소 수를 가져옵니다.
list.remove(4);
목록에서 요소 제거

목록에 대한 자세한 내용은 다음 문서를 참조하세요.



4. 난수

CodeGym 게임 엔진에는 난수를 생성하는 데 사용할 수 있는 두 가지 방법이 있습니다. 이러한 방법은 다음과 같습니다.

int getRandomNumber(int max)
int getRandomNumber(int min, int max)

첫 번째 메서드 — —는 , , , ... getRandomNumber(int max)범위의 난수를 반환합니다 . 내부적으로는 패키지 의 클래스를 사용 하지만 난수를 사용하는 방법은 변경되지 않습니다.012max-1Randomjava.util

getRandomNumber(int)정수를 인수로 받아들입니다. 이 숫자는 난수 생성기가 반환할 수 있는 숫자의 상한입니다. 하한은 0입니다. 주의! 난수 생성기는 절대 상한 값을 반환하지 않습니다. 예를 들어 를 호출하면 getRandomNumber(3)임의로 0, 1 또는 2를 반환합니다. 보시다시피 3을 반환하지 않습니다. 이러한 방식으로 난수 생성기를 사용하는 것은 다소 간단하지만 많은 경우에 적합합니다.

두 번째 방법 — getRandomNumber(int min, int max)— 범위에서 임의의 정수를 반환합니다 [min, max-1]. 보다 작은 숫자를 반환하지 않으며 min보다 큰 숫자를 반환하지 않습니다 max-1.

이러한 방법을 실제로 어떻게 사용할 수 있습니까?

1. 주사위

주사위 굴림을 시뮬레이트하고 범위 내에서 임의의 숫자를 얻고 싶다고 가정합니다 1-6. 어떻게 하시겠습니까? 이는 다음과 같은 코드로 수행할 수 있습니다.

int dice = getRandomNumber(1, 7);

이 메서드는 범위의 임의의 정수를 반환합니다 1-6.

2. 표적 연습

목표물에 대한 사격을 시뮬레이트하고 사격의 정확도에 에서 범위까지 다양한 임의 구성 요소가 포함되어 있다고 가정 -10합니다 +10. 이는 다음과 같은 코드로 수행할 수 있습니다.

int dx = getRandomNumber(-10, 11);

-10이 메서드는 범위 에서 임의의 정수를 반환합니다 +10.

게임에서 난수를 사용하는 방법에는 여러 가지가 있습니다. 당신은 당신의 상상력에 의해서만 제한됩니다. 나만의 게임을 작성하고 다듬고 그 과정을 즐기세요.

누구나 게임을 할 수 있지만 게임을 만들 수 있는 것은 프로그래머뿐입니다.