본문 바로가기
Java

[JAVA] 클래스 상속을 활용한 게임만들기

by teamnova 2024. 2. 27.

안녕하세요. 이번 게시글에서는 자바에서 중요한 객체 지향 프로그래밍 개념 중 하나인 '클래스 상속'을 활용해 간단한 동물 게임을 만들어보겠습니다. 

코드의 재사용성을 높이고, 유지 보수를 용이하게 하는 상속의 장점을 직접 경험할 수 있습니다. 또한, 추상화와 다형성 같은 개념도 함께 배울 수 있습니다. 

 

먼저 개념 설명하겠습니다.

  • 추상 클래스와 추상 메소드: '동물' 클래스는 추상 클래스로 정의되었으며, 이는 직접 인스턴스를 생성할 수 없음을 의미합니다. 추상 클래스는 상속을 통해 자식 클래스에서 구체화되어야 하는 '추상 메소드'(여기서는 '특수행동')를 가질 수 있습니다.
  • 상속: '사자'와 '토끼' 클래스는 '동물' 클래스를 상속받습니다. 이것은 '사자'와 '토끼'가 '동물'의 모든 속성(이름, 에너지)과 메소드(먹기, 자기, 움직이기)를 물려받는다는 것을 의미합니다.
  • 메소드 오버라이딩: 자식 클래스에서 부모 클래스의 메소드를 새로운 방식으로 구현하는 것을 '오버라이딩'이라고 합니다. 예를 들어, '사자'와 '토끼' 클래스에서 '특수행동' 메소드는 각각의 동물에 맞게 다르게 구현됩니다.
  • 다형성: 다형성은 서로 다른 클래스의 객체가 동일한 인터페이스를 갖고 다른 행동을 할 수 있음을 의미합니다. 여기서 각 동물은 '특수행동'이라는 같은 메소드를 갖고 있지만, 각각 다른 행동을 합니다.

시연 영상입니다.

 

전체 코드입니다.

// '동물'이라는 추상 클래스를 정의합니다. 추상 클래스는 객체를 직접 생성할 수 없으며 상속을 위한 기본 틀 역할을 합니다.

abstract class 동물 {
    String 이름; // 동물의 이름을 저장하는 변수
    int 에너지; // 동물의 에너지를 저장하는 변수
    
    // 동물 클래스의 생성자입니다. 모든 동물은 이름을 가지고 생성됩니다.
    동물(String 이름) {
        this.이름 = 이름;
        this.에너지 = 100; // 기본 에너지는 100으로 설정합니다.
    }
    
    // 추상 메소드 '특수행동'을 선언합니다. 이 메소드는 상속받는 클래스에서 구체적으로 구현됩니다.
    abstract void 특수행동();
    // '먹기' 행동을 정의합니다. 먹을 때마다 에너지가 10 증가합니다.
    void 먹기() {
        에너지 += 10;
        System.out.println(이름 + "이(가) 먹어서 에너지가 증가했습니다!");
    }
    // '자기' 행동을 정의합니다. 잠을 잘 때마다 에너지가 20 증가합니다.
    void 자기() {
        에너지 += 20;
        System.out.println(이름 + "이(가) 잠을 자서 에너지가 회복되었습니다!");
    }
    // '움직이기' 행동을 정의합니다. 움직일 때마다 에너지가 10 감소합니다.
    void 움직이기() {
        에너지 -= 10;
        System.out.println(이름 + "이(가) 움직여서 에너지가 감소했습니다!");
    }
}
// '사자' 클래스는 '동물' 클래스를 상속받습니다.
class 사자 extends 동물 {
    // 사자 클래스의 생성자
    사자(String 이름) {
        super(이름); // 부모 클래스의 생성자를 호출합니다.
    }
    
    // '특수행동' 메소드를 구현합니다. 사자는 사냥을 해서 에너지를 크게 얻습니다.
    @Override
    void 특수행동() {
        System.out.println(이름 + "이(가) 사냥을 해서 많은 에너지를 얻었습니다!");
        에너지 += 30;
    }
}

// '토끼' 클래스는 '동물' 클래스를 상속받습니다.
class 토끼 extends 동물 {
    // 토끼 클래스의 생성자
    토끼(String 이름) {
        super(이름); // 부모 클래스의 생성자를 호출합니다.
    }
    
    // '특수행동' 메소드를 구현합니다. 토끼는 빨리 도망쳐 에너지를 소모합니다.
    @Override
    void 특수행동() {
        System.out.println(이름 + "이(가) 빠르게 도망쳐 에너지를 소모했습니다!");
        에너지 -= 20;
    }
}



// 추가된 동물 클래스
class 기린 extends 동물 {
    기린(String 이름) {
        super(이름);
    }
    
    @Override
    void 특수행동() {
        System.out.println(이름 + "이(가) 높은 나뭇잎을 먹어서 에너지를 얻었습니다!");
        에너지 += 15;
    }
}

class 원숭이 extends 동물 {
    원숭이(String 이름) {
        super(이름);
    }
    
    @Override
    void 특수행동() {
        System.out.println(이름 + "이(가) 나무를 타고 놀아 에너지를 소모했습니다!");
        에너지 -= 10;
    }
}

public class SimpleGame {
    public static void main (String[] args) {
        // 동물 객체를 생성하고 각각의 특수 행동을 시뮬레이션합니다.
        사자 사자1 = new 사자("강한사자");
        토끼 토끼1 = new 토끼("빠른토끼");
        기린 기린1 = new 기린("높은기린");
        원숭이 원숭이1 = new 원숭이("재미있는원숭이");
        
        사자1.먹기();
        토끼1.자기();
        기린1.특수행동();
        원숭이1.특수행동();
        
        사자1.특수행동(); // 사자가 사냥하는 모습을 상상

        
    }
}