본문 바로가기
IT/자바

인터페이스 활용 예제 2개

by 독서실총무J 2017. 5. 12.
반응형

안녕하신가?

하루 건너뛰고 두꺼운 낯짝으로 돌아온

독서실 총무이다

오늘은 저번에 배웠던 인터페이스 활용하여

아주 심오있는 예제를 준비하였다


뭐, 물론 내가 준비한건 아니다

나도 가르침 당할때 배운거라

어쩄든 그냥 봐라'


시작하기 앞서서 

잠깐 잡담을 하나 하자


나는 흡연자인데 요즘따라 

너무 많은 담배를 피고 있어 걱정이다

하루에 한갑 넘게 피고 있는데

어떻게 하면 이놈에 담배를 

끊을수 있을지 진지하게 궁금하다


벌써 금연시도만 19번 했었다

제일 길게 한게 군대에서 20일인가

했었는데 그땐 대체 어떻게 했나 모르겠다


훈련소에 있을때만 해도 

동기들이랑 화장실가서 몰래 피곤했는데

하아 그때가 그립다


금연에 대해서 빠삭한 사람있으면

좀 도와줬으면 좋겠다

댓글좀 남겨줘라 그냥 가지말고 


뭐 잡담은 여기까지만 하고

첫번째 예제를 살펴보도록 하자


class Unit {
	int hp;
}
interface Protoss {
	void sound();
}
class Zealot extends Unit implements Protoss{
	@Override
	public void sound() {
		System.out.println("마라이프포아이어~");
	}
}
class Dragoon extends Unit implements Protoss{
	@Override
	public void sound() {
		System.out.println("@SADFXVczc~as!~!");
	}
}
class Mutal {
	public void attack(Protoss target) {
		target.sound();
	}
}
class SimpleStarcraft {
	public static void main(String[] args) {
		Mutal m = new Mutal();
		Zealot z = new Zealot();
		Dragoon d = new Dragoon();

		m.attack(z);
		m.attack(d);
	}
}


인터페이스를 활용한 스타크래프트 예제이다

몇주 전에 스타 리마스터가 나와서 

많은 사람들 입에 오르락 내리락 했는데


개인적으로는 상당히 별로였다

불편한 점도 많았고!


근데 신기한게 20년이 다되어가는

스타크래프트가 한국에서는 아직도

인기가 많다는게 새삼스럽지만 신기하다 


아 잡담이 또 길어지고 있다 

바로 같이 예제를 보도록 하자


질럿 뮤탈 드라군 클래스가 존재한다

여기서 sound 메소드에 주목해보자

질럿과 드라군 각각의 소리를 출력하게 만들어놓았다


이제 뮤탈의 attack 메소드를 보자

target 이라는 매개변수를 받아서 

sound메소드를 호출하고 있다


이게 무슨 의미일까?


main문에 보면 뮤탈 객체 m이

질럿과 드라군 객체 z,d 를 때리고 있다

뮤탈이 때리면 질럿과 드라군이 소리를 낸다


뭐 물론, 스타크래프트를 잘 아는 사람이라면

의미가 맞지 않은건 알고 있겠지만


어떻게 생각해보면 자바로도 

스타크래프트를 만들어낼수 있을것 같지 않은가

디자인은 제외하고 말이다


다음을 보도록 하자


interface IFlyBehavior {
	void fly();
}
class FlyWithWings implements IFlyBehavior {
	@Override
	public void fly() {
		System.out.println("날개로 날아요~");
	}
}
class FlyNoWay implements IFlyBehavior {
	@Override
	public void fly() {
		System.out.println("못날아요~");
	}
}
interface IQuackBehavior {
	void quack();
}
class Quack implements IQuackBehavior {
	@Override
	public void quack() {
		System.out.println("꽥꽥");
	}
}
class MuteQuack implements IQuackBehavior {
	@Override
	public void quack() {
		System.out.println("...");
	}
}
abstract class Duck {
	private IFlyBehavior flyBehavior;
	private IQuackBehavior quackBehavior;
	
	public Duck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior) {
		setFlyBehavior(flyBehavior);
		setQuackBehavior(quackBehavior);
	}
	public abstract void display();
	public void swim() {
		System.out.println("물위에 둥둥~");
	}
	public void setFlyBehavior(IFlyBehavior flyBehavior) {
		this.flyBehavior = flyBehavior;
	}
	public IFlyBehavior getFlyBehavior() {
		return flyBehavior;
	}
	public void setQuackBehavior(IQuackBehavior quackBehavior) {
		this.quackBehavior = quackBehavior;
	}
	public IQuackBehavior getQuackBehavior() {
		return quackBehavior;
	}
	public void performFly() {
		flyBehavior.fly();
	}
}
class MallardDuck extends Duck {
	public MallardDuck(IFlyBehavior flyBehavior, IQuackBehavior quackBehavior) {
		super(flyBehavior, quackBehavior);
	}
	@Override
	public void display() {
		System.out.println("청둥오리임~");
	}
}
class DuckSimulator {
	public static void main(String[] args) {
		Duck d = new MallardDuck(new FlyWithWings(), new Quack());
		// 난다
		d.performFly();
		d.getFlyBehavior().fly();
		// 운다
	
		d.getQuackBehavior().quack();
		// 날개가 뿌라짐~
		
		d.setFlyBehavior(new FlyNoWay());
		d.performFly();
		d.getFlyBehavior().fly();
	}
}


인터페이스를 표현하여 각각 다른 

오리들을 나타내고 있다


인터페이스를 잘 활용하면 뭘하든 

편해질수 있는것 같다 


복붙이 되도록 만들어 놓았으니

직접 쳐보던지 복붙해서 실행해보길 바란다


자바학원을 다니면서 

중간마다 팀과제를 했었는데

인터페이스에 대해 깊이 있게 몰라

매번 제대로 못 써먹어서 아쉬웠던

기억이 갑자기 든다


뭐 이제는 코딩 할 일도 없으니

상관은 없다만은..


당신은 열심히 공부해서

꼭 잘 활용하길 바란다


오늘은 요기까지만 써야겠다

내일 불금인데 잘 보내길 바란다

반응형

댓글