UpCasting은 왜 할까?

Walker·2021년 3월 23일
2

OOP

목록 보기
1/3
post-thumbnail
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의 경우도 위와 같이 arrayListlinkedList
한 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를 사용 가능하다.

profile
I walk slowly, but I never walk backward. -Abraham Lincoln-

1개의 댓글

comment-user-thumbnail
2021년 5월 13일

잘 보고 갑니다 ^^

답글 달기