7월 18일(월)
Java 제네릭, 컬렉션 프레임워크, 인터페이스에 대해 개념적인 것을 학습하였다.
Java generic
제너릭이 필요한 이유
ArrayList를 직접 구현해서 쓴다고 할 때, 만약 그 안의 배열의 타입을 일정하게 정해놓는다면? 담을 수 있는 데이터 타입이 그 타입에 한정되게 되어 있다. 타입별로 ArrayList를 만들어야 하는 ‘번거로움’이 생기는 것이다.
단지, 타입만 다를 뿐인데, 새로 만들어야 할 필요가 있을까? 물론, 타입형 선언을 할 때, Object로 선언을 할 수 있다. 하지만, 오토 언박싱이 안되는 경우가 있어 불편함이 생긴다. 이러한 번거로움을 줄이기 위해서, 제너릭이 탄생한다.
타입형을 미정으로 두는 것이다. 클래스명<T> 와 같이 하는 것이다. 만약, 생성자 호출을 할 때, 타입형을 명시해주면, 그 타입을 넣고 쓸 수 있는 클래스가 탄생하는 것이다.
<제네릭을 사용하지 않으면>
class Main {
public static void main(String[] args) {
Int저장소 a저장소1 = new Int저장소();
a저장소1.setData(30);
int a = a저장소1.getData();
System.out.println(a);
Double저장소 a저장소2 = new Double저장소();
a저장소2.setData(5.5);
double b = a저장소2.getData();
System.out.println(b);
사과저장소 a저장소3 = new 사과저장소();
a저장소3.setData(new 사과());
사과 c = a저장소3.getData();
System.out.println(c);
}
}
class Int저장소 {
Object data;
int getData() {
return (int)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
class Double저장소 {
Object data;
double getData() {
return (double)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
class 사과 {
}
class 사과저장소 {
Object data;
사과 getData() {
return (사과)data;
}
void setData(Object inputedData) {
this.data = inputedData;
}
}
Java
복사
<제네릭을 사용한다면>
// 문제 : 제너릭을 사용해서 중복을 제거해주세요.
class Main {
public static void main(String[] args) {
저장소<Integer> a저장소1 = new 저장소<>();
a저장소1.setData(30);
int a = a저장소1.getData();
System.out.println(a);
저장소<Double> a저장소2 = new 저장소<>();
a저장소2.setData(5.5);
double b = a저장소2.getData();
System.out.println(b);
저장소<사과> a저장소3 = new 저장소<>();
a저장소3.setData(new 사과());
사과 c = a저장소3.getData();
System.out.println(c);
}
}
class 사과 {
}
class 저장소<T> {
T data;
T getData() {
return (T)data;
}
void setData(T inputedData) {
this.data = inputedData;
}
}
Java
복사
Java Hashmap
class HashMap {
private Object[] keys;
private Object[] datas;
int size = 0;
HashMap() {
keys = new Object[100];
datas = new Object[100];
}
void put(Object key, Object data) {
int index = findMyIndex(key);
if(index == -1){
keys[size] = key;
datas[size] = data;
size++;
}
else{
datas[index] = data;
}
}
Object get(Object key) {
Object v = null;
int index = -1;
for ( int i = 0; i < size; i++ ) {
if ( key.equals(keys[i]) ) {
index = i;
break;
}
}
if ( index != -1 ) {
v = datas[index];
}
return v;
}
int findMyIndex(Object key){
int index = -1;
for(int i = 0; i < size; i++){
if(key.equals(keys[i])){
index = i;
break;
}
}
return index;
}
}
Java
복사
Java Interface
class 사람 implements 변호사, 의사{
public void 변호하다(){
System.out.println("사람이 변호");
}
public void 진찰하다(){
System.out.println("사람이 진찰");
}
}
class 오랑우탄 implements 변호사, 의사{
public void 변호하다(){
System.out.println("오랑우탄이 변호");
}
public void 진찰하다(){
System.out.println("오랑우탄이 진찰");
}
}
interface 변호사{
void 변호하다();
}
interface 의사{
void 진찰하다();
}
Java
복사