본문 바로가기

Language & Framework/Java

자바 매개변수의 다형성 활용 예제 + ArrayList를 활용한 동적 배열 생성하기

 

Product라는 클래스를 상속 받은 TV, 컴퓨터, 맥북 클래스를 만들었다.

Person이라는 클래스를 만들어 buy()라는 메서드를 만들어줄 것인데 이 메서드는 매개변수로 해당 제품에 대한 클래스를 받는 메서드이다.

각각의 제품마다 타입이 다르기 때문에 이를 구현하려면 buy(Computer computer), buy(Macbook macbook), buy(TV tv) 이렇게 3개의 메서드를 만들어줘야 한다. 게다가 제품이 늘어나면 늘어날 때마다 제품을 추가해주어야 한다.

이런 불상사를 막으려면 다형성을 활용해야 한다.

 

 

 

Person의 buy 메서드는 Product 타입을 매개변수로 받는다.

그리고 코드를 두 번 적기 귀찮아서 이미 위에서도 각 클래스에 this가 아닌 super로 각각의 price를 이미 지정해줬다.

 

 

 

각 클래스의 타입을 부모 타입인 Product로 정해주고 person.buy에 각각 매개변수로 넣어주니 정확히 우리가 원하던 방식으로 동작하고 있다.

그러나 뭔가 허전하다. 지금까지 구매한 제품의 목록을 체크해주는 메서드도 만들어보자.

그러려면 멤버 변수로 배열을 생성해놓고 구매할 때마다 배열에 product를 넣어주면 되는데, 문제는 자바의 기본 배열은 초기 설정한 크기만큼만 요소를 넣을 수 있기 때문에 체크할 수 있는 제품의 개수에 한계가 있다는 것이다.

이럴 때 ArrayList를 사용하면 된다. (doc:https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html)

ArrayList는 배열이 가득차면 초기에 설정한 배열 크기의 50%씩 크기가 증가한다.

헉 이렇게 편리한데 기본 배열을 왜 쓰나요? 그냥 무조건 ArrayList를 쓰면 안되나요?

세상이 호락호락하지 않다. 그러면 참 좋았을 텐데 아쉽게도 ArrayList는 기본 배열과 달리 중간에 배열 인덱스가 삭제되면 모두 앞으로 이동해서 인덱스에 빈자리가 없도록 채워버린다. 따라서 용도에 맞게 사용하도록 하자.

 

 

크게 달라진 것은 없고 shoppingList라는 ArrayList를 생성했으며 buy 메서드가 작동할 때 shoppingList의 add 메서드를 사용해서 배열에 각 인스턴스를 넣어줬다.

 

contains(obj)는 obj가 ArrayList 안에 존재하는지 체크하는 메서드이고 Boolean을 반환하기 때문에 조건문으로 사용 가능하다.

또한 remove(obj)라는 편리한 메서드를 가지고 있기 때문에 반복문 같은 것도 필요 없다.

 

ArrayList.toArray()는 ArrayList안에 있는 모든 요소를 배열로써 반환한다.

ArrayList.size()는 배열 안에 있는 요소의 총 개수를 반환한다.

반복문을 한 번도 사용하지 않고 모두 해결하고 싶었지만 아쉽게도 total은 forEach문을 사용해서 구하게 되었다.

이제 결과를 확인해보자.

 

 

원하던대로 모두 작동하고 있다. 끝!