JAVA 인터페이스

강정우·2022년 7월 21일
0

JAVA

목록 보기
21/31
post-thumbnail

interface

  • 현직에서는 기능별로 따로 개발을 한다. 이때 서로 method나 field 이름다 다 다르다면 문제가 있다.
    충돌이 일어날 수 있고 다음 개발자가 왔을 때 이것이 무슨 뜻인지 모르거나 이해하는 데있어 많은 시간을 잡아먹는다. 이를 방지하고자 등장한 개념이 interface이다.

  • interface의 장점으로

    • interface로 인해 동일한 이름으로 개발을 한다 같은 규격, 혼돈이 안 생긴다.
    • 상속처럼 data를 하나로 묶어줄 수 있다. 왜? 규격화 (datatype화)가 되었으니까.
  • 다중상속 : interface끼리 extends(상속)이 됨. 대신 interface에있는 모든 abstract method를 implement해야한다. 또한 콤마로 다중 상속이 가능하다.

  • 무엇보다 우리가 이제 interface를 갖다가 쓰니까 어떻게 구동하는지 알아야 한다.

  • 무엇보다 우선 재미있게 배우기위해 게임을 코딩해 보자.
    지금부터 판타지 세계관에 꼭 있는 마법사, 전사, 도적, 사제를 만들어볼 것이다.

  • 만약 위와 같이 각자 캐릭터를 개발하는 개발자가 자기 마음대로 method 이름을 선언한다면...? 나중에 합칠 때 충돌은 안 일어날지 몰라도 코드가 매우 더러워 질 것이다.
  • 이를 방지하고자 나타난 것이 interface이다.
  • interface란 개발을 할때 동일한 규격으로 진행하기 위한 하나의 틀이다.

인터페이스의 특징

  1. 인터페이스 안에는 상수와 추상메소드만 존재할 수 있다.
  2. 인터페이스는 객체를 생성할 수 없다.
  3. 자바는 다중상속을 지원하지 않지만 인터페이스는 동시에 여러개 사용 가능
  4. 띄용 인터페이스 안에선 abstract가 꼭 붙어있을 필요는 없다! 왜냐 어차피 갖다가 쓰면서 재정의 할꺼기 때문이다.
  • interface가 점점 상속화 되어가고있다. default method는 abstract가 아닌 일반 method화 하겠다는 뜻.
  • 따라서 추상 클래스 처럼 interface를 선언하고 이 규격에 맞게 각각의 캐릭터들을 생성한다.

  • 또한 interface를 구현(implement)할 땐 앞서 배웠던 alt+shift+s로 손 쉽게 구현하고 extends 대신 implements라는 keywords를 써서 구현하면 된다.

  • 그 후 main method를 이용하여 가볍게 쯔꾸르게임을 흉내내 봤다.

<style>

import java.util.ArrayList;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Character wizard = new Wizard();
		Character warrior = new Warrior();
		Character thief = new Thief();
		Character priest = new Priest();
		
		// 다형성의 대표 예제 : upcasting
		ArrayList<Character> list = new ArrayList<Character>();

		list.add(wizard);
		list.add(warrior);
		list.add(thief);
		list.add(priest);

		String text1 = "우리는 드디어 마왕성 앞에 도착했다...";
		String text2 = "여태까지 많은 시련이 있었지만 우리는 포기하지 않았다...";
		String text3 = "마왕성의 문을 여는 순간... 우리앞에 마왕의 모습이 들어났다...";
		String text4 = "마왕 : \"하하핫 가소로운 녀석들! 여기까지 오다니 대단하군..!\"";
		String text5 = "마왕 : \"너희의 운도 여기까지다! 나를 상대할 녀석은 대체 누구냐!!\"";

		ArrayList<String> story = new ArrayList<String>();

		story.add(text1);
		story.add(text2);
		story.add(text3);
		story.add(text4);
		story.add(text5);

		boolean isText = true;
		for (int j = 0; j < story.size(); j++) {
			String[] text = story.get(j).split("");
			isText = false;
			for (int i = 0; i < text.length; i++) {
				System.out.print(text[i]);
				try {
					Thread.sleep(5);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			System.out.println("");
		}

		System.out.println("==== Choose ur Charactor ====");
		System.out.println("1.Wizard 2.Warrior 3.Thief 4.Priest");
		int choice = sc.nextInt();
		boolean flag = true;
		while (flag) {
			System.out.println("1.attack 2.dodge 3.skill 4. run>> ");
			int skill = sc.nextInt();
			if (skill == 1) {
				list.get(choice - 1).attack();
			} else if (skill == 2) {
				list.get(choice - 1).move();
			} else if (skill == 3) {
				list.get(choice - 1).skill();
			} else if (skill == 4) {
				System.out.println("전투를 종료합니다.");
				flag = false;
			}
		}
	}
}
</style>
  • 추가 공부 요소 (refactoring)
    alt+shift+m 으로 손 쉽게 refacoring 할 수 있다.
    사용법
    1.Java Code Convention을 지키면서 프로그래밍을 한다.
    2.Indent(들여쓰기) depth를 3이 넘지 않도록 구현한다.(2까지만 허용)
    • 예를 들어 while문 안에 if문이 있으면 들여쓰기는 2이다.
    • 힌트: Indent(들여쓰기) depth를 줄이는 가장 좋은 방법은 함수(또는 메서드)를 분리하면 된다.
    3.함수(또는 메서드)가 한 가지 일만 하도록 최대한 작게 만들어라.
    4.함수(또는 메서드)의 길이가 15라인을 넘어가지 않도록 구현한다. => 한 가지 일만 잘하도록 구현.
    5.else 예약어를 쓰지 않는다.
    6.if 조건절에서 값을 return 하도록 구현하면 else를 사용하지 않아도 된다.

  • 추가 공부 요소 (thread)

  • thread는 일을 시키는 녀석으로 자바는 1개의 thread를 갖고 있다. main method가 그에 해당하는 것이다.
    사용법은 try, catch과 함께 thread를 사용하며 python에 timesleep position을 담당하고 있다.

  • 쓰레드는 join과 runable method와 같이 쓰이는 듯 하다. thread method 자체가 main method가 끝나기 전에 끝나기 때문에 이를 방지하고자 쓰는 듯 하다. 이것을 활용할 방법은 추후 포스팅 하겠다.

// 교재 297p
// 교재 298p
// 교재 301p
// 교재 304p

profile
智(지)! 德(덕)! 體(체)!

0개의 댓글