본문 바로가기

프로그래밍/Java 프로그래밍

자바 프로그램 예제 - 로또 프로그램

지금까지 많은 개념과 문법을 배웠습니다. 아직 다 배우지는 못했지만 너무 이론적인 얘기를 많이 했으니까 오늘은 실질적인 문제를 푸는 법에 대해 얘기를 해보겠습니다. 지금 작성하려는 프로그램은 로또 프로그램입니다. 로또를 살때 자동으로 달라고 하면 기계가 자동으로 로또 숫자를 작성해서 줍니다. 요즘에 보면 로또 숫자를 뽑아내는 사이트들이 있습니다. 이런 사이트들은 자기들이 특별한 공식을 사용해서 확률이 높다고 말합니다. 하지만 많은 회원들이 있고 오랫동안 많은 숫자를 제공하다보면 당첨이 되는 경우도 있을 것이고 그걸로 자기들 사이트를 홍보할 수가 있을 것입니다. 이런 사이트들이 어떤 알고리즘을 사용하는지 제가 알지는 못하지만 저도 이런 사이트들을 이용해봤지만 소득은 없었습니다. 그래서 간단히 만들 수 있는 프로그램을 작성해보도록 하겠습니다. 프로그램은 굉장히 많은 방식으로 작성될 수 있습니다. 같은 결과를 도출하더라고 프로그램은 상당히 많은 방식으로 짜여질 수 있습니다. 어떤 것은 조금 더 효율적이고 어떤 것은 조금 더 가독성이 좋을 수 있습니다. 하지만 정답이라는 것은 없습니다. 약간 좋은 프로그램과 나쁜 프로그램으로 나뉠 수는 있지만 아주 비효율적이고 읽기 어렵지만 않다면 특별한 문제는 없습니다.


일단 로또 프로그램을 위해 기본적인 설계를 하겠습니다. 일단 필드를 정의해야합니다. 로또는 여섯가지 숫자로 이루어집니다. 그렇기때문에 여섯개의 숫자를 보관할 수 있는 필드가 필요합니다. 여기서는 여섯개의 변수를 둘 수도 있고 배열을 둘 수도 있고 뒤에서 배우게 될 Collection을 이용할 수도 있습니다. 우리는 인터넷을 사용할 수 있고 요즘은 인터넷을 얼마나 잘 이용하느냐가 프로그램의 성패를 좌우할 수도 있습니다. 그래서 Collection 중에서 ArrayList와 HashSet을 골라 보았습니다. 일단 여섯개의 변수를 정의하는 것은 매우 비효율적인 방법이라 제외시켰습니다.


1. 길이가 6인 배열을 정의

2. 길이가 6인 ArrayList 정의

3. 길이가 6인 HashSet 정의



배열


배열은 같은 유형의 여러개의 변수를 정의할 때 사용합니다. 여기서는 int형의 6개 배열을 정의할 수 있습니다. int lotto[6]으로 정의할 수 있을 것입니다. 여기에 랜덤숫자를 여섯번 뽑아서 저장할 수 있습니다. 하지만 중복이 되면 안되기때문에 랜덤숫자가 나올 때마다 기존에 저장해두었던 숫자와 비교를 해야 합니다. 이렇게 되면 기존에 몇가지 숫자를 저장했는지를 알아야하고 그만큼 루프를 돌면서 숫자가 같은지 확인해야 합니다. 이것은 충분히 가능한 얘기지만 생각을 많이 해야합니다. 자바에서는 단순한 배열이 아닌 컬렉션을 제공하고 있고 여기에 많은 메소드가 있어서 우리가 직접 어려운 코딩을 할 필요가 없습니다. 단순히 제공된 API를 사용해서 쉽게 프로그램을 작성할 수 있습니다. 여기서는 ArrayList와 HashSet을 살펴보도록 하겠습니다.



ArrayList


ArrayList는 배열의 좀 더 발전된 형태라고 보시면 됩니다. 배열은 크기를 늘이거나 줄일 수 없는데 반해 ArrayList는 크기를 조절할 수 있습니다. 그리고 여러가지 메소드를 제공해서 쉽게 프로그램할 수 있도록 도와줍니다. 그럼 ArrayList를 사용한 프로그램을 보면서 살펴보도록 하겠습니다.



처음에 ArrayList를 정수형으로 선언하고 랜덤숫자를 구합니다. 숫자는 1부터 45까지의 정수입니다. 여기서 우리는 random()이라는 메소드를 사용했습니다. 이 메소드는 Math라는 클래스에 있기때문에 Math.random()이라고 사용하였습니다. 이 메소드는 0보다 크거나 같고 1보다 작은 숫자를 생성합니다. 그렇기때문에 45를 곱하게 되면 0부터 45보다 작은 실수의 숫자가 나오게 됩니다. 우리는 1부터 45까지의 숫자를 원하기때문에 여기에 1을 더하게 되면 1보다 크거나 같고 45보다 작은 실수를 구하게 됩니다. 이것을 정수형으로 강제변환시키면 우리가 원하는 1부터 45까지의 임의의 숫자가 나오게 됩니다. 이 나온 숫자를 ArrayList에 차례로 저장해야 하는데 size()라는 메소드를 사용해서 실제길이를 알아 낼 수 있습니다. size()가 0이라면 아무것도 없다는 뜻이므로 무조건 저장을 하면 됩니다. 이것이 add()입니다. 길이가 0이 아니라면 기존에 숫자가 저장되어있다는 뜻입니다. 그렇다면 randNo의 숫자가 기존에 존재하는지 contains() 메소드를 사용해서 알아보고 존재하지 않는다면 저장하면 됩니다. 이 같은 것은 길이가 6일 될때까지 반복하면 됩니다. 길이가 6이라는 이야기는 6개의 숫자를 모두 가지고 있다는 뜻이 됩니다.



HashSet


HashSet은 Set 컬렉션 중의 하나입니다. 나중에 컬렉션에서 배우겠지만 Set은 수학은 Set(집합)과 같습니다. 중복을 허용하지 않는 숫자들의 모임입니다. 중복을 허용하지 않기때문에 ArrayList처럼 기존에 있는지 확인하는 절차가 필요없습니다.




이번에는 HashSet을 이용했기 때문에 프로그램이 좀 더 간결해졌습니다. 단순히 임의의 숫자를 추출해서 add()를 합니다. HashSet은 중복을 허용하지 않기때문에 ArrayList와 같이 기존에 존재하는지 비교하는 것이 불필요합니다. add()메소드는 중복이 발생하면 추가를 하지 않습니다. 그래서 위와 같이 단순히 add()를 길이가 6이될때까지 합니다.


위에서 2가지 타입으로 프로그램을 작성해 보았습니다. 물론 배열을 사용해도 되지만 많이 복잡해질 뿐 아니라 자바에서 제공하는 API를 사용하는 것이 앞으로도 프로그램을 사용하는데 많이 도움이 될 뿐아니라 지향해야하는 방향이기때문에 ArrayList와 HashSet을 사용해보았습니다. 여러분이 다른 방식을 사용할 수도 있습니다. 여러분이 좀 더 나은 방향을 제시했을 수도 있습니다. 제 프로그램은 참고하시고 자신이 짠 프로그램과 비교해보시기 바랍니다.