본문 바로가기
코딩 공부(hackerrank)

[Java] List<Object> list = new List<Object>(); 안되는 이유

by Luna_lua 2023. 1. 10.
반응형

오늘 해커랭크에서 문제를 풀다가 뭐지? 하고 다시 한번 알게 된 내용을 적어보려 한다.

 

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를 업캐스팅해서 사용하는것이 일반적이라고 보는것이 좋다!

 

 

반응형