인터페이스

소정·2023년 1월 30일
0

Java

목록 보기
16/23

인터페이스(interface)

인터페이스는 추상메소드와 상수(final)만 가지는 클래스임, 규격을 정해 놓는 문법
인터페이스는 접근제한자 무조건 public만 가능

구현 방법
public interface Test {
}

public class First implements Test{
}


사용하는 이유

  1. 클래스들의 규격을 정해두기 위해 사용함
  2. 추상클래스가 있는데 왜 만들었을까?
    => 추상클래스는 다중상속이 불가하나 interface는 가능함



예제

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메소드를 사용하면 소스 구현도 가능해진 인터페이스가 추상클래스를 대체 할 거 같다

profile
보조기억장치

1개의 댓글

comment-user-thumbnail
2023년 2월 6일

퍼가요~♡

답글 달기