Information Security Study
240109 다형성의 개요와 다형성이 없는 예제 실습 본문
클래스의 다형성
: 부모타입의 인스턴스로도 자식 타입을 대입받거나 호출하는 것이 가능한 것을 의미한다.
자료형이 다른 변수와 자료는 대입이 불가능(Java)하다.
정수 자료를 문자형에 대입할 수 없음
정수 자료형과 문자 자료형은 메모리 구조가 다르기에 대입 불가능하다.
부모 자료형과 자식 자료형도 같은 자료형이 아니기 때문에 원칙적으로는 대입이 불가능하다.
그러나 상속을 통한 인스턴스 생성시 부모 인스턴스 영역 과 자식 인스턴스 영역 으로 구분되어
힙에 인스턴스가 생성되는 특성 때문에 일부 영역은 통제 가능한 상태가 된다.
부모클래스인 사람과 자식클래스인 학생을 정의한 모습
부모클래스인 사람과 자식클래스인 학생을 정의했다면
부모타입인 사람 타입의 변수에 학생 인스턴스를 대입하는것이 가능하다.
대신 이 변수를 이용해 호출할 수 있는 범위는 사람 인스턴스까지이다.
상위개념 클래스를 하나 정의하는것으로 하위 클래스를 모두 대입받아 처리하므로 프로그램의 확장성이 증대되는 효과를 얻을 수 있다.
프로그램의 확장성이 증대될 수 있는 이유
- 자식타입으로 생성한 객체에도 부모타입이 섞여있기 때문이다.
- 다형성으로 호출하는 경우, 함수는 부모쪽에 존재하는 함수를 오버라이딩한 경우만 자식측의 함수로 호출이 가능하므로 대부분의 경우 함수를 무조건적으로 오버라이딩해서 정의해야만 하는 인터페이스를 이용해 다형성을 구현하는 경우가 많다.
다형성(Polymorphism)
- 다형성이란 "객체가 여러 형태를 가진다"라는 의미로 해석되며, 하나의 객체가 여러가지 유형으로 사용되는 것을 의미한다.
- 다형성은 상속을 전제조건으로 한다.
- 다형성을 위해 자바는 자식클래스가 부모클래스의 타입을 가질 수 있도록 허용한다. 즉, 부모 타입에 모든 자식객체가 대입될 수 있다.
다형성이 적용되지 않은 예제
-> 같은 로직이어도 몬스터가 추가되면 메서드를 추가해야 한다.
-> 토끼 사냥 메서드와 쥐 사냥 메서드의 로직은 동일하지만 메서드를 추가로 작성해야 한다는 단점이 있다.
// 토끼 몬스터 클래스
package noinheri;
public class Rabbit {
// 토끼 몬스터를 만든다.
// 토끼는 hp, atk, def를 갖는다.
private int hp;
private int atk;
private int def;
// 생성자에서 void 파라미터로 각각 3, 0, 0으로 초기화
public Rabbit() {
this.hp = 3;
this.atk = 0;
this.def = 0;
}
// setter / getter 자동생성
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
// 쥐 몬스터 클래스
package noinheri;
public class Rat {
// 쥐 몬스터를 만든다.
// 쥐는 hp, atk, def를 갖는다.
private int hp;
private int atk;
private int def;
// 생성자에서 void 파라미터로 각각 3, 0, 0으로 초기화
public Rat() {
this.hp = 5;
this.atk = 1;
this.def = 0;
}
// setter / getter 자동생성
public int getHp() {
return hp;
}
public void setHp(int hp) {
this.hp = hp;
}
public int getAtk() {
return atk;
}
public void setAtk(int atk) {
this.atk = atk;
}
public int getDef() {
return def;
}
public void setDef(int def) {
this.def = def;
}
}
// 전사 클래스
package noinheri;
public class Warrior {
// 정보은닉 적용
private String id;
private int hp;
private int atk;
private int def;
private int exp;
// 생성자 정의
// id만 입력 받는다.
// hp 20, atk 3, def 1, exp 0
public Warrior(String id) {
this.id = id;
this.hp = 20;
this.atk = 3;
this.def = 1;
this.exp = 0;
}
// 캐릭터 상태가 조회 가능한 showStatus()
// 이 메서드는 멤버변수 정보를 콘솔에 출력한다.
public void showStatus() {
System.out.println("아이디: " + this.id);
System.out.println("체력: " + this.hp);
System.out.println("공격력: " + this.atk);
System.out.println("방어력: " + this.def);
System.out.println("획득 경험치: " + this.exp);
System.out.println("-------------------------------------");
}
// 토끼 사냥 메서드
public void huntRabbit(Rabbit rabbit) {
if(rabbit.getHp() <= 0) {
System.out.println("이미 죽은 토끼입니다.");
return; // 죽은 토끼에 대해서는 추가 로직이 필요 없다.
}
// 1. 내가 공격한 토끼의 체력을 3 깎는다.
rabbit.setHp(rabbit.getHp() - this.atk);
// 2. 방금 공격으로 죽었다면 경험치 5 증가
if(rabbit.getHp() <= 0) {
System.out.println("토끼를 죽였습니다.");
this.exp += 5;
} else {
System.out.println("토끼를 공격했습니다.");
}
}
// huntRat 메서드 구현
// Rat은 공격을 받고 죽지 않으면 1회 반격한다.
// 경험치는 80이다.
// 토끼 사냥 메서드와 로직은 동일하지만 메서드를 추가로 작성해야 한다는 단점이 있다.
public void huntRat(Rat rat) {
if(rat.getHp() <= 0) {
System.out.println("이미 죽은 쥐입니다.");
return;
}
rat.setHp(rat.getHp() - this.atk);
this.hp -= rat.getAtk();
if(rat.getHp() <= 0) {
System.out.println("쥐를 죽였습니다.");
this.exp += 80;
} else {
System.out.println("쥐를 공격했습니다.");
}
}
}
// 메인 함수 클래스(토끼 공격)
package noinheri;
public class MainClass1 {
public static void main(String[] args) {
// 전사 하나 생성
Warrior w1 = new Warrior("미피");
// 생성 직후 정보 조회
w1.showStatus();
// 토끼 생성
Rabbit r1 = new Rabbit();
// 토끼와 교전
w1.huntRabbit(r1);
// 죽은 토끼 한 번 더 공격
w1.huntRabbit(r1);
// 사냥 후 정보 조회
w1.showStatus();
}
}
토끼 공격 메인 함수 실행 결과
// 메인 함수 클래스(쥐 공격)
package noinheri;
public class MainClass2 {
public static void main(String[] args) {
// 전사 생성
Warrior w1 = new Warrior("왕왕이");
// 쥐 생성
Rat rat1 = new Rat();
// 쥐와 교전(3번)
for(int i = 0; i < 3; i++) {
w1.huntRat(rat1);
}
// 상태 조회
w1.showStatus();
}
}
쥐 공격 메인 메서드 실행 결과
'네트워크 캠퍼스 > JAVA' 카테고리의 다른 글
240111 매개 변수의 다형성, 강제 타입 변환 (0) | 2024.01.12 |
---|---|
240110 다형성 예제 실습, 이종모음 (0) | 2024.01.12 |
240108 this(), super(), 접근 제한자, 캡슐화 (0) | 2024.01.11 |
240105 기본타입과 참조타입, 접근제한자와 상속, 오버라이딩과 오버로딩, this (2) | 2024.01.11 |
240104 클래스 예제, 패키지 예제 (0) | 2024.01.11 |