프로그래밍/자바(JAVA)

[복습] 3일차 복습 - 자바 기본(21일차 배열, 난수)

aSpring 2021. 1. 15. 00:38
728x90
728x90

2021/01/15 - [공부/자바(java) 융합개발자 2차(복습)] - [복습] 2일차 복습 - 자바 기본(for, while, do ~ while, 이중 for문)

2021/01/13 - [공부/자바(java) 융합개발자 2차(복습)] - [1일차] 복습 & 자바 기본 익히기(p.18~)


오늘 복습할 내용은 22일차 때 배운 내용들!

2021/01/14 - [공부/자바(java) 융합개발자 2차] - [자바 기초] 22일차 - 배열, 난수

2021/01/14 - [분류 전체보기] - [자바 기초] 22일차 2 - 클래스, 객체

 

 

com.day03 패키지 생성

Exam01.java 아래와 같이 출력되도록 하기 ??

ABCDEFGHI
ABCDEFGH
ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB
A

package com.day03;

public class Exam01 {

	public static void main(String[] args) {

		for (char j = 'J'; j > 'A'; j--) {
			for (char i = 'A'; i < j; i++) {
				System.out.print(i);
			}
			System.out.println();
		}
	}
}

ABCDEFGHI
ABCDEFGH
ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB
A

 

Exam02 몇 개 입력받을지 물어보고, 그 수만큼 숫자를 입력하여, 그 수들의 합계를 출력

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("몇 개를 입력하시겠습니까?");
		int gae = sc.nextInt();
		System.out.println(gae + "개의 수를 입력하세요");
		int i = 0;
		int sum = 0;
		
		while(i < gae) {
			sum += sc.nextInt();
			i++;
		}
		System.out.println(gae + "개의 수의 합 : " + sum);
	}
}

for를 써서도 해보기

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("몇 개를 입력하시겠습니까?");
		int gae = sc.nextInt();
		System.out.println(gae + "개의 수를 입력하세요");
		int i = 0;
		int sum = 0;
		
		for(i = 0; i < gae ; i++) {
			sum += sc.nextInt();
		}
		System.out.println(gae + "개의 수의 합 : " + sum);
	}
}

몇 개를 입력하시겠습니까?
5
5개의 수를 입력하세요
3 8 6 7 5
5개의 수의 합 : 29

 

그 수의 합계를 출력한 뒤 입력해준 수도 같이 출력하고 싶다면?

package com.day03;

import java.util.Scanner;

public class Exam02 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("몇 개를 입력하시겠습니까?");
		int gae = sc.nextInt();
		System.out.println(gae + "개의 수를 입력하세요");
		int i = 0;
		int sum = 0;
		
		for(i = 0; i < gae ; i++) {
			int no = sc.nextInt();
			System.out.print(no + "\t");
			sum += no;
		}
		System.out.println(gae + "개의 수의 합 : " + sum);
	}
}

몇 개를 입력하시겠습니까?
5
5개의 수를 입력하세요
3 8  4 5 4
3  8 4 5 4
5개의 수의 합 : 24

 

합을 먼저 출력하고 뒤에 입력한 수를 입력하려면..... 어떡하지?

 

for문 밖에서 System.out.println(no+"\t");을 입력해주면 가장 마지막에 입력된 값만 출력이 될 것

이럴 때는 배열이 필요하다.

 

배열 : 같은 자료형을 갖는 구조

 

Exam03 int형 5개를 가지는 배열

int[] arr = new int[5]; -> arr은 int형 5개를 가지는 배열이구나!

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[5];
		System.out.println(arr);
	}
}

[I@7637f22 -> arr이라는 배열은 주소값을 가진다 : 이 주소는 컴퓨터 메모리에 주어진 주소값

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[5];
		for (int i=0;i<5;i++) {
		System.out.println(arr[i]);
		}
	}
}

0
0
0
0
0

배열 arr은 각각의 주소에 초기값으로 0을 가지고 있구나!

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[5];
		for (int i=0;i<6;i++) {
		System.out.println(arr[i]);
		}
	}
}

 

 

배열은 [0] 부터 시작하는구나!

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[5];
		
		arr[3] = 30;
		
		for (int i=0;i<5;i++) {
		System.out.println(arr[i]);
		}
	}
}

0  -> arr[0]
-> arr[1]
0   -> arr[2]
30  -> arr[3]
0   -> arr[4]

 

arr[5]에 뭘 집어넣으려고 하면 에러가 남! arr은 0~4까지 5개가 존재

 

배열의 길이를 바꾸면 for문의 i < 배열길이 도 계속 바꿔줘야 함

이 때 arr.length를 이용하면 알아서 배열의 길이가 적용됨

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[5];
		
		for (int i=0;i<5;i++) {
		System.out.println(arr[i]);
		}
	}
}

 

여기에서 내가 arr의 배열이 갖는 값을 더 늘리거나 줄이면 for문에서도 i < 5 부분을 계속 수정해 주어야 함 

-> 이 때 쓸 수 있는 게 arr.length

 

package com.day03;

public class Exam03 {

	public static void main(String[] args) {
		
		int[] arr = new int[10];
		
		for (int i=0;i<arr.length;i++) {
		System.out.println(arr[i]);
		}
	}
}

배열.ltength 를 해주면 내가 배열을 5로 만들던 10으로 만들던 수정할 필요 없이 알아서 배열 길이만큼으로 적용이 된다.

Exam03_tmp 크기가 5인 배열 tmp 를 만들고 tmp의 값은 1 2 3 4 5 로 한 뒤 출력하라

package com.day03;

public class Exam03_tmp {

	public static void main(String[] args) {
		
		int[] tmp = new int[5];
		tmp[0] = 1;
		tmp[1] = 2;
		tmp[2] = 3;
		tmp[3] = 4;
		tmp[4] = 5;

		for(int i=0; i<tmp.length;i++) {
			System.out.println("tmp["+i+"] : " + tmp[i]);
		}
	}
}

tmp[0] : 1
tmp[1] : 2
tmp[2] : 3
tmp[3] : 4
tmp[4] : 5

 

변형 : 조금 더 세련되게

package com.day03;

public class Exam03_tmp {

	public static void main(String[] args) {
		
		int[] tmp = new int[5];
		
		for(int i=0; i<tmp.length; i++) {
			tmp[i] = i+1;
		}

		for(int i=0; i<tmp.length;i++) {
			System.out.println("tmp["+i+"] : " + tmp[i]);
		}
	}
}

tmp[0] : 1
tmp[1] : 2
tmp[2] : 3
tmp[3] : 4
tmp[4] : 5

 

또는

package com.day03;

public class Exam03_tmp {

	public static void main(String[] args) {
		
		int[] tmp = new int[5];

		for(int i=0; i<tmp.length;i++) {
			tmp[i] = i+1;
			System.out.println("tmp["+i+"] : " + tmp[i]);
		}
	}
}

 

Exam03_str 값을 100 200 300을 가지는 배열 크기가 3인 str 생성

package com.day03;

public class Exam03_str {

	public static void main(String[] args) {
		int[] str = new int[3];
		str[0] = 100;
		str[1] = 200;
		str[2] = 300;
	}
}


줄여서 간단하게 표현해보자! 생성하면서 바로 값을 할당해주기

package com.day03;

public class Exam03_str {

	public static void main(String[] args) {
		int[] str = {100, 200, 300};
	}
}

배열의 초기값을 알고 있다면 이렇게 간단하게 표현할 수 있음

그러나 이 str은 크기가 3으로 고정이되어 str[0] str[1] str[2]까지만 되고 str[3]에 어떤 값이라도 추가할 수 없음

처음 만든 크기로 고정이 됨


Exam03_str2 문자열 배열 str에 Hello, Java, Hi를 할당하고 출력하기

package com.day03;

public class Exam03_str2 {

	public static void main(String[] args) {
		String[] str = {"Hello","Java","Hi"};
		
		for(int i=0; i<str.length; i++) {
			System.out.println(str[i]);
		}
	}
}

Hello
Java
Hi

 

Exam02로 돌아가서 입력한 갯수만큼 수를 입력받아 그 수들의 합을 구한 뒤, 입력해준 값 출력하기
Exam02_Return

package com.day03;

import java.util.Scanner;

public class Exam02_Return {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("몇 개를 입력하시겠습니까?");
		int gae = sc.nextInt();
		System.out.println(gae + "개의 수를 입력하세요");
		int sum = 0;
		int[] no = new int[gae];
		
		for(int i = 0; i < gae ; i++) {
			no[i] = sc.nextInt();
			sum += no[i];
		}
		System.out.println("\n" + gae + "개의 수의 합 : " + sum);
		
		for(int i = 0; i < gae ; i++) {
			System.out.print(no[i]+"\t");
		}
	}
}

몇 개를 입력하시겠습니까?
5
5개의 수를 입력하세요
5 8 6 4 2

5개의 수의 합 : 25
5 8 6 4 2

 

위의 입력 값 중 최대값을 출력하고 싶다.

package com.day03;

import java.util.Scanner;

public class Exam02_Return {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		System.out.println("몇 개를 입력하시겠습니까?");
		int gae = sc.nextInt();
		System.out.println(gae + "개의 수를 입력하세요");
		int sum = 0;
		int[] no = new int[gae];
		int max = 0;
		
		for(int i = 0; i < gae ; i++) {
			no[i] = sc.nextInt();
			sum += no[i];
			if(no[i] > max) {
				max = no[i];
			}
		}
		System.out.println("\n" + gae + "개의 수의 합 : " + sum);
		
		for(int i = 0; i < gae ; i++) {
			System.out.print(no[i]+"\t");
		}
		System.out.println("최대값 : " + max);
	}
}

몇 개를 입력하시겠습니까?
5
5개의 수를 입력하세요
5 10 58 33 2

5개의 수의 합 : 108
5 10 58 33 2 최대값 : 58

 

Exam04 int형의 배열 data를 만들고 10, 5, 100, 200, 30, 77을 할당하고 최대값, 배열 합계, 평균을 출력하라.

package com.day03;

public class Exam04_data {

	public static void main(String[] args) {
		int[] data = { 10, 5, 100, 200, 30, 77 };
		int max = 0;
		int sum = 0;
		float avg = 0;

		for (int i = 0; i < data.length; i++) {
			
			sum += data[i];
			
			if (data[i] > max) {
				max = data[i];
			}
		}
		
		avg = sum/data.length;
		
		System.out.println("최대값 : " + max);
		System.out.println("배열 합계 : " + sum);
		System.out.println("평균 : " + avg);
	}
}

최대값 : 200
배열 합계 : 422
평균 : 70.0

 

package com.day03;

public class Exam04_data {

	public static void main(String[] args) {
		int[] data = { 10, 5, 100, 200, 30, 77 };
		int max = 0;
		int sum = 0;

		for (int i = 0; i < data.length; i++) {
			
			sum += data[i];
			
			if (data[i] > max) {
				max = data[i];
			}
		}
		
		System.out.println("최대값 : " + max);
		System.out.println("배열 합계 : " + sum);
		System.out.println("평균 : " + (float)sum/data.length);
	}
}

최대값 : 200
배열 합계 : 422
평균 : 70.333336

 

최대값이 몇 번째에 있는지 위치를 알고싶다.

package com.day03;

public class Exam04_data {

	public static void main(String[] args) {
		int[] data = { 10, 5, 100, 200, 30, 77 };
		int max = 0;
		int sum = 0;
		int no = 0;

		for (int i = 0; i < data.length; i++) {
			
			sum += data[i];
			
			if (data[i] > max) {
				max = data[i];
				no = i;
			}
		}
		
		System.out.println("최대값 : " + max);
		System.out.println("최대값의 위치 : data[" + no + "]");
		System.out.println("배열 합계 : " + sum);
		System.out.println("평균 : " + (float)sum/data.length);
	}
}

최대값 : 200
최대값의 위치 : data[3]
배열 합계 : 422
평균 : 70.333336

 

배열에서 수 찾기

package com.day03;

import java.util.Scanner;

public class Exam04_data {

	public static void main(String[] args) {
		int[] data = { 10, 5, 100, 200, 30, 77 };
		int max = 0;
		int sum = 0;
		int no = 0;

		for (int i = 0; i < data.length; i++) {
			
			sum += data[i];
			
			if (data[i] > max) {
				max = data[i];
				no = i;
			}
		}
		
		System.out.println("최대값 : " + max);
		System.out.println("최대값의 위치 : data[" + no + "]");
		System.out.println("배열 합계 : " + sum);
		System.out.println("평균 : " + (float)sum/data.length);
		
		System.out.println("찾는 수를 입력해주세요");
		Scanner sc = new Scanner(System.in);
		int wanted = sc.nextInt();
		boolean flag = false;
		
		for (int i = 0; i < data.length; i++) {
			if (wanted == data[i]) {
				flag = true;
				break;
			}
		}
		if(flag==true) {
			System.out.println("있습니다");
		} else {
			System.out.println("없습니다");
		}
	}
}

최대값 : 200
최대값의 위치 : data[3]
배열 합계 : 422
평균 : 70.333336
찾는 수를 입력해주세요
55
없습니다

 

난수 : Math.random() 컴퓨터가 발생시켜주는 수, 0~1 사이의 double형 난수를 발생시킴

 

Exam04_Ramdom 난수를 출력해보자.

package com.day03;

public class Exam04_Random {

	public static void main(String[] args) {
		
		System.out.println(Math.random());
	}
}

0.11024784391310327

 

Exam04_Ramdom2 0~10 사이의 난수를 출력해보자.

package com.day03;

public class Exam04_Random2 {

	public static void main(String[] args) {
		//Math.random() -> 0~1 사이의 난수 발생
		//0~10 사이의 난수 발생하려면 ? x10 해주면 됨
		System.out.println(Math.random()*10);
	}
}

5.858479499384107

 

0~10 사이의 랜덤한 정수 출력

package com.day03;

public class Exam04_Random2 {

	public static void main(String[] args) {
		//Math.random() -> 0~1 사이의 난수 발생
		//0~10 사이의 정수를 랜덤으로 발생시키려면 ?
		System.out.println((int)(Math.random()*10));
	}
}

8

 

(int)Math.random() 하면 (int)0.465468 -> 이므로 항상 0이 나옴 -> x10해준 값을 int형으로 변환시켜주어야 함

 

Exam05 크기가 10인 배열을 만들고, 0~50 사이 난수를 발생해서 배열에 넣기

단, 0이 아닌 값을 넣기

배열에 값(중복) 허용

package com.day03;

public class Exam05 {

	public static void main(String[] args) {
		int[] arr = new int[10]; //크기가 10인 배열 만들기
		int i = 0;
		
		while(i<arr.length) {
			arr[i] = (int)(Math.random()*50); //0~50사이의 난수 발생
			if(arr[i] == 0) continue;
			System.out.println("arr[" + i + "] : " + arr[i]);
			i++;
		}
	}
}

arr[0] : 1
arr[1] : 13
arr[2] : 36
arr[3] : 15
arr[4] : 37
arr[5] : 33
arr[6] : 32
arr[7] : 39
arr[8] : 48
arr[9] : 13

 

여기서 while을 써준 이유는 만약에 난수가 0일 때 i++을 시키지 않고 다시 난수를 발생시키고 그게 0이 아닐 때만

저장을 해야 하므로 몇 번 돌아야 하는지 알 수가 없기 때문!

만약에 arr[3] == 0 이면 아래 문장(출력, i++)을 실행시키지 않고 다시 arr[3]에 랜덤한 난수를 발생시켜 집어 넣는다

 

Exam04_ForEach for문을 간단하게 표현해보기

ex) lotto라는 6개의 숫자를 배열이 있고 이 배열을 출력하고자 할 때

package com.day03;

public class Exam04_ForEach {

	public static void main(String[] args) {
		int[] lotto = {1, 5, 6, 8, 9, 7};
		
		for(int i=0;i<lotto.length;i++) {
			System.out.println(lotto[i]);
		}
	}
}

이렇게 작성한다. 이걸 for each문으로 간결하게 나타내면

package com.day03;

public class Exam04_ForEach {

	public static void main(String[] args) {
		int[] lotto = {1, 5, 6, 8, 9, 7};
		
		for(int i : lotto) {
			System.out.println(i);
		}
	}
}

1
5
6
8
9
7

 

for each문 참고

https://wikidocs.net/264

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

Exam06_lotto 로또 번호 추첨기 만들기(중복된 값X, 1~45사이의 숫자 6개 발생시킬 것) ★나중에 다시 보기

package com.day03;

public class Exam06_lotto {
	public static void main(String[] args) {
		int[] lotto = new int[6];
		int n = 0; // 배열에 들어간 로또 번호의 갯수
		do {
			boolean flag = false;
			int r = (int) (Math.random() * 45+1); // 0~44가 나오므로 +1해주기
			// 중복이면 배열에 못 들어가도록 break;
			for (int i = 0; i < n; i++) {
				if (r == lotto[i]) {
					flag = true;
					break;
				}
			}
			if (flag == true) continue;
			
			lotto[n] = r;// 난수를 배열에 저장 
			n++;
			// 배열에 로또번호 들어갔으니 1 증가
		} while (n < lotto.length);
		// 로또 번호 6개 출력하기
		for (int num : lotto) {
			System.out.print(num + "\t");
		}
	}
}

 이 방법은 중복이면 아예 넣지 않는 방법

 

Exam07 다른 방법으로 바꿔보기 -> do ~ while문 말고 while문 사용하기

package com.day03;

public class Exam07_lotto {
	public static void main(String[] args) {
		int[] lotto = new int[6];
		int n = 0; // 배열에 들어간 로또 번호의 갯수
		while (n < lotto.length) {
			int r = (int) (Math.random() * 45+1); // 0~44가 나오므로 +1해주기
			lotto[n] = r;// 난수를 배열에 저장 
			for (int i = 0; i < n; i++) {
				if (r == lotto[i]) {
					n--;
					break;
				}
			}
			n++;// 배열에 로또번호 들어갔으니 1 증가
		}
		// 로또 번호 6개 출력하기
		for (int num : lotto) {
			System.out.print(num + "\t");
		}
	}
}

28 31 23 11 1 43

728x90
728x90