티스토리 뷰

JAVA/다형성(Polymorphism)

자바(JAVA) 다형성(Polymorphism) 추상메소드

justgodoit 2024. 7. 11. 00:41

목차

    추상메소드

    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으로 되었습니다.");

    }

    }