본문 바로가기

JavaCode(review)

Generics Class 기본예시/ Team- player

반응형

abstract class (player)   -   basic class (Team)/Generics class   - main

        |

sub class 3개 (basketball player, soccer player..등)

 

해당player(basketball player)에  맞는 각 team class(basketball player team)만드는 대신

Team class 자체를 Generics class로 정의하여 각 team class 만들어야하는 거 방지.

 

Abstrac class- Player

package com.timbuchalka;

/**
 * Created by dev on 17/10/2015.
 */
public abstract class Player {
    private String name;

    public Player(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

  각 sub class 3개 - player

//baseball player class 1

package com.timbuchalka;

/**
 * Created by dev on 17/10/2015.
 */
public class BaseballPlayer extends Player {
    public BaseballPlayer(String name) {
        super(name);
    }
}

//football player class 2

package com.timbuchalka;

/**
 * Created by dev on 17/10/2015.
 */
public class FootballPlayer extends Player {

    public FootballPlayer(String name) {
        super(name);
    }
}

// soccer player class 3

package com.timbuchalka;

/**
 * Created by dev on 17/10/2015.
 */
public class SoccerPlayer extends Player {

    public SoccerPlayer(String name) {
        super(name);
    }
}

Basic class -Team /  Generics class

package com.timbuchalka;

import java.util.ArrayList;

/**
 * Created by dev on 17/10/2015.
 */
public class Team<T extends Player> {
    private String name;
    int played = 0;
    int won = 0;
    int lost = 0;
    int tied = 0;


    private ArrayList<T> members = new ArrayList<>();

    public Team(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean addPlayer(T player) {
        if (members.contains(player)) {
            System.out.println(player.getName() + " is already on this team");
            return false;
        } else {
            members.add(player);
            System.out.println(player.getName() + " picked for team " + this.name);
            return true;
        }
    }

    public int numPlayers() {
        return this.members.size();
    }

    public void matchResult(Team<T> opponent, int ourScore, int theirScore) {

        String message;

        if(ourScore > theirScore) {
            won++;
            message = " beat ";
        } else if(ourScore == theirScore) {
            tied++;
            message = " drew with ";

        } else {
            lost++;
            message = " lost to ";
        }
        played++;
        if(opponent != null) {
            System.out.println(this.getName() + message + opponent.getName());
            opponent.matchResult(null, theirScore, ourScore);
        }
    }

    public int ranking() {
        return (won * 2) + tied;
    }

}

Main class /   <T> 값 넣기

package com.timbuchalka;

public class Main {

    public static void main(String[] args) {
	    FootballPlayer joe = new FootballPlayer("Joe");
        BaseballPlayer pat = new BaseballPlayer("Pat");
        SoccerPlayer beckham = new SoccerPlayer("Beckham");

        Team<FootballPlayer> adelaideCrows = new Team<>("Adelaide Crows");
        adelaideCrows.addPlayer(joe);
//        adelaideCrows.addPlayer(pat);
//        adelaideCrows.addPlayer(beckham);

        System.out.println(adelaideCrows.numPlayers());

        Team<BaseballPlayer> baseballTeam = new Team<>("Chicago Cubs");
        baseballTeam.addPlayer(pat);

        Team<SoccerPlayer> brokenTeam = new Team<>("this won't work");
        brokenTeam.addPlayer(beckham);

        Team<FootballPlayer> melbourne = new Team<>("Melbourne");
        FootballPlayer banks = new FootballPlayer("Gordon");
        melbourne.addPlayer(banks);

        Team<FootballPlayer> hawthorn= new Team<>("Hawthorn");
        Team<FootballPlayer> fremantle= new Team<>("Fremantle");

        hawthorn.matchResult(fremantle, 1, 0);
        hawthorn.matchResult(adelaideCrows, 3, 8);

        adelaideCrows.matchResult(fremantle, 2, 1);
        adelaideCrows.matchResult(baseballTeam, 1, 1);
    }
}

 

참고) generics class- interface 연결 

 

publi class Team<T extends Player & coach & manager> {

 

}   //Player :First class   // coach : interface  // manager : interface

 

//Team class 에 각 팀의 ranking 비교하는 interface 넣기

 

package com.timbuchalka;

import java.util.ArrayList;

/**
 * Created by dev on 17/10/2015.
 */																	
public class Team<T extends Player> implements Comparable<Team<T>> { //generics에 interface 추가
    private String name;											//<Team<T>>
    int played = 0;
    int won = 0;
    int lost = 0;
    int tied = 0;


    private ArrayList<T> members = new ArrayList<>();

    public Team(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public boolean addPlayer(T player) {
        if (members.contains(player)) {
            System.out.println(player.getName() + " is already on this team");
            return false;
        } else {
            members.add(player);
            System.out.println(player.getName() + " picked for team " + this.name);
            return true;
        }
    }

    public int numPlayers() {
        return this.members.size();
    }

    public void matchResult(Team<T> opponent, int ourScore, int theirScore) {

        String message;

        if(ourScore > theirScore) {
            won++;
            message = " beat ";
        } else if(ourScore == theirScore) {
            tied++;
            message = " drew with ";

        } else {
            lost++;
            message = " lost to ";
        }
        played++;
        if(opponent != null) {
            System.out.println(this.getName() + message + opponent.getName());
            opponent.matchResult(null, theirScore, ourScore);
        }
    }

    public int ranking() {
        return (won * 2) + tied;
    }

    @Override			     //따로 interface class 안만들고 team class에 바로 override 가능
    public int compareTo(Team<T> team) {		//Comparable interface 기능은 자바에 이미 존재.
        if(this.ranking() > team.ranking()) {
            return -1;
        } else if(this.ranking() < team.ranking()) {
            return 1;
        } else {
            return 0;
        }
    }
}

Main

package com.timbuchalka;

import java.util.ArrayList;
import java.util.Collections;

public class Main {

    public static void main(String[] args) {
	    FootballPlayer joe = new FootballPlayer("Joe");
        BaseballPlayer pat = new BaseballPlayer("Pat");
        SoccerPlayer beckham = new SoccerPlayer("Beckham");

        Team<FootballPlayer> adelaideCrows = new Team<>("Adelaide Crows");
        adelaideCrows.addPlayer(joe);
//        adelaideCrows.addPlayer(pat);
//        adelaideCrows.addPlayer(beckham);

        System.out.println(adelaideCrows.numPlayers());

        Team<BaseballPlayer> baseballTeam = new Team<>("Chicago Cubs");
        baseballTeam.addPlayer(pat);

        Team<SoccerPlayer> brokenTeam = new Team<>("this won't work");
        brokenTeam.addPlayer(beckham);

        Team<FootballPlayer> melbourne = new Team<>("Melbourne");
        FootballPlayer banks = new FootballPlayer("Gordon");
        melbourne.addPlayer(banks);

        Team<FootballPlayer> hawthorn= new Team<>("Hawthorn");
        Team<FootballPlayer> fremantle= new Team<>("Fremantle");

        hawthorn.matchResult(fremantle, 1, 0);
        hawthorn.matchResult(adelaideCrows, 3, 8);

        adelaideCrows.matchResult(fremantle, 2, 1);
//        adelaideCrows.matchResult(baseballTeam, 1, 1);

        System.out.println("Rankings");												//각팀 ranking 출력
        System.out.println(adelaideCrows.getName() + ": " + adelaideCrows.ranking());
        System.out.println(melbourne.getName() + ": " + melbourne.ranking());
        System.out.println(fremantle.getName() + ": " + fremantle.ranking());
        System.out.println(hawthorn.getName() + ": " + hawthorn.ranking());

        System.out.println(adelaideCrows.compareTo(melbourne));		//각팀 ranking 비교 interface 출력
        System.out.println(adelaideCrows.compareTo(hawthorn));
        System.out.println(hawthorn.compareTo(adelaideCrows));
        System.out.println(melbourne.compareTo(fremantle));

        //ArrayList<Team> teams;			//참고)비교 interface출력 간단히 collections.sort 이용해서 출력도 가능함.
        //Collections.sort(teams);
    }
}

'JavaCode(review)' 카테고리의 다른 글

CharAndBoolean  (0) 2020.06.23
ByteShortIntLong Max/Min  (0) 2020.06.23
Abstract Class Challenge - interface , linkedList이용  (0) 2020.06.21
InnerClass Challenge - Playlist -Album에 innerClass 이용  (0) 2020.06.19
Interface Challenge  (0) 2020.06.16