포스트

Day23 실습프로젝트(인터페이스)

1. Interface

1.1 인터페이스의 개념

  • 서로 다른 두 객체를 연결해주는 역할을 한다.
  • 같은 형식으로 선언된 메소드여도 구현객체에 따라 다른 결과 값을 가져온다.
  • 이러한 특징으로 인해 다형성을 구현할 수 있다.



1.2 인터페이스의 선언

  • 인터페이스를 선언 한다는 것은 구현객체가 어떤 형식에 영향을 준다.
1
2
3
4
5
6
7
8
public interface 인터페이스명{
    public 상수필드
    public 추상메소드
    public 디폴트메소드
    public 정적메소드
    public 메소드
    private 정적메소드
}

1.3 구현메소드의 선언

  • 구현 객체는 인터페이스에서 선언된 추상메소드을 오버라이딩을 통해 구체적인 실행 코드가 들어있다.
1
public class B implements 인터페이스명{}

1.4 상수필드

  • 인터페이스에 선언된 필드는 모두 public static final의 특성을 갖는다.
1
[public static final] 타입 상수명 = 값;

1.5 추상메서드

  • 추상메서드는 함수의 시그니처만 사용하여 나타낸다.
  • 기본적으로 public abstarct을 사용하여, 생략시 컴파일시 자동으로 생성된다.
  • 구현클래스에서는 추상메서드에 대한 오버라이딩(public 타입으로) 을 시행하여야 한다.
1
[public abstract] 리턴타입 메소드명(매개변수,...);

1.6 디폴트메서드

  • 인터페이스내에 완전한 실행코드를 사용하려면 디폴트 메서드를 사용해야한다.
  • 디폴트 메서드는 인터페이스내에서 상수필드와 추상메소드를 호출할 수 있다.
  • 디폴트 메서드는 구현 객체가 필요한 메서드 이다.
  • 추상메소드 호출 시, 오버라이딩된 구현객체의 메서드에게 매개변수를 전달한다.
  • 구현 객체에서 디폴트 메서드를 새로정의할 수있다.
1
[public] default 리턴타입 메소드명(매개변수,....) {....}

1.7 정적메서드

  • 구현객체가 없어서도 인터페이스만으로도 호출 할 수 있는 메서드이다.
  • 상수필드 제외한 메서드들을 호출 할 수 없다.
  • 정적메소드는 메인에서 인터페이스 명으로 호출 가능하다.
1
[public|(private)] static 리턴타입 메서드명(매개변수...){ 상수필드 o, 메서드들 x}

1.8 private메서드

  • public 말고 private 형으로도 메서드 선언이 가능하다.
  • default (non-static, static), static(static) 메소드 호출이 가능하다.

2. 실습프로젝트

2.1 ArrayList와 LinkedList

  • 두개의 클래스는 동일한 기능을 하는 메서드들이 있다.
  • add(), remove() …. 등



  • 하나의 인터페이스로 묶어서 관리하는 것이 편리하다.



  • 인터페이스에서는 추상화메서드로 메서의 원형만 선언해준다.
  • 인터페이스를 따르는 클래스에는 클래스명 뒤에 implements 인터페이스명 을 붙인다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package bitcamp.myapp2.util;

public interface List {
  void add(Object obj);

  Object remove(int index);

  Object get(int index);

  Object[] toArray();

  int indexOf(Object obj);

  int size();
}

package bitcamp.myapp2.util;

import bitcamp.myapp2.vo.User;

import java.util.Arrays;

public class ArrayList extends AbstracList {
  private static final int MAX_SIZE = 100;
  private Object[] list = new Object[MAX_SIZE];

  private void grow() {
    int oldSize = list.length;
    int newSize = oldSize + (oldSize >> 1);
    Object[] arr = new Object[newSize];
    System.arraycopy(list, 0, arr, 0, oldSize);
    list = arr;
  }

  @Override
  public void add(Object obj) {
    if (size == list.length) {
      int oldSize = list.length;
      int newSize = oldSize + (oldSize >> 1);
      list = Arrays.copyOf(list, newSize);
      grow();
    }
    list[size++] = obj;
  }

  @Override
  public Object get(int index) {
    if (index < 0 || index >= size) {
      return null;
    }
    return list[index];
  }

  @Override
  public Object remove(int index) {
    if (index < 0 || index >= size) {
      return null;
    }
    Object deletedObj = list[index];
    for (int i = index + 1; i < size; i++) {
      list[i - 1] = list[i];
    }
    list[--size] = null;
    return deletedObj;
  }

  @Override
  public Object[] toArray() {
    Object[] arr = new Object[size];
    System.arraycopy(list, 0, arr, 0, size);
    return arr;
  }

  @Override
  public int indexOf(Object obj) {
    for (int i = 0; i < size; i++) {
      if (list[i].equals(obj)) {
        return i;
      }
    }
    return -1;
  }

  public boolean contain(User user) {
    return indexOf(user) != -1;
  }
}

2.2 추상화클래스 생성

  • ArrayList와 LinkedList 클래스에는 size가 중복된다.
  • 이 경우 추상화 클래스를 생성하여 인터페이스로 받고 이후 상속을 한다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
package bitcamp.myapp2.util;

public abstract class AbstractList implements List {
  protected int size;

  @Override
  public int size() {
    return size;
  }
}

package bitcamp.myapp2.util;

import bitcamp.myapp2.vo.User;

import java.util.Arrays;

public class ArrayList extends AbstractList {
  private static final int MAX_SIZE = 100;
  private Object[] list = new Object[MAX_SIZE];

  @Override
  public void add(Object obj) { //생략 }

  @Override
  public Object get(int index) { //생략 }

  @Override
  public Object remove(int index) { //생략 }

  @Override
  public Object[] toArray() { //생략 }

  @Override
  public int indexOf(Object obj) { //생략 }

  public boolean contain(User user) { //생략 }
}

package bitcamp.myapp2.util;

public class LinkedList extends AbstractList {
  Node first;
  Node last;

  @Override
  public void add(Object value) { //생략 }

  @Override
  public Object get(int index) { //생략 }

  @Override
  public Object remove(int index) { //생략 }

  @Override
  public Object[] toArray() { //생략 }

  @Override
  public int indexOf(Object value) { //생략 }

  public static class Node {
    Object value;
    Node next;

    public Node(Object value) {
      this.value = value;
    }
  }

}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.