본문 바로가기
개발자 꿈나무의 하루/01_Boot Camp

(네이버클라우드 부트캠프) 23일차 - 실습프로젝트(인터페이스)

by kk_naks 2024. 6. 26.

1. Interface 

  1.1 인터페이스의 개념

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

 

  1.2 인터페이스의 선언

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

  1.3 구현메소드의 선언

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

  1.4 상수필드 

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

  1.5 추상메서드

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

  1.6 디폴트메서드

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

 

  1.7 정적메서드

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

  1.8 private메서드

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

 

2. 실습프로젝트

  2.1 ArrayList와 LinkedList

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

 

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

 

- 인터페이스에서는 추상화메서드로 메서의 원형만 선언해준다.
- 인터페이스를 따르는 클래스에는 클래스명 뒤에 implements 인터페이스명 을 붙인다. 
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가 중복된다. 
- 이 경우 추상화 클래스를 생성하여 인터페이스로 받고 이후 상속을 한다. 

 

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;
    }
  }

}