제목의 질문은 아래로도 대치 가능합니다. 왜 우리는 인스턴스 타입을 클래스 대신 인터페이스로 초기화할까? 우리는 아래처럼 인스턴스를 생성 및 초기화해서는 안됩니다. ArrayList list = new ArrayList(); List list = new ArrayList(); 우리는 위처럼 List 인터페이스를 사용해야 합니다. 인터페이스를 구체클래스의 위에 타입으로 덧씌우는 것은 캡슐화와 낮은 결합도(loose coupling)의 핵심입니다. 나중에는 테스트코드를 작성하기도 쉬워지고 나중에 구현에 변경사항이 생겨도 변화에 쉽게 대응할 수 있습니다. 만약 나중에, 기획자가 요구사항을 바꿔서 ArrayList 가 아니라 Stack 의 기능으로 바꿔야 한다면 해줘야 하는 건 그냥 ArrayList 를 St..