dev._.note

[JAVA] 배열(Array) 본문

Dev/JAVA

[JAVA] 배열(Array)

Laena 2023. 2. 19. 21:49

배열(Array) 이란?

동일 자료형의 묶음을 의미한다. 배열은 저장된 값 마다 인덱스 번호가 설정됨.(0부터 시작)

- 동일한 물품을 보관하는 서랍장
- 아파트, 오피스텔, 기차

배열 선언과 할당

배열선언 : 주소값을 가지지 않은 변수생성(Stack)

1. 자료형[] 변수이름 ;
2. 자료형 변수이름[] ;

예시 )  int[] arr ;
           int arr[] ;

배열의 할당 : 배열객체 생성후 변수에 주소값할당(Heap)

변수이름 = new 자료형[저장데이터개수];

예시 )  arr = new int [5] ;

배열의 저장구조

int[] arr ;
arr = new int [4] ;

 

참조형 : 주소값을 가지고 다른 공간에 있는 데이터를 확인하고 처리

 


배열 초기화

※ 선언과 동시에 값 기록

예시 ) int[] arr = {1, 2, 3, 4, 5} ;
          String arr[] = {“홍길동”, ”이순신”, ”세종대왕”} ;

예시 ) int[] arr = new int[] {1, 2, 3, 4, 5};

※ 할당과 동시에 자동적으로 기본값으로 초기화됨
예시 ) boolean : false, char : ‘ ’

 

※ 배열 값 기록 1

index를 이용한 직접 값기록

예시 ) arr[0] = 1;
          arr[1] = 2;
          arr[2] = 3;
          ……

 

※ 배열 값 기록 2

for문을 이용
예시 ) for(int i = 0; i < arr.length; i++) {
               arr[i] = i + 1;
           }

※ 초기화 할 리터럴이 일정 규칙으로 증가한다면, 반복문의 index를 통해 배열에 값을 기록.

 

❏ 예제

int[] arr=new int[5];
for(int i = 0; i < arr.length; i++){ 
	System.out.print(“저장 데이터 : ”); 
	arr[i] = sc.nextInt(); 
}

배열 값 출력 : 배열에 저장된 값을 호출(출력)하려면 인덱스를 이용 

arr[인덱스번호]

arr[인덱스번호]가 하나의 변수명이라고 생각하면 된다.
출력 : System.out.println(arr[인덱스번호]) ;

 

❏ 예제 1

길이가 100인 배열을 선언하고 1부터 100까지 값을 순서대로 배열 인덱스에 넣어 그 값을 출력하는 코드를 작성하시오.

public void test() {
		
		int[] arr = new int[100];
		
		for(int i = 0; i < arr.length; i++) {
			arr[i] = i + 1;
			System.out.print(arr[i] + " ");
		}

출력결과 : 1 2 3 ... 98 99 100

 

❏ 예제 2

길이가 5인 String 배열을 선언하고, “딸기”, ”복숭아”, ”키위”, ”사과” , ”바나나” 로 초기화를 한 후, 배열 인덱스를 활용해서 바나나를 출력해 보시오.

public void test() {
		
		String[] arrStr = {"딸기", "복숭아", "키위", "사과", "바나나"};
		for(int i = 0; i < arrStr.length; i++) {
			if(arrStr[i] == "바나나") {
				System.out.printf("바나나는 arrStr[%s]입니다.", i);
			}
		}
		
	}

출력결과 : 바나나는 arrStr[4]입니다.

배열 복사

※ 얕은 복사

객체의 주소값만 가져와 참조형변수에 저장하고 하나의 객체를 두 변수가 참조하고 있는 것

방법 : int[] arr1 = new int[4];
          int[] arr2 = arr1;

 

❏ 예제 1

public class Shallow_copy{
	public static void main(String[] args){ 

		char[] carr1 = {‘a’, ‘b’, ‘c’, ‘d’}; 
		char[] carr2 = carr1; // <- 얕은복사 ◀︎ ◀︎ ◀︎

		for(int i = 0; i < carr1.length; i++){ 
			System.out.print(carr1[i] + “, ”);
		}
		System.out.println(“주소값 : ” + carr1.hashcode()); 

		for(int i = 0; i < carr2.length; i++){
			System.out.print(carr2[i] + “, ”); 
		}
		System.out.println(“주소값 : ” + carr2.hashcode()); 
	}
}

실행결과 : a, b, c, d, 주소값 : 148659610 
				 a, b, c, d, 주소값 : 148659610

 

❏ 예제 2

public class Shallow_copy{
	public static void main(String[] args){ 

		char[] carr1 = {‘a’, ‘b’, ‘c’, ‘d’}; 
		char[] carr2 = carr1;// <- 얕은복사 ◀︎ ◀︎ ◀︎

		carr2[0] = ‘f’;

		for(int i = 0; i < carr1.length; i++){ 
			System.out.print(carr1[i] + “, ”);
		}
		System.out.println(“주소값 : ” + carr1.hashcode()); 

		for(int i = 0; i < carr2.length; i++){
			System.out.print(carr2[i] + “, ”); 
		}
		System.out.println(“주소값 : ” + carr2.hashcode()); 
	}
}

실행결과 : f, b, c, d, 주소값 : 148659610 
				 f, b, c, d, 주소값 : 148659610

※ 깊은 복사

다른 객체를 생성하여 새로운 객체에 데이터 내용을 복사하는 것

방법 : for문을 이용한 1:1복사
          System.arraycopy() 메소드를 이용한 복사
          clone() 메소드를 이용한 복사

 

 

❏ for 문으로 복사

public class for_copy{
	public static void main(String[] args){ 

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

	for(int i = 0; i < arr1.length; i++){ 
		arr2[i] = arr1[i];
	}
		arr2[0] = 0; // <- 깊은 복사 ◀︎ ◀︎ ◀︎

	for(int i = 0; i < arr1.length; i++){ 
			System.out.print(arr1[i] + “, “);
		}
		System.out.println(“주소값 : “ + arr1.hashCode()); 

	for(int i = 0; i < arr2.length; i++){
			System.out.print(arr2[i] + “, “); 
		}
		System.out.println(“주소값 : “ + arr2.hashCode());
	} 
}

실행결과 : 1, 2, 3, 4, 5,주소값 : 148659610
	  0, 2, 3, 4, 5,주소값 : 154856980

 

❏ arraycopy() 메소드 이용복사 1

public class Arraycopy{
	public static void main(String[] args){ 

	int[] arr1 = {1, 2, 3, 4, 5};
	int[] arr2 = new int[5];
	System.arraycopy(arr1, 0, arr2, 0, arr1.length);// <- 깊은 복사 ◀︎ ◀︎ ◀︎

	for(int i = 0; i < arr1.length; i++){ 
			System.out.print(arr1[i] + ", ");
		}
		System.out.println("주소값 : " + arr1.hashCode()); 

	for(int i = 0; i < arr2.length; i++){
			System.out.print(arr2[i] + ", "); 
		}
		System.out.println("주소값 : " + arr2.hashCode());
	}
}

실행결과 : 1, 2, 3, 4, 5, 주소값 : 148659610
	  1, 2, 3, 4, 5, 주소값 : 154856980

 

❏ arraycopy() 메소드 이용복사 2

public class Arraycopy{
	public static void main(String[] args){ 

		int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = new int[5];
		System.arraycopy(arr1, 0, arr2, 0, arr1.length); 
		arr2[0] = 0; // <- 깊은 복사 ◀︎ ◀︎ ◀︎

		for(int i = 0; i < arr1.length; i++){ 
				System.out.print(arr1[i] + ", ");
		}
		System.out.println("주소값 : " + arr1.hashCode()); 

		for(int i = 0; i < arr2.length; i++){
				System.out.print(arr2[i] + ", "); 
		}
		System.out.println("주소값 : " + arr2.hashCode());
	}
}

실행결과 : 1, 2, 3, 4, 5, 주소값 : 148659610
	  0, 2, 3, 4, 5, 주소값 : 154856980

 

❏ clone() 메소드 이용복사 1

public class Clone_copy{
	public static void main(String[] args){ 

		char[] carr1 = {‘1’, ‘2’, ‘3’, ‘4’, ‘5’}; 
		char[] carr2 = new char[5];

		carr2 = carr1.clone();// <- 깊은 복사 ◀︎ ◀︎ ◀︎

		for(int i = 0; i < carr1.length; i++){ 
				System.out.print(carr1[i] + “, ”);
		}
		System.out.println(“주소값 : ” + carr1.hashcode()); 

		for(int i = 0; i < carr2.length; i++){
				System.out.print(carr2[i] + “, ”); 
		}
		System.out.println(“주소값 : ” + carr2.hashcode()); 
	}
}

실행결과 : 1, 2, 3, 4, 5, 주소값 : 148659610 
	  1, 2, 3, 4, 5, 주소값 : 154856980

 

❏ clone() 메소드 이용복사 2

public class Clone_copy{
	public static void main(String[] args){ 

		char[] carr1 = {‘1’, ‘2’, ‘3’, ‘4’, ‘5’}; 
		char[] carr2 = new char[5];

		carr2 = carr1.clone();// <- 깊은 복사 ◀︎ ◀︎ ◀︎

		for(int i = 0; i < carr1.length; i++){ 
				System.out.print(carr1[i] + “, ”);
		}
		System.out.println(“주소값 : ” + carr1.hashcode()); 

		for(int i = 0; i < carr2.length; i++){
				System.out.print(carr2[i] + “, ”); 
		}
		System.out.println(“주소값 : ” + carr2.hashcode()); 
	}
}

실행결과 : 1, 2, 3, 4, 5, 주소값 : 148659610 
	  1, 2, 3, 4, 5, 주소값 : 154856980

 

❏ 예제 1

문자열을 하나 입력 받아 배열에 넣고 문자를 하나 입력 받아 입력 받은 문자가 문자열에 몇 개 인지 개수를 출력하는 프로그램을 작성하세요.

public void test() {
		Scanner sc = new Scanner(System.in);
		System.out.print("단어를 입력하세요 : ");
		String str = sc.next();
		System.out.print("검색할 문자 입력 : ");
		char input = sc.next().charAt(0);
		
		char[] ch = new char[str.length()];
		int count = 0;
		
		for(int i = 0; i < ch.length; i++) {			
			ch[i] = str.charAt(i);
			if(ch[i] == input) {
				count++;
			}	
		}
		
		System.out.printf("찾으시는 문자 %c은 %s개 입니다.", input, count);	
	}

실행결과 : 단어를 입력하세요 : helloworld
	  검색할 문자 입력 : l
	  찾으시는 문자 l은 1개입니다.

 

❏ 예제 2

사용자의 전화번호를 입력받고, 13자리의 문자형 배열에 저장한후, 가운데 4자리를 *로 가리기. 단, 원본 배열값은 변경 없이 배열 복사본으로 변경하세요.

public class Test4 {
	public static void main(String[] args) {
		Test4 t = new Test4();
		t.test1();
		t.test2();
	}
	
	/**
	 * 문자열에서 가운데 4자리 *처리하기
	 * "01012341234" -> "010****1234"
	 * 
	 * String은 불변(immutable)이다.
	 */
	public void test2() {
		String s = "01012341234";
		
		// String java.lang.String.substring(int beginIndex, int endIndex)
		String tel1 = s.substring(0, 3);
		String tel2 = "****";
		String tel3 = s.substring(7);
		
		System.out.println(tel1 + tel2 + tel3);
		
	}
	
	/**
	 * 사용자의 전화번호를 입력받고,
	 * 11자리의 문자형배열에 저장한후, 
	 * 가운데 4자리를 *로 가리기.
	 * 단, 원본 배열값은 변경 없이 배열 복사본으로 변경하세요
	 * 
	 */
	public void test1() {	
		Scanner sc = new Scanner(System.in);
		System.out.print("사용자의 전화번호를 입력하세요 : 010");
		String numInput = "010" + sc.next();
		char[] num = new char[numInput.length()];
		char[] copy = new char[num.length];		
		
		// 입력받은 번호를 num배열에 넣고, for를 이용해서 copy배열에 복사
		for(int i = 0; i < num.length; i++) {
			num[i] = numInput.charAt(i);
			copy[i] = num[i];
		}
		
		// copy배열의 가운데 4자리를 *로 변환
		for(int i = 0; i < copy.length; i++) {
			if(i > 2 && i < 7) {
				copy[i] = '*';
			}			
		}	
		// copy배열과 num배열이 다른지 확인
		System.out.print("번호 : ");
		for(char numOut : copy) {
			System.out.print(numOut);
		}
		System.out.println();
		System.out.print("원본번호 : ");
		for(char numOut : num) {
			System.out.print(numOut);
		}
		
	}

}

실행결과 : 사용자의 전화번호를 입력하세요 : 010 (12341234입력)
	  번호 : 010****1234
	  원본번호 : 01012341234

 

❏ 예제 3

배열의 크기로 홀수인 양의 정수를 입력 받아 배열을 만드세요. 배열의 중간 까지는 1부터 1씩 증가하여 오름 차 순으로 값을 넣고, 중간 이후부터 끝까지는 1씩 감소하여 내림 차 순으로 값을 넣어 출력하는 프로그램을 작성하세요.

출력예 ) 7 입력

[1, 2, 3, 4, 3, 2, 1]

public void test() {	
		// 홀수인 양의 정수 입력
		Scanner sc = new Scanner(System.in);
		int arraySize = 0;
		
		// 유효성 검사		
		while(true) {
			System.out.print("홀수인 양의 정수를 입력하세요. : ");
			arraySize = sc.nextInt();
			if(arraySize < 0 || arraySize % 2 == 0) {
				System.out.println("잘못 입력하셨습니다. 다시 입력해주세요.");	
				continue;
			}
			break;
		}
		
		// 배열의 크기로 지정		
		int[] arr = new int[arraySize];		
		
		for(int i = 0; i < arr.length; i++) {
			int count = arr.length/2;
			arr[i] = i + 1;
			if(i > count) {
				arr[i] = arr.length - i;
			}
		}
		
		// 출력
		for(int c = 0; c < arraySize; c++) {
			System.out.print(c == 0 ? "[" : "");
			System.out.print(arr[c]);
			System.out.print(c != arraySize - 1 ? ", " : "]");
		}
		
	}

실행결과 : 홀수인 양의 정수를 입력하세요. : 7
	  [1, 2, 3, 4, 3, 2, 1]
	  짝수를 입력 한 경우 : 잘못 입력하셨습니다. 다시 입력해주세요.

'Dev > JAVA' 카테고리의 다른 글

[JAVA] 객체지향(Object oriented)  (1) 2023.02.21
[JAVA] 중첩 반복문  (0) 2023.02.20
[JAVA] 제어문  (0) 2023.02.18
[JAVA] 연산자(Operator)  (0) 2023.02.17
[JAVA] 출력 메소드(Print Method)  (0) 2023.02.06