[JAVA]
제네릭 - generic
•
데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미
•
제네릭을 쓰는 이유
◦
클래스나 메소드 내부에서 사용되는 객체의 타입 안정성을 높일 수 있다.
◦
반환값에 대한 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있다.
▪
배열을 만들때 배열에 여러 타입의 객체를 저장하고 싶어서 오브젝트로 지정해놓으면 꺼내올때 형을 지정해줘야된다. ex) System.out.println((Integer)list.get(1));
•
래퍼(wrapper) 클래스를 사용해야만 한다.
•
제네릭의 본질은 미완성 클래스이다. 사용할 때 완성시킨다. 새로운 클래스를 만든다고 보면된다.
•
List<Integer> list = new ArrayList<>(); - 새로운 제네릭 타입이 Integer인 리스트 클래스를 새로 만든다!
HashMap
•
선언 - Map<K, V> map = new HashMap<>();
•
유연성 - 알아서 늘어남.
•
사용 - map.put(”key”,value);
•
수정 - map.put(”key”,value2);
•
(V) data = map.get(”key”);
•
map.remove(”key”);
추상 클래스에서 추상 메서드와 구상 메서드 중 어떤게 많아야 좋을까?!
•
구상 - 이미 완성된 것.
•
추상 - 완성하지 못한 것.
•
추상이 많으면 자유도를 높인다. 보통 자유도가 낮은, 즉 완성된 메서드가 많은 추상 클래스를 더 좋은 클래스라고 한다.(추상 메서드가 있다는 것은 무조건 추상 클래스다.)
•
자유도를 높여서 써야될 때는 추상을 많이 쓰기도 한다.
인터페이스 - interface
•
그냥 클래스랑 똑같다. interface사람{}
•
추상성 100%.
•
인터페이스 안에 들어가는 모든 것은 다 추상이다. 즉 무조건 오버라이드 해서 사용.
•
private 사용 불가.
•
여러가지 인터페이스 같이 사용 가능.
class Main{
public static void main(String[] args) {
}
}
interface 사람 {
void 말하다();
void 걷다();
}
interface 군인 {
void 쏘다();
}
class 케로로 implements 사람, 군인 {
@Override
void 말하다(){}
@Override
void 걷다(){}
@Override
void 쏘다(){}
}
Java
복사
다중 상속은 왜 안될까?!
•
먼저 다중 상속의 폐해에 대해서 말해보자
◦
오리가 흰오리와 고무오리에게 수영하다를 상속해주었다.
◦
그리고 하이브리드 오리는 흰오리와 고무오리를 다중 상속 했다고 가정해보자.
◦
이 때 하이브리드 오리는 수영하다라는 메서드를 3개를 가진다.(오리, 흰오리, 고무오리)
◦
그럼 하이브리드 오리에게 하이브리드오리.수영하다() 를 했을때 하이브리드오리는 어떤 수영을 해야되는 것인가?!
•
물론 오버라이딩을 해주면 폐해를 막을 수 있다. 하지만 개발자들이 과연 무조건 오버리이딩을 할까? 이러한 경우를 막기위해 나온것이 인터페이스 이다. 무조건 오버라이딩을 해주어야 한다.