배열 Array
배열은 동일(유사)한 타입의 데이터를 하나의 묶음 형태로 관리하기 위해 사용되는 자료구조이다.
int 타입의 변수가 100개 정도 필요하다면 변수명 만드는데에도 많은 시간이 걸리고, 관리도 어려울 것이다.
이런 어려움을 극복하고자 사용되는 것이 배열이다.
배열은 객체이지만, 객체 중 유일하게 속성만 가지고 있는 객체이다. (객체는 기본적으로 속성과 메소드를 모두 갖는다.)
객체의 속성과 메소드를 호출할 때는 .(점)을 이용해서 한다.
배열의 속성은 index(위치), length(길이) 두 가지가 있고, arr01.length 와 같이 배열의 길이를 호출할 수 있다.
배열 생성식
배열을 생성하는 방법은 세 가지가 있다.
1) int[] arr01 = new int[5]
값을 따로 지정해주지 않고 배열을 생성하는 방법. 여기서 5는 인덱스가 아닌 길이이다.
2) int[] arr02 = new int[] {10, 11, 12, 13, 14, 15, 16, 17};
배열의 값을 한 번에 지정해주는 방법이다.
3) int[] arr03 = {10, 11, 12, 13, 14, 15, 16, 17}
new int[]를 따로 써 주지 않고 중괄호만으로도 배열을 생성할 수 있다.
배열에 값 대입
arr01[0] = 5;
값을 지정해주지 않은 1~4번 째 칸은 0을 담고 있다.
값을 지정해주지 않으면 초기값으로 정수는 0, 실수는 0.0, char는 0, boolean은 거짓, 객체는 null 을 담고 있다.
배열 호출
int[] arr02 = new int[5];
//값 대입 = index
arr02[0] = 10; //
System.out.println(arr02); // [I@5ccd43c2주소 값
System.out.println(Arrays.toString(arr02)); //[10, 0, 0, 0, 0]
System.out.println(arr02); // [I@7637f22'
System.out.println(arr02.length); // 배열의 길이
1) System.out.println(arr02[0]);
0번째 칸의 값 호출: 10
2) System.out.println(Arrays.toString(arr02));
Array 전체 호출: [10, 0, 0, 0, 0]
3) System.out.println(arr02);
주소값 호출: [I@7637f22
4) System.out.println(arr02.length);
배열의 길이 호출: 5
배열 관련 메소드
1) apple.toCharArray()
apple의 한 글자씩 배열에 넣는 메소드
appleArray = apple.toCharArray();
→ appleArray = [a, p, p, l, e]
2) appleArray.toString()
appleArray의 값(주소)을 문자열로 변환해주는 메소드
apple = appleArray.toString();
→ apple = "[C@dfd3711"
3) String.valueOf(appleArray) ★
appleArray을 문자열로 변환해주는 메소드
apple = String.valueOf(appleArray);
→ apple = "apple"
4) Arrays.toString(appleArray) ★
appleArray 그대로를 문자열로 변환하여 "[a, p, p, l, e]"로 변환하는 메소드
-> appleArray = "[a, p, p, l, e]"
예제 01. 배열의 값 옮기기 (홀수항)
package may25;
import java.util.Arrays;
public class Array02 {
public static void main(String[] args) {
int[] arr01 = {100, 200, 300, 400, 500};
int[] arr02 = new int[10];
for (int i=0; i<5; i++) {
arr02[2*i+1] = arr01[i];
}
System.out.println(Arrays.toString(arr02));
}
}
예제 02. 향상된 for 문(for each 문)
//foreach 문장
//향상 for문
for (int i=0; i< arr01.length; i++) {
System.out.println(arr01[i]);
}
for (int i : arr01) {
System.out.println(i);
}
배열을 응용하여 향상된 for문을 사용할 수 있다.
위의 두 for문은 같은 결과를 출력한다.
예제 03. 시저 암호
package may26;
import java.util.Arrays;
import java.util.Scanner;
public class Array05 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("암호화 할 문자를 입력하세요.");
String input = sc.next();
input = input.toUpperCase(); //문자열 대문자로 변환
System.out.println( "대문자로 변환: " + input);
System.out.println("몇 칸 이동할까요? 숫자를 입력하세요.");
int number = sc.nextInt();
char[] inputArray = input.toCharArray();
for (int i = 0; i < inputArray.length; i++) {
if(inputArray[i] + number > 'Z') {
inputArray[i] = (char)(inputArray[i] + number - 26);
} else {
inputArray[i] = (char)(inputArray[i] + number);
}
}
System.out.println(Arrays.toString(inputArray)); //[Z, A, B]
System.out.println(String.valueOf(inputArray)); //ZAB
System.out.println(inputArray.toString()); //[C@dfd3711
}
}
실행결과:
암호화 할 문자를 입력하세요.
xyz
대문자로 변환: XYZ
몇 칸 이동할까요? 숫자를 입력하세요.
2
[Z, A, B]
ZAB
[C@dfd3711
예제 04. 로또 번호 - 1
중복인 경우 다시 반복하는 가장 전형적인 방법
현재(i)와 이전의 모든 값(j)을 for문을 이용하여 모두 비교
package may26;
//로또
//1~45 -> 6개, 중복불가
//for, if
//1game
import java.util.Arrays;
public class Lotto {
public static void main(String[] args) {
int[] lotto = new int[6];
for (int i = 0; i < lotto.length; i++) {
lotto[i] = (int) (Math.random() * 45 + 1);
for (int j = 0; j < i; j++) { //검사
if (lotto[i] == lotto[j]) { //같다면
i--; //다시 돌리기
break; // 탈출
}
} //내부 for
} // 외부 for
System.out.println(Arrays.toString(lotto));
}
}
예제 05. 로또 번호 - 2
중복을 판별하는 수식이 간단하다면 do while 구문을 이용할 수도 있다.
package may26;
import java.util.Arrays;
public class Lotto2 {
public static void main(String[] args) {
int[] lotto = new int[6];
for (int i = 0; i < lotto.length; i++) {
//랜덤 뽑고, 중복이면 다시 뽑기
int random;
do {
random = (int)(Math.random()*45+1);
} while ( random == lotto[0] || random == lotto[1] || random == lotto[2] || random == lotto[3] || random == lotto[4] || random == lotto[5] );
// 중복이 아니면 대입
lotto[i] = random;
}
System.out.println(Arrays.toString(lotto));
}
}
예제 06. 로또 번호 - 3
중복을 제거해주는 컬렉션 set을 이용하는 방법
package may26;
import java.util.HashSet;
import java.util.Set;
public class Lotto3 {
public static void main(String[] args) {
//컬렉션 SET
Set<Integer> lotto3 = new HashSet<Integer>();
//중복을 제거해주는 Set을 이용했습니다.
while (lotto3.size() < 6) { //size()는 크기 = 6보다 작다면
lotto3.add( (int)(Math.random()*45 + 2));
//add는 set에 값을 집어넣을 때 사용합니다.
}
System.out.println(lotto3);
}
}
예제 07. 가위바위보 게임
- 가위바위보게임
- 사용자가 입력한 횟수만큼 반복
- 배열에 결과값 저장하기
※ 참고
- sc.next();
int 타입으로 입력받기 - sc.nextInt();
String 타입으로 입력받기
package may31;
import java.util.Arrays;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("몇 번 반복하시겠습니까?");
int input = sc.nextInt(); //sc.nextInt : int타입
System.out.println("1. 가위 2. 바위 3. 보");
int win = 0;
int lose = 0;
int draw = 0;
double rate = 0;
String arr[] = new String[input];
for (int i = 0; i < input; i++) {
System.out.println("원하는 번호를 눌러주세요.");
int com2 = (int)(Math.random() * 3 + 1);
int input2 = sc.nextInt(); //sc.next : String타입
String input2Str = "";
switch (input2) {
case 1:
input2Str = "가위";
break;
case 2:
input2Str = "바위";
break;
default:
input2Str = "보";
break;
}
String com2Str = "";
switch (com2) {
case 1:
com2Str = "가위";
break;
case 2:
com2Str = "바위";
break;
default:
com2Str = "보";
break;
}
if (input2 == com2) {
System.out.println("사용자 : " + input2Str + ", 컴퓨터 : " + com2Str + "\t=== 비겼습니다.");
draw++;
arr[i] = "무승부";
} else if((com2 - input2 == 1) || (com2 - input2 == -2)) {
System.out.println("사용자 : " + input2Str + ", 컴퓨터 : " + com2Str + "\t=== 졌습니다.");
lose++;
arr[i] = "패";
} else {
System.out.println("사용자 : " + input2Str + ", 컴퓨터 : " + com2Str + "\t=== 이겼습니다.");
win++;
arr[i] = "승";
}
}
rate = (double) win/input * 100;
System.out.println(Arrays.toString(arr));
System.out.println("승 : " + win + "\n패 : " + lose + "\n무승부 : " + draw + "\n승률 : " + rate);
}
}
예제 08. 암호화
- 짝수는 -1, 홀수는 +1
- abcd(1234) → baeb(2152)
1번은 +1
2번은 -1
3번은 +2
4번은 -2
5번은 +3
6번은 -3
7번은 +4
8번은 -4
※ 루프가 반복되는 경우
array[i] = array[i] % 루프 길이 + 시작점
과 같이 표현할 수 있다. 'A'의 아스키코드 숫자는 65, 'a'의 아스키코드 숫자는 97으로 32만큼 차이가 난다. a~z의 갯수는 분명 26개인데 왜 32칸이 차이가 나는지 궁금해서 찾아보니 Z 이후부터 a 사이에 [ ] ^ 등의 특수문자가 6개가 있었다.
package jun04;
import java.util.Arrays;
import java.util.Scanner;
public class Test02 {
public static void main(String[] args) {
System.out.println("암호화 할 문장을 입력하세요.");
Scanner sc = new Scanner(System.in);
String text = sc.next();//스페이스바 없이
text = text.toLowerCase();
//System.out.println(text);
int even = -1;
int odd = 1;
char[] encrypt = text.toCharArray();
for (int i = 0; i < encrypt.length; i++) {
if(i % 2 == 0) {
encrypt[i] = (char)(encrypt[i] + odd++);
} else {
encrypt[i] = (char)(encrypt[i] + even--);
}
}
//문제는 a밖으로 나갈때나 z밖으로 나갈때임
for (int i = 0; i < encrypt.length; i++) {
if(encrypt[i] < 'a' || encrypt[i] > 'z') { //char 끼리 값 비교 가능
encrypt[i] = (char)(encrypt[i] % 26 + 97); //루프 길이 = 26, 시작점 = 97
}
}
System.out.println(Arrays.toString(encrypt));
sc.close();
}
}
'BackEnd > Java' 카테고리의 다른 글
[Java] 문자(Character), 문자열(String) (0) | 2021.07.01 |
---|---|
[Java] 다차원 배열 Multi Array (0) | 2021.07.01 |
[Java] 무한 반복문 While, Do While (0) | 2021.07.01 |
[Java] 스위치 Switch (0) | 2021.07.01 |
[Java] 반복문 for (0) | 2021.07.01 |
댓글