스프링 프레임워크를 다루기 전에 꼭 필요한 자바 개념이 있다.
바로 인터페이스랑 리스트다.
1. 인터페이스란?
자바에서 클래스에 포함하는 메서드의 구체적인 내용을 작성하지 않고, 상수와 메서드 타입만 정의한 것이다.
극단적으로 동일한 목적 하에 동일한 기능을 수행하게끔 강제하는 것이 바로 인터페이스의 역할이다. 즉, 자바의 다형성을 극대화하여 개발코드 수정을 줄이고 프로그램 유지보수성을 높이기 위해 인터페이스를 사용한다.
1.1 인터페이스 구조
인터페이스는 다른 클래스에서 구현하는 것을 전제로 만들어진다.
그 때문에 인터페이스를 선언할 때는 암묵적으로 public abstract 접근 제어자가 붙은 추상 클래스라고 불린다.
인터페이스는 interface 키워드를 통해 선언할 수 있으며, implements 키워드를 통해 일반 클래스에서 인터페이스를 구현할 수 있다.
java 8 이전까지는 상수, 추상 메서드만 선언 가능했지만,
java 8 부터는 디폴트 메서드, 정적 메서드가 추가되었다.
public interface 인터페이스명 {
//상수
타입 상수명 = 값;
//추상 메소드
타입 메소드명(매개변수, ... );
//디폴트 메소드
default 타입 메소드명(매개변수, ... ) {
//구현부
}
//정적 메소드
static 타입 메소드명(매개변수) {
//구현부
}
}
(1) 상수
- 인터페이스에서 값을 정해줄 테니 함부로 바꾸지 말고 제공해주는 값만 참조해라. (절대적)
- 인터페이스는 데이터를 저장할 수 없기 때문에 저장할 인스턴스 또는 정적 필드를 선언할 수 없다.
- 대신 상수 필드만 선언할 수 있다.
- 인터페이스에서 선언된 필드는 모두 public static fianl 의 특성을 갖는다. public, static, final을 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
(2) 추상 메소드
- 가이드만 줄 테니 추상 메서드를 오버라이딩해서 재구현해라. (강제적)
- 인터페이스에서 선언된 추상 메서드는 모두 public abstract의 특성을 갖기 때문에, public abstract를 생략하더라도 자동적으로 컴파일 과정에서 붙게 된다.
- 일반 클래스에서 인터페이스를 구현할 때 추상 메서드가 오버라이딩 되어 있지 않으면 에러가 발생한다!
(3) 디폴트 메소드
- 인터페이스에서 기본적으로 제공해 주지만, 맘에 안 들면 각자 구현해서 써라. (선택적)
- 인터페이스가 로직을 가지고 있지만, 실제로는 인터페이스를 구현한 모든 객체에 기본적으로 들어가는 메서드라고 생각하면 된다. 또한, 인터페이스를 구현하는 측에서 재정의해서 사용할 수 있다.
(4) 정적 메소드
- 인터페이스에서 제공해 주는 것으로 무조건 사용 (절대적)
2. 리스트란?
자바에서 여러 개의 데이터를 취급하는 기능으로 배열이 있다.하지만, 배열은 길이가 정해져 있기 때문에 요소를 추가하거나 삭제하기가 어렵다는 단점이 있다.따라서, 자바에서는 복수의 데이터를 쉽게 사용할 수 있게 하는 컬렉션 (Collection) 이라는 클래스를 제공한다!
2.1 컬렉션 (Collection) 종류
1. 리스트 (List)
- 순서대로 데이터를 저장
- 데이터 중복 허용 o
2. 집합 (Set)
- 순서를 유지하지 않는 집합
- 데이터 중복 허용 x
3. 맵 (Map)
- 키와 값의 쌍으로 이루어진 데이터 집합
- 순서는 유지되지 않음
- 키의 중복 허용 x
- 데이터 중복 허용 o
2.2 ArrayList , LinkedList 차이점
(1) ArrayList
배열은 처음에 메모리를 할당할 때 크기를 지정해주어야 하지만,
ArrayList는 크기를 지정하지 않고 동적으로 값을 삽입하고 삭제할 수 있다.
각 데이터 추가/삭제 마다 배열을 새로 만들어 복사해 주므로, 기존 10개에 데이터에서 1개를 추가하면 10번의 복사가 요구된다. 따라서, O(n) 의 시간복잡도가 추가/삭제에서 요구된다.
반면 참조의 경우에는, 배열의 형태로 데이터들이 저장해 있기 때문에 사용자가 원하는 인덱스 데이터를O(1)의 시간에 바로 꺼내올 수 있다.
즉, ArrayList는 요소의 수가 많아지면 추가/삭제 처리를 하는 데 시간이 걸려 불리하고, 참조에는 유리하다.
(2) LinkedList
LinkedList는 내부적으로 양방향의 연결 리스트로 구성되어 있어 참조하려는 원소에 따라 처음부터 정방향 또는 역순으로 조회가 가능하다.
LinkedList는 데이터를 하나의 노드로 구성하며, 각 노드는 자신의 이전 노드와 다음 노드만 알고 있다.
각각의 노드는 개별적으로 메모리에 저장되고, 다음 노드의 위치를 가리키고 있으므로 데이터의 추가/삭제 시 나머지 데이터들의 복사가 필요 없다. 단지 새로운 데이터 노드를 만들고, 그걸 끼워주면 된다! 따라서, 데이터의 추가/삭제에서 O(1)의 시간 복잡도를 갖는다.
반면 참조의 경우에는, 해당 인덱스에 바로 접근했던 ArrayList와 다르게 원하는 인덱스까지 노드 하나하나를 통과해 가며 다음 노드를 체크해야 한다. 따라서, 최대 O(n)의 시간복잡도가 발생할 수 있다.
즉, LinkedList는 추가/삭제에는 유리하고, 참조에는 불리하다.
◼ 스프링 프레임워크 첫걸음 관련 게시글 더보기
스프링 프레임워크 첫걸음 - YES24
세상에서 가장 친절한 스프링 프레임워크 입문서! 스프링 프레임워크는 전 세계적으로 가장 널리 사용되는 오픈소스 자바 애플리케이션 프레임워크다. 이 책에서는 스프링 프레임워크를 처음
www.yes24.com