728x90
안녕하세요. 이번 게시글에서는 자바에서 중요한 객체 지향 프로그래밍 개념 중 하나인 '클래스 상속'을 활용해 간단한 동물 게임을 만들어보겠습니다.
코드의 재사용성을 높이고, 유지 보수를 용이하게 하는 상속의 장점을 직접 경험할 수 있습니다. 또한, 추상화와 다형성 같은 개념도 함께 배울 수 있습니다.
먼저 개념 설명하겠습니다.
- 추상 클래스와 추상 메소드: '동물' 클래스는 추상 클래스로 정의되었으며, 이는 직접 인스턴스를 생성할 수 없음을 의미합니다. 추상 클래스는 상속을 통해 자식 클래스에서 구체화되어야 하는 '추상 메소드'(여기서는 '특수행동')를 가질 수 있습니다.
- 상속: '사자'와 '토끼' 클래스는 '동물' 클래스를 상속받습니다. 이것은 '사자'와 '토끼'가 '동물'의 모든 속성(이름, 에너지)과 메소드(먹기, 자기, 움직이기)를 물려받는다는 것을 의미합니다.
- 메소드 오버라이딩: 자식 클래스에서 부모 클래스의 메소드를 새로운 방식으로 구현하는 것을 '오버라이딩'이라고 합니다. 예를 들어, '사자'와 '토끼' 클래스에서 '특수행동' 메소드는 각각의 동물에 맞게 다르게 구현됩니다.
- 다형성: 다형성은 서로 다른 클래스의 객체가 동일한 인터페이스를 갖고 다른 행동을 할 수 있음을 의미합니다. 여기서 각 동물은 '특수행동'이라는 같은 메소드를 갖고 있지만, 각각 다른 행동을 합니다.
시연 영상입니다.
전체 코드입니다.
// '동물'이라는 추상 클래스를 정의합니다. 추상 클래스는 객체를 직접 생성할 수 없으며 상속을 위한 기본 틀 역할을 합니다.
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.특수행동(); // 사자가 사냥하는 모습을 상상
}
}
'Java' 카테고리의 다른 글
[JAVA] 다양한 컬렉션 타입들을 사용해 학생 데이터 관리 시스템 만들기 (0) | 2024.03.26 |
---|---|
[Java] Java Swing으로 구현하는 날씨 기반 상태 변화 시뮬레이션 (0) | 2024.03.21 |
[Java] 영화진흥위원회 오픈API 사용한 영화 정보 출력 예제 (0) | 2024.02.18 |
[Java] SMTP를 이용한 이메일 발송 (0) | 2023.12.27 |
[Java] Swing을 활용해 간단한 알람 만들기 (0) | 2023.12.23 |