jeongabae / ThinkDataStructures

자바로 배우는 핵심 자료구조와 알고리즘 정리
MIT License
0 stars 0 forks source link

ch1 인터페이스 #1

Open jeongabae opened 4 years ago

jeongabae commented 4 years ago

1.1 리스트가 두 종류인 이유

1.2 자바 interface

1.3 List interface

import java.util.LinkedList; import java.util.List;

public class ListClientExample { @SuppressWarnings("rawtypes") private List list;

@SuppressWarnings("rawtypes")
public ListClientExample() { //ListClientExample 클래스의 생성자는 새로운 LinkedLIist객체를 만들어 리스트를 초기화
    list = new LinkedList();        
}

@SuppressWarnings("rawtypes")
public List getList() { //게터 메서드, List 객체에 대한 참조를 반환
    return list;
}

public static void main(String[] args) {
    ListClientExample lce = new ListClientExample();
    @SuppressWarnings("rawtypes")
    List list = lce.getList();
    System.out.println(list);
}

}


*** 필요한 경우가 아니면  ArrayList나 LinkedList 같은 구현 클래스 사용하지 x, 가능한 한 List 인터페이스 사용
  -  ArrayList 클래스를 사용하고자 하면, 생성자만 바꾸면 됨

* 인터페이스 기반 프로그래밍(여기서 인터페이스는 자바 인터페이스x, 일반적인 개념의 인터페이스)

***라이브러리 사용시 코드는 오직 List와 같은 인터페이스만 의존, 특정 구현에 의존해서는x..!
-> 구현이 변경되어도 인터페이스를 사용하는 코드 그대로 사용 가능
-> 인터페이스가 변경되면 인터페이스를 의존하는 코드는 변경되어야...(그래서 잘 변경하지 않음.)
jeongabae commented 4 years ago

1.4 실습

1.3절의 코드에서 구현만 바꿈( LinkedList 클래스-> ArrayList 클래스 교체)

import static org.junit.Assert.assertThat; import static org.hamcrest.CoreMatchers.*;

import java.util.ArrayList; import java.util.List;

import org.junit.Test;

/**

}


- ListClinetExampleTest
```java
package com.allendowney.thinkdast;

import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.*;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

/**
 * @author downey
 *
 */
public class ListClientExampleTest {

    /**
     * Test method for {@link ListClientExample}.
     */
    @Test
    public void testListClientExample() {
        ListClientExample lce = new ListClientExample();
        @SuppressWarnings("rawtypes")
        List list = lce.getList();
        assertThat(list, instanceOf(ArrayList.class) );
    }

}
  1. ListClientExample 클래스의 getList 메서드를 실행하여 반환형이 ArrayList 클래스인지 확인. -> 실패( LinkedList클래스 반환해서)

  2. ListClientExample 클래스에서 LinkedList 클래스-> ArrayList 클래스 교체, import문 추가. ListClientExample 클래스 컴파일, 실행. ->성공

    
    package com.allendowney.thinkdast;

import java.util.ArrayList; import java.util.LinkedList; import java.util.List;

public class ListClientExample { @SuppressWarnings("rawtypes") private List list;

@SuppressWarnings("rawtypes")
public ListClientExample() {
    list = new ArrayList();
    //실습 수정 전에는 list = new LinkedList(); 였음!
}

@SuppressWarnings("rawtypes")
public List getList() {
    return list;
}

public static void main(String[] args) {
    ListClientExample lce = new ListClientExample();
    @SuppressWarnings("rawtypes")
    List list = lce.getList();
    System.out.println(list);
}

}


cf) List가 있는 선언 부분을 ArrayList로 변경?
-> 프로그램 정상동작, but 과다 지정(oeverspecified)

cf) ListClientExample 클래스의 생성자에서 ArrayLIst 객체를 List 인터페이스로 교체하면?
-> 생성자에서 인스턴스가 생성되지 않지 않을까.. 인스턴스가 생성되지않으면 컴파일이 잘 되지 않지 않을까...생각...

cf) 왜 List 인터페이스로는 인스턴스가 생성되지 않을까?
-> 자바 인터페이스는 인스턴스를 생성할 수 없다고 알고 있는데... 즉 List 인터페이스가 인스턴스를 생성하는 객체가 아니기 때문에..?