인터페이스는 추상메소드와 상수(final)만 가지는 클래스임, 규격을 정해 놓는 문법
인터페이스는 접근제한자 무조건 public만 가능
구현 방법
public interface Test {
}public class First implements Test{
}
public interface Unit {
//기능들의 이름만 정하기 - 추상메소드 public만 허용
public abstract void move();
public abstract void attack();
}
public interface LevelUpAble {
public abstract void levelUp();
}
public class Marine implements Unit, LevelUpAble{
@Override
public void move() {
System.out.println("걸어서 이동");
}
@Override
public void attack() {
System.out.println("총알 발사");
}
@Override
public void levelUp() {
System.out.println("레벨업");
}
}
public class Tank implements Unit, LevelUpAble{
@Override
public void move() {
System.out.println("바퀴이동");
}
@Override
public void attack() {
System.out.println("자주포 발사");
}
@Override
public void levelUp() {
System.out.println("레벨 업업~");
}
}
public class Race implements Unit{
@Override
public void move() {
System.out.println("날아서 이동");
}
@Override
public void attack() {
System.out.println("미사일 발사");
}
}
import java.util.ArrayList;
public class Main {
public static void main(String[] args) {
//팀장이 인터페이스를 설계하고 추상메서드로 이름을 정하면 팀원들은
//그 이름을 토대로 기능을 구형하여 클래스 설계
//팀장 : Unit 인터페이스 설게
//Unit이라면 가져야할 기본 기능 구현
//팀원1 : Marine 클래스 정의 및 Unit 구현
//팀원2 : Tank 클래스 정의 및 Unit 구현
//팀원3 : Race 클래스 정의 및 Unit 구현
//Marine, Tank, Race객체는 무조건 attack(), move() 기능 구현
//팀장은 만들어진 클래스를 이용하여 객체 생성 및 게임 알고리즘 구현
//부모 참조변수로 자식객체를 참조할 수 있으니
//Unit 참조변수 타입으로 모든 객체를 제어 => 배열로 묶을 수 있음
//Unit[] units = new Unit[200];
//단, 신제 게임에서는 캐릭터 생성과 제어가 빈번하게 일어남
//배열을 한번 만들면 개수를 변경할 수 없음. 요소를 제거할 수고 없고
//그래서 실제 이렇게 대량의 객체를 다룰때는 유동적 배열을 더 선호함
//마치, 기차처럼 객체를 끌고다니는 크래스 : ArrayList
ArrayList<Unit> units = new ArrayList<>();
//요소의 개수 확인
int num = units.size();
System.out.println(num);
//유닛종류 객체 생성하여 추가
units.add(new Marine());
units.add(new Tank());
units.add(new Race());
units.add(new Tank());
units.add(new Marine());
//요소의 개수 확인
num = units.size();
System.out.println("유닛 개수 : " + num);
//유닛 기능 사용해보기
for (int i = 0; i < units.size(); i++) {
Unit un = units.get(i);
//실제 객체들의 기능이 발동
un.move();
un.attack();
System.out.println();
}
//확장 for - 차례대로 출력하면 젤 편함
for( Unit t : units) {
t.move();
t.attack();
//레벨업이 가능한 캐릭터 레벨업하지
if(t instanceof Marine) {
Marine m = (Marine)t; //다운캐스팅
m.levelUp();
} else if(t instanceof Tank) {
((Tank)t).levelUp(); //한줄로 - 연산자 우선순위 조심
}
System.out.println();
}
//if - else 문 한줄로 바꾸기
for( Unit t : units) {
t.move();
t.attack();
//레벨업이 가능한 캐릭터 레벨업하지
if(t instanceof LevelUpAble) {
((LevelUpAble)t).levelUp();
}
System.out.println();
}
}
}
자바 8버전 이후 default/static 메서드 선언 추가, 자바9에서 private 선언 추가
인터페이스엔 기능을 쓸 수 없는데 그럼 매번 같은 동작도 implements 받으면 전부 구현해야되는 것이 불편해서 등장한 것 인터페이스의 확장을 통해 소스구현이 가능해졌다
statict선언 인터페이스 사용법
인터페이스.메서드명
public default , default는 접근제한제가 아니고 그냥 메소드 이름이다 헷갈리게 접근제한자 이름이랑 같이 만들어서 왜 접근제한자 두개가 같이 오지하고 고민했는데 그냥 메소드 이름일 뿐 접근제한자가 아님 인터페이스에는 public만 접근제한자가 될수 있다
public interface Test {
public default void setLogin(boolean login) {
if(login) {
log();
System.out.println("로그인");
} else System.out.println("로그아웃");
}
public static void getConnet() {
System.out.println("연결합니다");
}
private void log() {
System.out.println("로그인 시도");
}
}
public class Hello implements Test{
}
public class Main {
public static void main(String[] args) {
Hello h = new Hello();
h.setLogin(true);
Test.getConnet();
}
}
static으로 선언한 메소드는 인터페이스명으로 바로 접근 가능하지만 default 인터페이스는 여전히 매개체가 되여줄 class가 필요함 Test를 implements 받은 class Hello에 아무것도 안쓰여 있는 것 같지만 인터페이스에 구현된 메소드들이 들어와 있다
main에서 사용방법은 보통 인터페이스를 쓰는 것과 동일하다 implements받은 class의 객체를 만들면 인터페이스의 메소드에 접근 가능하다
내 생각
인터페이스의 확장으로 abstrat의 필요성이 더 퇴색되어 진것 같다 앞으론 defaut메서드나 static메소드를 사용하면 소스 구현도 가능해진 인터페이스가 추상클래스를 대체 할 거 같다
퍼가요~♡