InstanceStaticClass obj = new InstanceStaticClass();
obj.method1();
//다른 클래스의 스태틱 멤버 접근
InstanceStaticClass.method3();
//인스턴스 멤버
/*Scanner sc = new Scanner(System.in);
sc.next();
Random rd = new Random();
rd.nextInt(10);*/
//스태틱 멤버
/*int[] arr = new int[10];
Arrays.sort(arr);*/
}
}
스태틱 멤버에서 값 공유 테스트
//Share.java
package com.test;
public class Share {
// 인스턴스 멤버
private int a;
//스태틱 멤버
private static int b;
public void addA(int c) {
a+=c;
}
public static void addB(int c) {
b+=c;
}
public int getA() {
return a;
}
public static int getB() {
return b;
}
public int getC() {
return a*getB();
}
}
//Class13.java
package com.test;
public class Class13 {
public static void main(String[] args) {
Share obj1 = new Share();
Share obj2 = new Share();
obj1.addA(10); // 10
Share.addB(10); // 10
// obj1.addB(10); // 10+10 (가능은 하나 권장하지 않음)
obj2.addA(20); // 20
Share.addB(20); // 10+10+20
// obj2.addB(20); // 10+10+20+20 (가능은 하나 권장하지 않음)
System.out.println(obj1.getA()); // 10
System.out.println(obj1.getC()); // 10*30 = 300
System.out.println(obj2.getA()); // 20
System.out.println(obj2.getC()); // 20*30 = 600
System.out.println(Share.getB()); // 30
}
}
문제) 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력. 클래스 이용. 판정 기준은 합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상. 과락 -> 과목중 40점 미만이 있고, 평균이 60이상. 불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인. 평균이 60점 이하 -> 불합격
실행 예) 국어(0~100)?XX 영어(0~100)?YY 수학(0~100)?ZZ
입력받은 점수 : 국어 xx점, 영어 xx점, 수학 xx점 총점: xxxx 평균: xxx.x 판정: 합격
//자료 처리 전용 클래스 -> Score.java
package com.test;
public class Score {
private int kor, eng, mat;
private int total; //총점 전용 멤버변수
private double ave; //평균 전용 멤버변수
private String grade;//판정 전용 멤버변수
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMat() {
return mat;
}
public void setMat(int mat) {
this.mat = mat;
}
public int getTotal() { //총점을 계산해서 리턴하는 메소드 구현
total = this.kor + this.eng + this.mat; //총점공식
return total;
}
public double getAve() { //평균을 계산해서 리턴하는 메소드 구현
ave = getTotal() / 3.0; // 평균 공식
return ave;
}
public String getGrade() { //판정을 계산해서 리턴하는 메소드 구현
grade = "불합격";
if (getAve()>=60) {//판정공식
if (kor>=40 && eng>=40 && mat>=40) {
grade = "합격";
} else {
grade = "과락";
}
}
return grade;
}
}
//Class14.java
package com.test;
import java.util.*;
public class Class14 {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
System.out.print("국어(0~100)?");
int kor = sc.nextInt();
System.out.print("영어(0~100)?");
int eng = sc.nextInt();
System.out.print("수학(0~100)?");
int mat = sc.nextInt();
//처리
//1단계. Score 객체 생성
Score obj = new Score();
//2단계. kor, eng, mat 점수를 setter를 통해서 전달.
//Score 객체의 kor, eng, mat 멤버변수에 저장
obj.setKor(kor);
obj.setEng(eng);
obj.setMat(mat);
//3단계. 총점, 평균, 판정 결과를 리턴받음.
//getTotal(), getAve(), getGrade() 메소드 호출
int total = obj.getTotal();
double ave = obj.getAve();
String msg = obj.getGrade();
//출력
System.out.printf("입력받은 점수 : 국어 %d점, 영어 %d점, 수학 %d점%n", kor, eng, mat);
System.out.printf("총점: %d%n", total);
System.out.printf("평균: %.1f%n", ave);
System.out.printf("판정: %s%n", msg);
}
}
문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정 결과 출력. 클래스 이용. 판정 기준은 합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상. 과락 -> 과목중 40점 미만이 있고, 평균이 60이상. 불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인. 평균이 60점 이하 -> 불합격
실행 예) 인원수 입력(1~10)?2 성적 입력(이름 국어 영어 수학)?hong 100 100 100 성적 입력(이름 국어 영어 수학)?kim 80 90 80 ------------------------------------------ 이름 국어 영어 수학 총점 평균 판정 ------------------------------------------ hong 100 100 100 300 100.0 합격 kim 80 90 80 .. .. 합격 ------------------------------------------
인원수 입력(1~10)?3 성적 입력(이름 국어 영어 수학)?park 84 65 78 성적 입력(이름 국어 영어 수학)?kim 39 85 100 성적 입력(이름 국어 영어 수학)?hong 39 21 41 ------------------------------------------ 전체 회원수: 3 명 ------------------------------------------ 이름 국어 영어 수학 총점 평균 판정 ------------------------------------------ park 84 65 78 227 75.7 합격 kim 39 85 100 224 74.7 과락 hong 39 21 41 101 33.7 불합격 ------------------------------------------
문제) 여러명의 국,영,수 점수를 입력 받아서 총점, 평균, 판정, 등수 결과 출력. 클래스 이용. 판정 기준은 합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상. 과락 -> 과목중 40점 미만이 있고, 평균이 60이상. 불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 또는 과락 -> 국영수 점수가 모두 40점 이상인지 확인. 평균이 60점 이하 -> 불합격
실행 예) 인원수 입력(1~10)?2 성적 입력(이름 국어 영어 수학)?hong 100 100 100 성적 입력(이름 국어 영어 수학)?kim 80 90 80 ------------------------------------------------- 이름 국어 영어 수학 총점 평균 판정 등수 ------------------------------------------------- hong 100 100 100 300 100.0 합격 1등 kim 80 90 80 .. .. 합격 10등 -------------------------------------------------
문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서 총점, 평균, 판정, 등수, 과목별 판정 결과 출력. 배열, 클래스 이용.
판정 기준은 합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상 과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상 불합격 -> 평균이 60점 미만
평균이 60점 이상 -> 합격 평균이 60점 미만 -> 불합격
합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.
과목별 판정 기준은 90점 이상은 A 80점 이상은 B 70점 이상은 C 60점 이상은 D 60점 미만은 F
실행 예) 인원수 입력(1~10)?2 성적 입력(이름 국어 영어 수학)?hong 100 100 100 성적 입력(이름 국어 영어 수학)?kim 80 90 80 ----------------------------------------- 이름 국어 영어 수학 총점 평균 판정 등수 ----------------------------------------- hong 100(A) 100(A) 100(A) 300 100.0 합격 1 kim 80(B) 90(A) 80(B) .. .. 합격 2 -----------------------------------------
- 유저가 자료를 임의로 입력할때 setter 를 이용하여 클래스 자료형 배열에 객체를 저장.
- 클래스 자료형 배열 내에 getter를 이용하여 객체n번째에 저장된 자료를 출력
클래스, 객체, 인스턴스
1. 클래스의 객체에 원본 정의서.
2. 객체(instance)는 클래스가 실행되서 메모리에 적재된 상태를 말함. 클래스(원본) -> 객체1 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터 -> 객체2 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터 -> 객체3 -> 독립적인 상태 유지 -> 소멸 -> 가비지 컬렉터
/* public int m500(int data) { int result = 0; result = data / 500; return result; } public int m100(int data) { int result = 0; result = data / 100; return result; } public int m50(int data) { int result = 0; result = data / 50; return result; } public int m10(int data) { int result = 0; result = data / 10; return result; }*/
public int moneyChange(int data, int unit) { int result = 0; result = data / unit; return result; } }
//Class03.java (main()메소드가 있는 클래스)
package com.test; import java.util.*;
public class Class03 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("금액(10~1000)?"); int money = sc.nextInt(); int data = money;
//특정 숫자를 반복해서 곱하기 연산하는 메소드 구현 public int sqrt(int data, int digit) { int result = 1; for (int a=1; a<=digit; a++) { result *= data; //1*10*10*10*... } return result; }
//특정 자리의 수를 리턴하는 메소드 구현 public int number(int data, int digit) { int result = 0; result = data / digit; //정수 / 정수 -> 몫 return result; } }
//Class04.java(main()메소드가 있는 클래스)
package com.test; import java.util.Scanner;
public class Class04 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자 입력(2자리 이상)?"); String num = sc.next(); //문자열 형태로 입력 받는다.
//처리 int size = num.length(); //문자열 길이를 리턴. Calc obj = new Calc(); int digit = obj.sqrt(10, size-1); //10, 100, 1000, 10000, ... 등의 값 리턴. int data = Integer.parseInt(num); int[] arr = new int[size]; for (int a=0; a<arr.length; a++) { //1234, 1000 -> 1 -> a[0] //234, 100 -> 2 -> a[1] //34, 10 -> 3 -> a[2] //4, 1 -> 4 -> a[3] arr[a] = obj.number(data, digit); data%=digit; digit/=10; }
int sum = 0; for (int a=0; a<arr.length; a++) { sum += arr[a]; }
문제) 2자리 이상의 수를 입력 받아서 자릿수들의 합을 계산해서 출력. 클래스 이용. 문자열을 한 글자씩 분리하는 방법으로 해결 실행 예) 숫자 입력(2자리 이상)?1234 1000자리의 수 -> 1 100자리의 수 -> 2 10자리의 수 -> 3 1자리의 수 -> 4 자릿수의 합 : 10
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//특정 숫자를 반복해서 곱하기 연산하는 메소드 구현 public int sqrt(int data, int digit) { int result = 1; for (int a=1; a<=digit; a++) { result *= data; //1*10*10*10*... } return result; }
//특정 자리의 수를 리턴하는 메소드 구현 public int number(int data, int digit) { int result = 0; result = data / digit; //정수 / 정수 -> 몫 return result; } }
//Class05.java
package com.test; import java.util.Scanner;
public class Class05 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자 입력(2자리 이상)?"); String num = sc.next(); //문자열 형태로 입력 받는다.
//처리 int size = num.length(); //문자열 길이를 리턴. Calc obj = new Calc(); int[] arr = new int[size]; for (int a=0; a<arr.length; a++) { // 문자열에서 substring(첫순서, 마지막순서) 기본지원 메소드를 이용해 하나씩 떼와서 // Integer 클래스로 형변환 한 후 배열에 넣는다. arr[a] = Integer.parseInt(num.substring(a, a+1)); }
int sum = 0; for (int a=0; a<arr.length; a++) { sum += arr[a]; }
문제) 세 개의 숫자 중에서 가장 큰 숫자 구하기. 사용자 정의 클래스 이용. sort() 메소드 금지 실행 예) 숫자1? X 숫자2? Y 숫자3? Z 입력 받은 숫자: X, Y, Z가장 큰 숫자: X
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//세개의 숫자중 가장 큰 숫자를 리턴하는 메소드 구현 public int max(int num1, int num2, int num3) { int result = 0; int data = (num1 >= num2)? num1 : num2; result = (data >= num3)? data : num3; return result; } }
//Class06.java (main()메소드 포함 클래스)
package com.test; import java.util.*;
public class Class06 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("숫자1? "); int num1 = sc.nextInt(); System.out.print("숫자2? "); int num2 = sc.nextInt(); System.out.print("숫자3? "); int num3 = sc.nextInt();
//처리 Calc obj = new Calc(); int max = obj.max(num1, num2, num3);
//출력 System.out.printf("입력 받은 숫자: %d, %d, %d%n", num1, num2, num3); System.out.printf("가장 큰 숫자: %d", max); } }
문제) 여러 개의 숫자 중에서 가장 큰 숫자 구하기. 배열 및 사용자 정의 클래스 이용. sort() 메소드 금지 실행 예) 입력할 숫자의 갯수 지정(2~10)? 숫자1? X 숫자2? Y 숫자3? Z ... 입력 받은 숫자: X, Y, Z, ..... 가장 큰 숫자: X
//Calc.java (사용자 정의 클래스)
package com.test; public class Calc {
//여러개의 숫자(배열1개가져옴)중 가장 큰 숫자를 리턴하는 메소드 구현 public int maxArray(int[] arr) { int result = 0; int temp = 0; for(int a=0; a<arr.length-1; a++){ if (arr[a] >= arr[a+1]) { temp = arr[a]; arr[a] = arr[a+1]; arr[a+1] = temp; } } result = arr[arr.length-1]; return result; } }
//Class07
package com.test; import java.util.*;
public class Class07 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("입력할 숫자의 갯수 지정(2~10)?"); int size = sc.nextInt();
//배열 생성 int[] arr = new int[size];
//생성된 배열에 각 숫자를 넣기 for (int a=0; a<arr.length; a++) { System.out.printf("숫자%d?", a+1); arr[a] = sc.nextInt(); }
//처리 Calc obj = new Calc(); int max = obj.maxArray(arr);
//출력 System.out.print("입력 받은 숫자: "); for (int a=0; a<arr.length; a++) { if (a == arr.length-1) { System.out.printf("%d%n", arr[a]); } else { System.out.printf("%d ,", arr[a]); } } System.out.printf("가장 큰 숫자: %d", max); } }
접근 지정자
1. public, private, protected, default(표시하지 않는 상태)
4. public 지정시 -> 어떤 위치에서든지 접근 가능. private 지정시 -> 해당 영역 안에서만 접근 가능. protected 지정시 -> 상속 관계가 있는 클래스에서만 접근 가능. default 지정시(아무것도 안썼을때) -> 같은 패키지 내에서만 접근 가능.
Class08_02 -> [각주:1](같은 패키지에 소속되어 있는 상태) Class08_3 -> [각주:2](다른 패키지에 소속되어 있는 상태) Class08_4 -> [각주:3](다른 패키지에 소속되어 있는 상태)
package com.test; import com.exam.Class08_4; // 다른 패키지에 있는 클래스를 import 구문으로 인식시킴.
public class Class08_1 { public static void main(String[] args) {
//다른 클래스에 존재하는 멤버 접근 //-> 해당 클래스의 객체 생성 과정 필요 //-> 해당 멤버 접근 시도 //-> 접근지정자가 public이 아니면 접근 불가 Class08_2 obj = new Class08_2(); obj.method1(); //성공 obj.method2(); //성공 // obj.method3(); //실패
//다른 패키지에 있는 다른 클래스의 멤버 접근 //->다른 패키지에 있는 경우는 클래스의 소속(패키지명) 확인. //-> 해당 클래스의 객체 생성 과정 필요 //-> 해당 멤버 접근 시도 //-> 접근지정자가 public이 아니면 접근 불가 com.sample.Class08_3 test = new com.sample.Class08_3(); test.method1(); //성공 //test.method2(); //실패 //test.method3(); //실패
//다른 패키지에 있는 다른 클래스의 멤버 접근 //-> 다른 패키지에 있는 클래스를 자주 참조한다면 //해당 패키지명을 import 구문에 표시 //-> import 구문 자동 추가 Ctrl+Shift+M Class08_4 exam = new Class08_4(); exam.method1(); //성공 //exam.method2(); //실패 //exam.method3(); //실패 exam.method4(); //성공 -> method3() 호출역할 } }
이름과 전화번호를 저장할 수 있는 자료형 만들기 실행 예) 회원 수(1~10)?3 이름 전화번호(1)? hong 111-1111 이름 전화번호(2)? kim 222-2222 이름 전화번호(3)? park 333-3333 ---------------- 전체 회원수: 3명 ---------------- 이름 전화번호 hong 111-1111 kim 222-2222 park 333-3333 ----------------
//Member.java (사용자 정의 클래스)
package com.test;
public class Member {
private String name, tel;
public String getName() { return name; } public void setName(String name) { this.name = name; }
public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } }
//Class11.java (main() 메소드 포함 클래스)
package com.test;
import java.util.*;
public class Class11 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("회원수 입력(1~10)?"); String num = sc.next(); int count = Integer.parseInt(num);
//이름및 전화번호 자료형 클래스 활성화 및 저장용 배열 생성 //아래에서 사용된 Member는 사용자 정의 클래스 자료형(참조형)을 의미한다. //배열의 자료형 선언은 String, int, 참조형등 여러 자료형 선언이 가능하고, //배열 자체가 for문등 사용자 임의의 수를 기반으로 데이터를 운용하기에 //매우 적합하기 때문에 이 예제에서 클래스 자료형 배열을 생성한 것이다.
Member[] members = new Member[count]; // 사용자 정의 클래스 자료형인 배열을 생성
//처리
for (int a=0; a<members.length; a++) { System.out.printf("이름:전화번호(%d)?", (a+1)); String name = sc.next(); //이름 String tel = sc.next(); //전화번호
Member member = new Member(); // member 객체 생성 과정 member.setName(name); //member 객체에 이름 저장(바로 윗줄에서 생성한 객체이름) member.setTel(tel); //member 객체에 전화번호 저장 members[a] = member; //member 객체를 배열에 저장하는 과정
//members[a]는 Member 객체를 리턴할 뿐이다. //name, tel 접근을 하려면 Member 객체에서 gerName(), gerTel()을 이용해야 한다. // System.out.printf("%s %s %n", members[a]); 일케하면 members[a]는 자동으로 이름과 전화번호를 뿌려주지 않는다.
//캐스트 연산자 Member 유의. 추후 캐스트 연산자를 이런식으로 사용할 수 있는 케이스가 있다. //현재 예제에서는 캐스트 연산자를 사용하지 않아도 된다.
//members[a] 에는 name 과 tel 이라는 두 저장공간이 있다. //출력단에서 출력할때에 members[a]라고만 기재할 경우 출력되지 않으며, //(배열명).사용자정의클래스내메소드명() 형식으로 기재해야한다. //즉, (members[a]).getName() System.out.printf("%s %s %n", ((Member)members[a]).getName(), ((Member)members[a]).getTel()); }
1. 1년 1월 1일부터 전년도 12월 31일까지의 총 날짜수 구함. int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400);
2. 해당년도 1월 1일부터 해당년도 해당월 1일까지의 총 날짜수 구함. int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int a=0; a<month-1; a++) { total += m[a]; } //해당월 1일 때문에 +1 total++; //올해가 윤년이면서 2월 이상인 경우 +1 if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) { total++; }
3. 해당년도 해당월의 첫 날(1일)의 요일(일, 월, 화, 수, 목, 금, 토) 구함. String[] d = {"일", "월", "화", "수", "목", "금", "토"}; int days = total % 7; System.out.printf("%s요일 %n", d[days]);
4. 콘솔버전에서 날짜를 달력 형태로 출력.
package com.test; import java.util.Scanner;
public class Sample37 { public static void main(String[] args) {
//입력 Scanner sc = new Scanner(System.in); System.out.print("년도?"); int year = sc.nextInt(); System.out.print("월?"); int month = sc.nextInt();
//처리 int total = (year-1)*365 + ((year-1)/4 - (year-1)/100 + (year-1)/400); int[] m = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; for (int a=0; a<month-1; a++) { total += m[a]; }
//올해가 윤년이면서 2월 이상인 경우 +1 if (month>=3 && (year%4==0 && year%100!=0 || year%400==0)) { total++; }
//특정 일까지의 날짜수 더하기 total += 1;
//요일 계산 int week = total%7; //0 일요일, 1 월요일, 2 화요일, ...
//해당 월의 마지막 날짜 구하기 int lastDay = m[month-1]; if (month==2 && (year%4==0 && year%100!=0 || year%400==0)) { lastDay = 29; }
//출력 (year, month, week, lastDay) StringBuilder sb = new StringBuilder(); sb.append(String.format("----- %d년 %d월 ----- %n", year, month)); sb.append(String.format(" 일 월 화 수 목 금 토%n")); for (int count=1; count<=week; count++) { sb.append(String.format("%3s", "")); } for (int day=1; day<=lastDay; day++) { sb.append(String.format("%3d", day)); if ((day+week)%7 == 0) { sb.append(String.format("%n")); } } System.out.println(sb.toString()); } }
난수 발생
1. 0 부터 1 사이의 무작위 숫자를 난수라고 함.
2. Random 클래스의 nextInt() 메소드를 이용하면 쉽게 난수를 얻을 수 있다.
import java.util.*; Random rd = new Random();
int val = rd.nextInt(100); //0 보다 크거나 같고 100 보다는 작은 난수
예를 들어, 로또번호는 1~45까지만 존재. rd.nextInt(45) + 1 라고 계산함. 난수를 여러개 발생시키고, 배열에 저장한 다음, 난수 출력. 1~45 범위의 숫자 6개.
package com.test; import java.util.*; //Random, Arrays public class Sample38 { public static void main(String[] args) {
//입력 int count = 6;
//처리 int[] arr = new int[count]; Random rd = new Random();
문제) 여러개의 난수를 발생시키고, 난수들 중에서 가장 큰 값과 가장 작은 값을 별도 출력. 난수 허용 범위는 1~100. 배열 이용. 실행 예) 난수 갯수(2~20)?5 난수 결과 : 55 9 12 6 90 가장 큰 값 : 90 가장 작은 값 : 6
package com.test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Sample39 {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
System.out.print("난수 갯수(2~20)?");
int count = sc.nextInt();
//처리
int[] arr = new int[count];
Random rd = new Random();
for (int a=0; a<count; a++) {
arr[a] = rd.nextInt(45) + 1;
}
StringBuilder sb = new StringBuilder();
sb.append(String.format("난수 결과 : "));
for (int a=0; a<arr.length; a++) {
sb.append(String.format("%d ", arr[a]));
}
sb.append(String.format("%n"));
Arrays.sort(arr);
sb.append(String.format("가장 큰 값 : %d %n", arr[arr.length-1]));
sb.append(String.format("가장 작은 값 : %d %n", arr[0]));
//출력
System.out.println(sb.toString());
}
}
중복되지 않은 난수 얻기 (1~100)_방법1 실행 예) 난수 갯수(2~20)? 5 난수 결과 : 3 4 5 10 12
//중복되는 경우
int size=5; int count=0; int[] arr = new int[size]; Random rd = new Random(); while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복) int random = rd.nextInt(100) + 1; arr[count] = random; count++; if (count == size) { break; } }
//중복되지 않은 경우
int size=5; int count=0; int[] arr = new int[size]; Random rd = new Random();
while(true) { //무한실행 (특정 갯수의 난수를 얻을때까지 반복) int random = 0; boolean check = false;
do { check = false; random = rd.nextInt(100) + 1; for (int a=0; a<count; a++) { if (arr[a] == random) { check = true; } } }while(check); //무한실행 (중복되지 않는 경우만 배열에 저장)
중복되지 않은 난수 얻기 (1~100)_방법2 실행 예) 난수 갯수(2~20)? 5 난수 결과 : 3 4 5 10 12
package com.test;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class Sample41 {
public static void main(String[] args) {
//입력
Scanner sc = new Scanner(System.in);
System.out.print("난수 갯수(2~20)?");
int size = sc.nextInt();
//처리
int count = 100;
int[] arr = new int[count];
for (int a=0; a<arr.length; a++) {
arr[a] = a+1;
}
Random rd = new Random();
for (int a=0; a<arr.length; a++) {
//섞는다
int r = rd.nextInt(count); //0~(count-1)
int temp = arr[0];
arr[0] = arr[r];
arr[r] = temp;
}
int[] random = new int[size];
for (int a=0; a<size; a++) {
random[a] = arr[a];
}
//출력
Arrays.sort(random);
System.out.print("난수 결과 : ");
for (int a=0; a<random.length; a++) {
System.out.printf("%d ", random[a]);
}
System.out.println();
}
}
문제) 로또 번호를 원하는 장수 만큼 출력. 로또 번호는 1~45 범위의 숫자를 중복되지 않은 상태에서 6개가 되면 1장에 해당. 실행 예) 로또 장수(1~20)?3 번호1 : 1 12 13 34 35 36 번호2 : 12 20 25 30 39 45 번호3 : 1 4 9 20 30 42