다향성을 적용해 적용하면 제이터를 접근 할 때마다 항상 원하는 타입으로 형변환을 하여야 한다. 구현면에서는 효율적이고 편리하지만, 자료형에 매우 불안정한 구조가 된다.
제네릭 프로그래밍
- 클래스를 정의하면서 사용할 변수의 자료형을 설계할 때(코드 작성시) 결정하는 것이 아니가 컴파일 할 때 자료형을 검사해서 자료형에 유연하면서 안정성까지 고려할 수 있도록 제공하는 기술
- 제네릭은 어떠한 자료형을 기반으로도 인스턴스의 생성이 가능하도록 자료형에 일반적인 클래스를 정의하는 문법(재사용이 가능)
- 실행할 때 매개변수로 받아서 데이터 타입을 결정한다.
제네릭 클래스 : 타입을 변수로 표시(타입매개변수 : 객체 생성시에 프로그래머에 의하여 결정)
타입매개변수 : E-Element, K-Key, N-Number, T-Type, V-Value
[클래스명<타입인자>참조변수 = new 클래스명<타입인자>(); ]
제네릭 타입
[public class 클래스명 <타입매개변수>]
- 타입을 파라미터로 가지는 클래스와 인터페이스
- 선언 시 클래스 또는 인터페이스 이름뒤에 "<>" 부호 붙임
- "<>" 사이에는 타입 파라미터가 위치한다.
- 제네릭은 불필요한 타입 변경을 없애준다.
- 제네릭을 엄격한 타입검사를 통해 안전성을 높여준다.(컴파일 시에 미리 타입을 강하게 체크해서 에러 사전 방지)
타입 파라미터(= 매개변수 타입)
- 일반적으로 대문자 알파벳 한 문자로 표현
- 실핸클래스에서 타입 파라미터 자리에 구체적인 타입을 지정해 주어야 한다.
타입매개변수로 전달되는 타입의 종류를 제한하고 싶은 경우가 있다. 특정한 종류의 객체들만을 받게 하고 싶은 경우 사용하는 것이 한정된 타입매개변수이다. 이 기능을 사용하기 위해서는 extends나 super 키워드를 사용한다.
[<타입 매개변수 extends 슈퍼 클래스명> : 슈퍼 클래스를 상속받은 하위 객체들만 가능하다.
<타입 매개변수 extends 인터페이스명> : 인터페이스로부터 구현 클래스 객체들만 가능하다.]
제네릭 타입을 매개변수의 타입이나 리턴타입으로 사용할 때 와일드 카드로 명시할 수도 있다.
와일드 카드는 ?로 표현 : 어떤타입 매개변수도 지정할 수 있다는 의미. 현재 객체의 타입 매개변수와 같지 않은 타입의 인자로 받을 수 있다.
[<?> 제한없음
<? extends 슈퍼 클래스> : 슈퍼 클래스이거나 슈퍼클래스로부터 상속받은 하위 객체만 타입으로 지정
<? super 서브 클래스> : 서브 클래스이거나 서브 클래스가 상속하는 상위 객체만 타입으로 지정]
제네릭 메서드 : 매개변수 타입과 리턴 타입으로 타입 매개변수를 갖는 메소드, 타입 매개변수를 리턴 타입과 매개변수에 사용
[public <타입매개변수,...> 리턴타입 메서드명(매개변수,...){ }]
호출
- 명시적으로 타입 인자를 지정
- 리턴타입 변수 = <타입 인자> 메서드명(인자값);
- 인자값을 보고 타입 인자를 추정
- 리턴타입 변수 = 메서드명(인자값);
프로그램 : 데이터를 표현하고 데이터를 처리하는 것
자료구조 : 데이터를 효율적으로 사용되도록 구조적으로 저장하고 관리하는 것 , 데이터를 추가, 수정, 삭제, 검색이 효율적으로 함(정형화하거 있는 데이터 저장방식 : 배열, 리스트, 스택, 트리, 큐, 해시 정리)
프로그램 구성 = 코드 + 데이터(데이터 관리 기술 = 자료구조)
알고리즘 : 자료구조가 데이터의표현돠 저장에 대한 방법이라면 알고리즘은 표현되거나 저장된 데이터를 대상으로 '문제를 해결하는 방법'이다. 알고리즘과 자료구조는 밀접하게 관련되어 있다.(정렬, 탐색 등으로 정리)
컬렉션 : 자료구조와 알고리즘을 인터페이스,클래스로 구현하려 제공하는 자바 API, 컬렉션 괸련 클래스들은 많은 양의 인스턴스를 다양한 형태로 저장하는 기능을 제공한다. 다양하고 효율적으로 인스턴스의 저장이 가능. 기본적으로 객체들의 집합을 의미. 객체 단위의 연산을 제공,
배열의 문제점 : 불특정 다수의 객체를 저장하기에는 문제, 객체를 저장하려면 어디가 비어있는지 확인해야함
배열과 컬렉션의 차이점
- 배열은 크기를 지정해랴만 하고 한번 지정된 크리를 변경할 수 없지만 컬렉션은 크기에 제약이 없다.
- 배열은 중간에 값을 추가 해준다거나 삭제 또는 정렬을 하고자 할 때 개발자가 직접 코드로써 로직을 작성해야 하지만 컬렉션에서는 이미 자료구조적인 알고리즘이 메소드로 정의되어 있기 때문에 메서드 호출만으로 방대한 데이터를 효율적으로, 구조적으로 관리할 수 있다.
- 배열은 한가지 타입의 여러 개의 데이터를 보관할 수 있다면 컬렉션은 별도의 제네릭 설정을 하지 않을 경우 여러가지 타입의 여러 개의 데이터를 보관할 수 있다.
컬렉션 프레임워크(컬레션 인터페이스, 컬렉션 클래스) : 자료 구조에 사용하는 인터페이스, 인터페이스로 구현된 클래스, 괸련된 알고리즘(java.util 패키지에 존재), 구체적이고 체계화된 API(프로그래밍 접근 방식)을 제공한다는 의미.
프레임워크 : 자료구조에 상관없이 추가하려면 add(), 삭제하려면 remove() 같이 표준화된 접근 받식을 제공하는 것. 사용 방법을 미리 정해 놓은 라이브러리를 말한다.
인터페이스 및 클래스 | 설명 |
인터페이스 | 컬렉션에서 공통으로 제공해야 하는 연산들을 추상적으로 정의하고, 구체적인 구현은 구현 클래스에 위임한다. |
구현 클래스 | 컬렉션을 실제로는 어떤 자료구조를 적용해 구현하느냐에 따라 컬렉션의 종류가 달라진다. |
알고리즘 | 컬렉션마다 유용하게 사용할 수 있는 메서드를 의미한다. |
인터페이스 | 설명 |
Collection | 모든 자료 구조의 부모 인터페이스로서 객체의 모임을 나타낸다 |
Set | 집합(중복된 원소를 가지지 않는)을 나타내는 자료구조 |
List | 순서가 있는 자료 구조로 중복된 원소를 가질 수 있다. |
Map | 키와 값들이 연관되어 있는 사전과 같은 자료구조 |
Queue | 들어온 순서대로 나가는 FIFO(First - In-First-Out) 자료구조 |
Collection은 거의 모든 컬렉션 인터페이스의 부모 인터페이스에 해당. 모든 컬렉션 클래스들이 Collection 인터페이스를 구현하고 있기 때문에 Collection에 들어 있는 메소드들은 거의 대부분 컬렉션 클래스(구현 클래스)에서 사용할 수 있다.
기능 | 메서드 | 설명 |
객체추가 | boolean add(E e) | 주어진 객체 맨 끝에 추가 |
객체비우기 | void clear() | 컬렉션의 모든 요소 비우기 |
여부판단 | boolean isEmpty() | 컬렉셩의 요소 존재 여부 판단 |
객체삭제 | boolean remove(Object o) | 매개변수로 전달받은 객체를 컬렉션에서 삭제 |
요소 수 반환 | int size | 컬렉션의 요수 개수 |
리스트 : 순서를 가지는 원소들의 모듬으로 중복된 원소를 가질 수 있다. 위치를 사용하여 원소에 접근한다.
ArrayList클래스 : List 인터페이스의 구현 클래스. 선형구조(데이터를 구조화하는 기본 표현 방식) 배열을 이용해 자료를 관리한다. 순차구조방식, 연결 구조 방식이 있다.기본 생성자로 ArrayList 객체를 생성하면 내부에 10개의 객체를 저장할 수 있는 초기 용량(capacity)을 가지게 된다. 저장되는 객체 수가 늘어나면 용량이 자동 증가. 동일한 데이터도 여러번 저장될 수 있으므로 맨 처음에 있는 데이터의 위치가 반환된다.
순차구조 : 항목 간의 논리적인 순서와 메모리에 저장되는 물리적 순서가 같은 구조(배열의 원리와 동일)
indexOf(): 특정한 데이터가 저장된 위치를 알 수 있다.
lastIndexOf (): 검색을 반대 방향으로 할 때 사용.
배열: 배열명.length
문자열: 문자열참조변수 또는 "문자".length()
리스트 구현 클래스 : 리스트명.size()
ArrayList에 있는 원소에 접근하는 하나의 방법은 반복자를 사용하는 것
반복자: 특별한 타입의 객체로 컬렉션의 원소들에 접근하는 것이 목적으로 객체 집합의 항목들에 차례대로 접근하는데 하용하는 객체
Iterator : 컬렉션에 저장된 데이터의 위치정보를 포함한 커서가 있어서 인덱스 등을 사용하지 않고 쉽게 데이터에 접근할 수 있다.
Collection view : 컬렉션에 저장된 모든 데이터를 순차으로 접근하여 사용할 목적으로 사용하는 Iterator