반응형
오늘 해커랭크에서 문제를 풀다가 뭐지? 하고 다시 한번 알게 된 내용을 적어보려 한다.
List<Object> list = new List<Object>();......
이게 왜 안되지? 이러다 알게된 사실!
List는 인터페이스로, 객체를 만들 수 없다!
물론 만들수 있지만 인터페이스가 무엇인가! 말 그대로 틀만 있고 구현된게 하나도 없는것이다.
그러니 만드려면 List에서 사용하는 모든 기능들을 구현해주어야 한다.
List<Integer> list = new List<Integer>() {
@Override
public <T> T[] toArray(T[] a) {
// TODO Auto-generated method stub
return null;
}
@Override
public Object[] toArray() {
// TODO Auto-generated method stub
return null;
}
@Override
public List<Integer> subList(int fromIndex, int toIndex) {
// TODO Auto-generated method stub
return null;
}
@Override
public int size() {
// TODO Auto-generated method stub
return 0;
}
@Override
public Integer set(int index, Integer element) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean retainAll(Collection<?> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean removeAll(Collection<?> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public Integer remove(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean remove(Object o) {
// TODO Auto-generated method stub
return false;
}
@Override
public ListIterator<Integer> listIterator(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public ListIterator<Integer> listIterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public int lastIndexOf(Object o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public Iterator<Integer> iterator() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean isEmpty() {
// TODO Auto-generated method stub
return false;
}
@Override
public int indexOf(Object o) {
// TODO Auto-generated method stub
return 0;
}
@Override
public Integer get(int index) {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean containsAll(Collection<?> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean contains(Object o) {
// TODO Auto-generated method stub
return false;
}
@Override
public void clear() {
// TODO Auto-generated method stub
}
@Override
public boolean addAll(int index, Collection<? extends Integer> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public boolean addAll(Collection<? extends Integer> c) {
// TODO Auto-generated method stub
return false;
}
@Override
public void add(int index, Integer element) {
// TODO Auto-generated method stub
}
@Override
public boolean add(Integer e) {
// TODO Auto-generated method stub
return false;
}
};
근데 이미 클래스화 되어있는게 굳이?!!! -> 클래스화가 된 ArrayList를 이용해서 기본적으로 아래와 같이 선언한다!
List<Object> list = new ArrayList<>();
여기서 하나의 의문이 더 들었다!
'그럼 처음부터 ArrayList 타입으로 만들면 더 좋은게 아닌가?'
그러나 그렇게 사용한다면 나중에 데이터의 용도가 바뀌어 삽입/삭제를 더 용이하게 사용하기위해 LinkedList로 바꾼다고 했을때 모든 ArrayList를 LinkedList로 바꿔야 하고, 만일 ArrayList에서만 지원하는 메소드를 사용했을 시 더 많은 변경작업이 필요하다. 그래서 List로 선언해서 사용한다면 선언부 외에 변경할 일이 없다.
이렇기 때문에 List를 상속받아 사용하는 ArrayList를 업캐스팅해서 사용하는것이 일반적이라고 보는것이 좋다!
반응형
'코딩 공부(hackerrank)' 카테고리의 다른 글
[Java] String.format 소수점 표기법 (0) | 2023.01.10 |
---|---|
[Java] String vs StringBuilder (0) | 2023.01.10 |
[Java] for문, foreach문, List.forEach() (4) | 2023.01.10 |
[HackerRank] 코딩 시 주의하자! (3월) (0) | 2022.03.22 |