티스토리 뷰
목차
추상메소드
1. 미완성 된 메소드
2. 몸통부가 구현되어있지 않은 메소드 {}
3. 추상메소드가 존재하는 클래스는 추상클래스...
예약어
abstract
Sports.java
package com.br.chap02_abstract.model.vo;
public abstract class Sports {
private int people;
public Sports() {}
public Sports(int people) {
}
public int getPeople() {
return people;
}
public void ssetPeople(int people) {
this.people = people;
}
@Override
public String toString() {
return "Sports [people=" + people + "]";
}
public abstract void rule();
}
예약어
abstract
추가
FootBall.java 의
public class FootBall extends Sports {
}
FootBall 구문에 빨간줄이생긴다.
package com.br.chap02_abstract.model.vo;
public class FootBall extends Sports {
}
아래 구문을 추가해준다.
@Override
public void rule() {
System.out.println("공을 발로만 차야한다.");
}
package com.br.chap02_abstract.model.vo;
public class FootBall extends Sports {
@Override
public void rule() {
System.out.println("공을 발로만 차야한다.");
}
}
빨간줄 구문이 사라진다.
추상메소드 작성 시 자식클래스에서 클래스명에 빨간밑줄이 생기므로 자식클래스에서 강제로 Override 해주어야 빨간줄이 사라진다.
해당 내용으로 진행 시
Sport s = new Sports();를 import 해도 미완성된 객체라고 하여 import가 되지 않는다.
public class AbstractMain {
public static void main(String[] args) {
Sport sp = new Sports();
}
}
하지만 변수선언하여 레퍼런스로는 사용이 가능하다.
다형성 개념을 이용하여 활용하기
부모클래스(Sports )에 자식클래스(FootBall, BasketBall) 지정
Sports sp1 = new FootBall();
Sports sp2 = new BasketBall();
다형성 적용
Sports arr[] = new Sports[2];
arr[0] = new FootBall();
arr[1] = new BasketBall();
Override 메소드 실행
for(int i=0; i<arr.length; i++) {
arr[i].rule();
}
컴파일 시점의 Sports 메소드를 가르키지만
실행 시 Override 찾아서 실행시킨다.(동적바인딩)
public class AbstractMain {
public static void main(String[] args) {
// Sports sp = new Sports();
Sports sp1 = new FootBall();
Sports sp2 = new BasketBall();
Sports arr[] = new Sports[2];
arr[0] = new FootBall();
arr[1] = new BasketBall();
}
for(int i=0; i<arr.length; i++) {
arr[i].rule();
}
}
추상클래스........란?
1. 미완성된 클래스이다.
2. 객체 생성을 할 수 없다. 단, 레퍼런스로는 사용이 가능하다.
> 다형성 개념을 적용시켜 자식 객체를 불러오는 것은 가능하다.
3. 일반필드 + 일반메소드 + 추상메소드 >> 추상클래스라고 한다.
추상클래스로 작성하지 않아도 임의대로 추상클래스로 둘 수 있다.
추상메소드가 없어도 추상클래스로 선언이 가능하다.?????????
그런 Case ????????
Case 1.
해당 클래스를 통해 객체 생성이 불가능하게끔 하고자 할때 >>이때가 왜 필요한 것..?
Case 2.
추로 추상메소드를 포함한 추상클래스를 선언하는 케이스, 동일한 이름 동일한 메소드로 작성하고 싶을 때
추상메소드로 두게 되면 강제로 오버라이딩할 수 밖에 없기 때문에 무조건 룰이라는 이름의 메소드만 만들 수 있다.
강제성을 부여하고자 할때 사용한다.
자식클래스들의 실행시킬 내용은 다르지만 동일한 형태의 메소드로 구현됐으면 할 때 부모클래스에 추상메소드를 포함시켜두면 강제로 오버라이딩이 되어서 강제로 해당 메소드로 오버라이딩이 된다.
그 안에서 내용만 구현해주면 된다.
즉, 메소드의 통일성을 확보하기 위한 목적이 있다.
또다른 말로는 표준화된 틀을 제공할 목적으로 사용한다.
강제성을 부여할 목적으로 사용된다.
게임으로 추상메소드 구현하기 !!
GameCharacter / Wizard / Archor / Warrior / Assassin 클래스 작성 !
GameCharacter > 기본 구성 그 외 클래스는 별도 구성
GameCharacter 클래스에 추상 클래스 두개 작성
public abstract void attack();
public abstract void defence();
super. 생략 가능, 식별하기 위해서 추가했던 것..
Wizard.java
공격 관련 추상 메소드 작성
@Override
public void attack() {
System.out.println("마법을 쓰면서 공격한다.");
mp -= 10; // 마력 10 감소
/*super.*/setExp(/*super.*/getExp() + 20); // 경험치 20 증가
}
방어 관련 추상 메소드 작성
@Override
public void defence() {
System.out.println("방어막을 쳐서 방어한다.");
mp += 5; // 마력 5 증가
/*super*/setHp(getHp() - 5); // 체력 5 감소
}
Archor.java
잔여 활이 남았을 경우 공격 메소드 작성
@Override
public void attack() {
System.out.println(distance + "m 거리까지의 적을 화살로 쏴서 공격한다.");
//count--;
System.out.println("잔여 활수 :" + --count);
}
잔여 활이 남지 않았을 경우 if문과 else문 추가 메소드 작성
@Override
public void attack() {
if(count > 0){
System.out.println(distance + "m 거리까지의 적을 화살로 쏴서 공격한다.");
System.out.println("잔여 활수 :" + --count);
setExp(getExp() + 15); // 경험치 15 증가
}else {
System.out.println("잔여 활이 없어 공격할 수 없습니다.");
}
}
공격을 막을 수 없을 경우 메소드 작성
@Override
public void defence() {
System.out.println("막을 수 없습니다...");
setHp(getHp() - 20); // 체력 20 감소
}
Warrior.java
공격 메소드 작성
@Override
public void attack() {
System.out.println(weapon + "과 같은 무기를 휘두르면서 공격한다.");
setExp(getExp() + 10); // 경험치 10 증가
}
방어 메소드 작성
@Override
public void defence() {
System.out.println("방패를 이용해서 방어한다.");
setHp(getHp() - 2); // 체력 2 감소
}
Assassin.java
공격메소드 작성
@Override
public void attack() {
System.out.println("주먹으로 암살에 성공한다.");
setExp(getExp() + 5); // 경험치 5 증가
}
방어메소드 작성
@Override
public void defence() {
System.out.println("은둔해서 피한다.");
}
패키지 내에 실행용 클래스 생성
cohttp://m.br.chap02_abstract_practice.run.GameMain
package com.br.chap02_abstract_practice.run;
public class GameMain {
GameCharacter.java
경험치가 100을 넘었을 경우 레벨이 1 증가하게 만드는 출력문
public void setExp(int exp) {
this.exp = exp;
if(this.exp >= 100) {
this.level++;
this.exp -= 100;
System.out.println("레벨업 되셨습니다. 축하합니다.");
}
}
GameCharacter.java
체력이 깎여서 레벨이 감소하게 만드는 출력문
public void setHp(int hp) {
this.hp = hp;
if(this.hp <= 0) {
this.level--;
this.hp = 100;
System.out.println("모든 체력이 다 소모되어 레벨이 감소하였습니다. 체력은 다시 100으로 되었습니다.");
}
}
'JAVA > 다형성(Polymorphism)' 카테고리의 다른 글
자바(JAVA) 다형성(Polymorphism) 상속 업캐스팅(UpCasting) 다운캐스팅(DownCasting) (0) | 2024.07.11 |
---|---|
자바(JAVA) 다형성(Polymorphism) 인터페이스(Interface) (0) | 2024.07.11 |
- Total
- Today
- Yesterday
- 코딩활용능력 자격증 시험문제
- Oracle
- 코딩활용능력 기출문제
- 코딩활용능력 자격증 기출문제
- oracle 권한 부여 명령어
- 정보처리 기능사 필기 준비
- ocalce 사용자 계정 삭제하는 방법
- 정보처리기능사 자격증 준비
- oracle 자원 사용 권한 주는 명령어
- 정보처리기능가 필기 시험문제
- 정보처리산업기사 자격증
- oracle 사용자 계정 만들기
- 개발자 자격증 준비
- oracle 권한주는 명령어
- 코딩활용능력자격증
- 파이썬 else 문
- 정보처리기능사 필기 준비
- 코딩활용능력 자격증 조건문
- 코딩활용능력자격증 문제
- oracla 사용자 계정 만드는 방법
- 정보처리기능사 준비
- 코딩활용능력 시험일정
- oracle 시스템 명령어
- 정보처리기능사 자격증 문제
- 코딩활용능력자격증 문제풀이
- 파이썬 elif문
- 코딩활용능력 자격증 파이썬
- 정보처리기능사 시험 문제
- 정보처리기능사 필기 문제
- 코딩활용능력 자격증
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |