오늘보다 더 나은 내일의 나에게_

Java 배열 본문

JAVA

Java 배열

chan_96 2022. 1. 13. 06:16
728x90

배열

:동일한 자료형의 데이터연속된 공간에 저장하기 위한 자료구조(순차적으로 데이터들이 저장)
> 반복문을 이용하여 처리하기에 적합한 자료구조

:인덱스에 대응하는 데이터들로 이루어진 자료구조
> 한 번에 많은 메모리 공간 선언 가능

:인덱스는 0부터 시작
> 인덱스는 배열 시작 위치로부터의 상대적인 위치

배열 생성

new int[5];  
new 자료형 [배열의 크기]

배열 레퍼런스 변수 선언
레퍼런스 변수(참조 변수) => 메모리 상에 생성된 인스턴스와 메서드를 가리키는 데 사용되는 변수
Ex) int [] arr = new int [5];
자료형 [ ] 변수 이름


배열 생성 시 값을 알고 있는 경우
int[] arr = {4, 2, 5, 7, 10};
float[] arr2 = {0.4f, 0.22f, 0.35f, 7f, 10.23f};​


배열의 얕은 복사

0 출력 new int[5];
int[] arr2 = arr1;
System.out.println("intArray 참조값 : " + intArray); //[I@1175e2db 출력
System.out.println("myArray 참조값 : " + myArray); // 위와 같이 [I@1175e2db 출력
System.out.println(intArray[0]); // 0출력 배열값을 저장하지않았기 때문에 0출력

arr1[1] = 2;
System.out.println(arr1[1]); // => 2 출력

arr2[1] = 6;
System.out.println(arr2[1]); // => 6 출력

1. 배열 생성
2. 배열 레퍼런스 변수 선언 (배열의 참조값을 가짐)
char[] c = new char[3]; // 메모리 공간상에 연속적인 3칸 공간 할당​


3. 배열에 값 할당(각 인덱스에 접근)

c[0] = 'a';
c[1] = 'b';
c[2] = 'c';​

 

4. 배열 생성과 동시에 값 할당
int[] i = {1, 5, 7, 3, 10}; // 자동으로 연속적인 5칸 공간 할당
// 배열의 크기 변경 불가능!​

5. 배열 크기 출력(length 필드(속성) 활용)
System.out.println("i 배열 크기 : " + i.length); // 5출력
System.out.println(i); // i배열의 주소값 출력 ex)[I@7de26db8


배열 선언 및 생성 시 주의사항

1. 레퍼런스 변수 선언 시 배열의 크기를 지정할 수 없다.
2. 반드시 배열이 생성된 후 접근할 수 있다.
3. 각 원소에 접근 시 [ ] 사이에 인덱스를 적어 접근한다.
4. 배열의 인덱스는 0부터 시작한다.

배열의 크기

- 레퍼런스 변수 선언 시 결정되지 않음
- 배열 생성 시 결정되며 바꿀 수 없음
- 배열의 length라는 필드(속성)에 저장

int[] intArray = new int[8];
System.out.println("intArray의 크기는 " + intArray.length + "입니다.);

올바른 배열 선언 문장을 찾으세요
//1번
int[] = new float(3); // X 변수이름과 자료형 불일치
//2번
int[] avg = new avg[2]; // X 자료형 avg int로 변경
//3번
int[3] avg = {10, 5, 4}; // X int[] 에 크기지정 안됨
//4번
int avg[] = new int[]; // X 크기지정을 안해줌
//5번
int[] avg = new int(4); // X 자료형크기는 대괄호에 작성
//6번
int avg[] = new int[3]; // O
//7번
int[] avg = {10, 5, 4, 6}; // O
//8번
int avg[3] = {8, 9, 5}; // X avg[]안에 크기지정 안됨​
실습 문제
1차원 정수형 배열을 선언한 후 임의의 값으로 초기화합니다. 배열의 값 중 홀수인 값이 몇 개인지 출력하는 프로그램을 작성 (배열의 길이 10)

실습예제 1-2 {45,37,95,103,5,12,17,28,56,29} 배열에 있는 정수중에서 3의 배수만 출력
실습예제 1-3 arr배열 안의 모든 값을 더하고, 총합과 평균을 출력
arr = {10,20,30,40,50,60,70,80,90}

실습예제 1-4 arr 배열의 요소에서 최대값과 최소값을 구해보자 / arr = {23,45,95,17,6,89};
실습 예제 1-5 총 5개의 점수를 입력받고 출력, 입력한 점수 중 최고 점수와 최저 점수를 출력 후 점수의 총합과 평균을 출력
더보기

배열을 통해 입력받기!
*min의 값은 배열의 값을 입력받고 난 후에 선언해야 min에 값이 대입된다!
만약 min이 배열의 값을 입력받기 전에 선언이 되었다면 값은 int min = score[0] =>은 0이다!!!

실습 예제 5칸짜리 정수형 배열을 만들고 각각 임의 값으로 초기화(1~10까지)
단, 배열에 중복된 값은 제거하고 배열에 들어있는 값을 출력!

실습 예제 로그인 프로그램 만들기!
-아이디와 비밀번호의 크기가 3인 배열 생성!
-회원가입이 3번이 넘으면 프로그램 종료!
더보기

코드!

Scanner sc = new Scanner(System.in);
int menu = 0;

//1.   회원가입/로그인/종료 메뉴 출력 후 사용자가 선택
//2.   종료 선택하기 전까지 계속해서 메뉴 선택, 종료 선택 프로그램 종료
//3.   회원가입 기능
//3-1. 사용자가 아이디/비밀번호 입력 -> 기억(저장) 3명까지 가입가능
// 변수 / 배열(자료 개수, 개수 2개이상) -> 자료 저장, 관리가 용이함

String[] id_arr = new String[3]; //아이디 저장 배열
int[] pw_arr = new int[3]; // 비밀번호 저장 배열
int cnt = 0; // 회원가입한 사람의 수를 카운팅

while(true) {
	System.out.print("[1]회원가입 [2]로그인 [3]종료 >> ");
	menu = sc.nextInt(); //사용자가 메뉴 선택
	
	if(menu == 1) {
		// System.out.println("회원가입");
		System.out.print("아이디 : ");
		String id = sc.next();
		System.out.print("비밀번호 : ");
		int pw = sc.nextInt();
		
		id_arr[cnt] = id;
		pw_arr[cnt] = pw;
		
		cnt++; //두번째 회원가입하는 사람은 각 배열의 1번 인덱스에 저장
		
	}else if(menu == 2) {
		// System.out.println("로그인");
		System.out.print("아이디 : ");
		String id = sc.next();
		System.out.print("비밀번호 : ");
		int pw = sc.nextInt();
		//입력값 - 배열에 저장된 값 비교
		
		int i = 0; // 로그인 실패를 알 수 있는 변수(3이되면 -> 실패)
		for(i = 0;i < id_arr.length;i++) {
			if(id_arr[i]!=null) {
				if(id_arr[i].equals(id) && pw_arr[i] == pw) {
					System.out.println("로그인 성공");
					break;
				}
			}
		} // end of for
		
		if(i==3) {
			System.out.println("로그인 실패");
		}
		
	}else if(menu == 3) {
		System.out.println("종료");
		break;
	}else {
		System.out.println("1,2,3 중에 입력해주세요");
	}

	
	
}// end of while


채점 프로그램 만들기

1. 사용자로부터 문제 5개에 대한 답을 입력받은 후 입력한 답이 실제 답과 동일한지 확인한 후 총점을 출력해주는 프로그램을 작성하시오 (O가 출력되는 경우에는 20점씩 누적하여 총점을 출력)

-실제 답을 저장하는 배열을 생성 한 뒤 사용자가 입력한 답을 저장한 배열과 같은 인덱스에 있는 값들끼리 비교하여 같은 경우에는 O를 출력 다를 경우에는 X를 출력
더보기

Scanner sc = new Scanner(System.in);

System.out.println("==채점하기==");
System.out.println("답을 입력하세요");

int[] arr1 = new int[5];
int[] arr2 = {1,2,3,4,5};
int cnt = 0;

for(int i = 0;i < arr1.length;i++ ) {
	System.out.printf("%d번답>>",i+1);
	arr1[i] = sc.nextInt();
}
System.out.println("정답확인");

for(int i = 0;i < arr1.length;i++) {
	if(arr1[i] == arr2[i]) {
		System.out.print("O \t");
		cnt++;
	}else {
		System.out.print("X \t");				
	}
}
System.out.printf("총 점 : %d", cnt*20);​

2차원 배열

배열 생성

int [ ][ ] arr = new int [5][3];

arr [0][0] = 1;
> arr의 0번째 배열의 0 번열에 값 할당
arr [3][2] = 20;
> arr의 3번째 배열의 2 번열에 값 할당

arr[0][0] = 1 arr[0][1] arr[0][2]
arr[1][0] arr[1][1] arr[1][2]
arr[2][0] arr[2][1] arr[2][2]
arr[3][0] arr[3][1] arr[3][2] = 20
arr[4][0] arr[4][1] arr[4][2]

EX)
int [ ][ ] intArr = {{0,1,2}, {3,4,5}, {6,7,8}};

배열의 길이 구하는 속성 => length

-arr.length => 5
-arr [0]. length => 3

예제 1 5행 5열 크기의 2차원 배열을 다음과 같이 선언 및 초기화한 후 다음과 같은 형태로 출력
더보기
// 2차원 배열 생성
int[][] a = new int[5][5];
int num = 1; //배열안에 들어갈 숫자

//배열에 입력
for(int i = 0;i < a.length;i++) {
	for(int j = 0;j < a[i].length;j++) {
		//System.out.printf("(%d, %d) ", i, j);
		a[i][j] = num;
		num++;
	}
}

//출력
for(int i = 0;i < a.length;i++) {
	for(int j = 0;j < a[i].length;j++) {
		System.out.print(a[i][j]+"\t");
	}
	 System.out.println();
}

 

예제 Array를 다음과 같이 출력
더보기
// 5*5 배열을 선언
int[][] arr = new int[5][5];
int num = 21;

for (int i = 0; i < arr.length; i++) {
	// i행이 0,2,4 일때는 데이터가(cnt) 정방향으로
	if(i%2==0) {
		for (int j = 0; j < arr[i].length; j++) {
			arr[i][j] = num;
			num++;
		}				
	}else {
		for (int j = 0; j < arr[i].length; j++) {
			arr[i][4-j] = num;
			num++;
		}		
	}
} // end of for

// 출력
for(int i = 0;i < arr.length;i++) {
	for(int j = 0;j < arr[i].length;j++) {
		System.out.print(arr[i][j]+"\t");
	}
	 System.out.println();
}

 

예제 Array를 다음과 같이 출력

더보기
// 5*5 배열을 선언
int[][] arr = new int[5][5];
int num = 21;

for (int i = 4; i >= 0; i--) {
	for(int j = 4; j >= 0;j--) {
		arr[j][i] = num;
		num++;
	}
} // end of for

// 출력
for(int i = 0;i < arr.length;i++) {
	for(int j = 0;j < arr[i].length;j++) {
		System.out.print(arr[i][j]+"\t");
	}
	 System.out.println();
}


ArrayList

: 가변적인 배열과 같은 형태를 가지고 있는 클래스 ArrayList

ArrayList 생성하기

ArrayList <저장할 데이터 자료형> + 변수명
=> ArrayList <> 객체 형태의 데이터만 저장할 수 있다.
ArrayList<String> list = new ArrayList<String>();​

값 추가하기
-값을 추가하는 메서드가 내부적으로 설계가 되어있음
-데이터가 뒤로 들어감.(순차적으로)

list.add("연어회");
list.add("잎새주");

// 값 원하는 위치에 데이터 추가하기
list.add("방어회");
list.add("조개구이");
list.add(2, "부대찌개");


값 가져오기

System.out.println(list.get(0)); // index가 0인 곳의 값을 가져옴


값 삭제하기

list.remove(0); // index가 0인 곳의 데이터 삭제


저장되어있는 데이터의 총 크기 가져오기

list.size();
System.out.println(list.size());


모든 데이터 값을 한 번에 삭제하는 메서드

list.clear();

실습 예제

뮤직 플레이 리스트 만들기

Music클래스는 musicList라는 이름으로 ArrayList객체를 생성하여 musicList에 노래 제목을 추가하고 삭제하는 프로그램
Music클래스는 아래와 같은 메뉴로 구성

 

1. Scanner와 반복문을 통해 사용자로부터 정수를 입력받아 변수에 저장하세요. 변수가 1,2,3이라면 계속 반복 4라면 "프로그램을 종료합니다." 문구와 함께 반복문 종료. 그 외에 숫자를 입력하면 "잘못 입력하셨습니다." 문구를 출력

2. 노래 조회를 선택할 시 모든 요소 출력. 단 재생목록이 비어 있다면 "재생목록이 없습니다."를 출력

3. 노래 추가를 선택할 시 노래 목록을 보여준 뒤 어느 위치에 추가할 것인지 결정
(1. 마지막 위치에 추가, 2. 원하는 위치에 추가)
4. 노래 삭제 선택할 시 현재 재생 목록을 보여주고 musicList에 노래가 없을 시에는 "재생 목록이 없습니다."라는 문장을 출력

5. musicList에 노래가 있을 시에는 현재 재생 목록을 출력 후 어떤 방법으로 삭제할 것인지 결정
6. 선택 삭제를 입력할 시 삭제할 노래를 선택하고 musicList에서 선택한 노래를 삭제. 삭제 후 "노래가 삭제되었습니다." 문구를 출력
7. 전체 삭제를 입력할 시 musicList에 들어있는 모든 요소를 삭제

코드
더보기
// 첫화면
// [1] 노래조회 [2] 노래추가 [3] 노래삭제 [4]종료
Scanner sc = new Scanner(System.in);
int select = 0;
int select2 = 0;
int select3 = 0;
String musicName = "";
//뮤직 리스트가 담길 ArrayList 선언 -> musicList
ArrayList<String> musicList = new ArrayList<String>();

while(true) {
	System.out.print("[1]노래조회 [2]노래추가 [3]노래삭제 [4]종료 >> ");
	select = sc.nextInt();
	
	if(select==1) {
		
		// 노래 조회
		// get()사용해서 지금까지 저장되어있는 데이터를 불러와야함
		// 조건 1. 단 리스트에 데이터가없다면 "현재 재생목록이 없습니다" 출력
		System.out.println("======현재 재생 목록======");
		if(musicList.size() == 0) {
			System.out.println("현재 재생목록이 없습니다");
		}else {
			for (int i = 0; i < musicList.size(); i++) {
				System.out.printf("%d. %s \n", i+1, musicList.get(i));
			}// end of for
			System.out.println("======================");
		} // end of if
		
	}else if(select==2) {
		
		// 노래 추가 기능
		// 재생 목록을 먼저 보여주고
		System.out.println("======현재 재생 목록======");
		if(musicList.size() == 0) {
			System.out.println("현재 재생목록이 없습니다");
		}else {
			for (int i = 0; i < musicList.size(); i++) {
				System.out.printf("%d. %s\n", i+1, musicList.get(i));
			}// end of for
		}
		System.out.println("======================");
		// 어느 위치에 추가할 것인지 선택하기
		System.out.print("[1]마지막 위치에 추가 [2]원하는 위치에 추가 >>");
		select2 = sc.nextInt();
		
		if(select2 == 1) {
			// 마지막 위치에 노래 추가
			System.out.print("추가할 노래 입력 >> ");
			musicName = sc.next();
			musicList.add(musicName);
			System.out.println("추가가 완료되었습니다.");
		}else if(select2 == 2) {
			// 원하는 위치에 노래 추가
			System.out.print("추가할 노래 입력 >> ");
			musicName = sc.next();
			System.out.print("추가할 위치 입력 >> ");
			int location = sc.nextInt();
			//location 위치에 musicName이 들어감
			//사용자가 원하는 위치와 인덱스의 값을 일치 -> location - 1
			musicList.add(location - 1, musicName);
			System.out.println("추가가 완료되었습니다.");
		}
		
	}else if(select==3) {
		// 노래 삭제
		// 선택시 노래 재생목록이 출력되어야함
		// 노래 데이터가있다면 삭제방법을 선택할수 있는 화면 출력
		
		System.out.println("======현재 재생 목록======");
		if(musicList.size() == 0) {
			System.out.println("현재 재생목록이 없습니다");
		}else {
			// 노래 데이터가 있는 부분
			for (int i = 0; i < musicList.size(); i++) {
				System.out.printf("%d. %s\n", i+1, musicList.get(i));
			}// end of for
		}
		System.out.println("======================");
		// [1]선택삭제 [2]전체삭제
		System.out.print("[1]선택삭제 [2]전체삭제 >> ");
		// 사용자한테 입력받을 번호 변수 선언
		select3 = sc.nextInt();
		// 1,2 판단 -> 조건문
		// 1-> remove, 2-> clear()
		
		if(select3 == 1) {
			System.out.print("삭제할 노래 선택 >> ");
			int removeNum = sc.nextInt();
			// 사용자가 삭제할 데이터 순서 = 인덱스-1
			musicList.remove(removeNum-1);
			System.out.println("노래가 삭제되었습니다.");
		}else if(select3 == 2) {
			musicList.clear();
			System.out.println("전체 리스트가 삭제되었습니다.");
		}
		
	}else if(select==4) {
		System.out.println("프로그램이 종료되었습니다");
		break;
	}else {
		System.out.println("잘못 입력하셨습니다");
	}
} // end of while

 


비정방형 배열

: 각 행의 열의 개수가 다른 배열, 배열의 길이가 다르기 때문에 생성 시 길이를 지정할 수 없음

배열 생성

int[ ][ ] arr= new int[5][ ]
=> 참조값을 저장할 공간만 할당

열의 길이 따로 지정해줘야 한다!
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
arr[3] = new int[1];
arr[4] = new int[3];
arr[4] = {{1}, {1,2}, {1,2,3}}; => 불가능
=> 각 행마다 열이 다르기 때문에 원하는 사이즈를 직접 지정

//이차원(비정방형)배열도 값을 알고 있는 경우에는 
//배열생성후에 바로 레퍼런스 변수 선언 가능
int[][] a = {{1},{1,2},{1,2,3}}; //가능

728x90

'JAVA' 카테고리의 다른 글

Java 메소드(Method)  (0) 2022.01.13
Java OOP, 생성자  (0) 2022.01.13
Java 반복문  (0) 2022.01.13
Java 조건문  (0) 2022.01.12
Java 자료형과 연산자  (0) 2022.01.12
Comments