List list = new ArrayList();
Java를 처음 배울 때 List 선언은 위와 같이
UpCasting(상위 클래스나 인터페이스로 타입을 지정)으로 하는 것이 좋으며
그 이유는 다형성을 통해 좀 더 유연하게 활용 할 수 있기 때문이라고 배웠다.
그런데 어느 순간부터 정확한 이유는 잊어버리고 습관처럼 위 코드를 쓰고 있었다.
1) List list = new List();
2) ArrayList arrayList = new ArrayList();
1), 2) 처럼 사용하는 것은 왜 지양될까?
List는 interface
먼저 1)은 컴파일 에러부터 발생하여 사용이 불가능하다.
List는 Interface이기 때문에 구현부나 생성자가 없어
Instance로 만들어질 수 없기 때문이다.
2)의 경우는 컴파일이나 런타임 모두 문제 없이 사용 가능하다.
그러나 맨 위 코드보다는 유연한 활용이 어렵다.
왜 그러한지 아래 코드로 나타내보았다.
SoccerBall soccerBall = new SoccerBall();
BasketBall basketBall = new BasketBall();
BaseBall baseBall = new BaseBall();
int point = 0;
public void getPoint(SoccerBall soccerBall) {
point++;
}
public void getPoint(BasketBall basketBall) {
point++;
}
public void getPoint(BaseBall baseBall) {
point++;
}
getPoint(soccerBall);
getPoint(basketBall);
getPoint(baseBall);
System.out.println("획득한 점수는 "+ point+"점 입니다");
극단적인 예이긴 하나 Overloading을 활용해 위와 같이 쓰는 것도 가능하다.
그러나 딱 보기에도 너무나 비효율적인 코드다.
같은 메소드가 Parameter의 Type이 다르다는 이유로 중복되고 있다.
만약 위의 ...Ball 클래스가
상위 클래스 Ball을 extends하거나
Interface Ball을 implements한다면?
Ball soccerBall = new SoccerBall();
Ball basketBall = new BasketBall();
Ball baseBall = new BaseBall();
int point = 0;
public void getPoint(Ball ball) {
point++;
}
getPoint(soccerBall);
getPoint(basketBall);
getPoint(baseBall);
System.out.println("획득한 점수는 "+ point+"점 입니다");
위와 같이 UpCasting하면
한 메소드로도 처리가 가능해진다.
List arrayList = new ArrayList();
List linkedList = new LinkedList();
readList(arrayList);
readList(linkedList);
public void readList(List list) {
list.stream().forEach(System.out::println);
}
List의 경우도 위와 같이 arrayList와 linkedList가
한 Type인 List로 선언되어 활용 될 수 있는 것이다.
List arrayList = new ArrayList();
List linkedList = new LinkedList();
Map<String, List> mapList = new HashMap<>();
mapList.put("arrayList",arrayList);
mapList.put("linkedList",arrayList);
또한 위와 같이 제네릭의 Type에도 유용하게 활용 가능하다.
+) JDBC도 이와 같은 UpCasting을 활용
Connection connection = new MySQLConnection;
= new OracleConnection;
= new MsSQLConnection;
등등...
JDBC의 경우도 List와 비슷하게 Connection을 Interface로 활용하는데
덕분에 위와 같이 한 Type으로 통일성 있게 다양한 DBMS의 instance를 사용 가능하다.
잘 보고 갑니다 ^^