TIL 7일차. 배열

김기현·2025년 2월 19일

1.배열

배열 복사

-얕은 복사 : 객체의 주소 값만 가져와 참조형 변수에 저장하고 하나의 객체를 두 변수가 참조하는것 ex) int[]arr1 = new int[4]; // int[]arr2 = arr1;
같은 객체를 참조하기 때문에 하나의 변수에 변경이 일어날 때 나머지도 변경됨

//얕은 복사
//주소를 복사하여 서로다른 두 참조 변수가 하나의 배열을 참조하는것
public void shallowCopy() {
	
	int[] arr = {1,2,3,4,5};
	
	//얕은 복사 진행
	int[] copyArr=arr;//주소만 복사
	System.out.println("변경 전");
	System.out.println("arr 주소 : "+arr);
	System.out.println("copyArr 주소 : "+copyArr);
	System.out.println("arr : "+Arrays.toString(arr));
	System.out.println("copyArr : "+Arrays.toString(copyArr));

-깊은 복사 : 새로운 배열 객체를 생성하여 기존 배열의 데이터를 복사하는 것
다른 객체를 참조하기 때문에 배열의 변경이 서로에게 영향을 미치지 않는다

//깊은 복사
//같은 자료형의 새로운 배열을 만들어 기존 데이터를 모두 복사하는것
public void deepCopy() {
	
	int[] arr= {1,2,3,4,5};
	
	//for문을 이용한 깊은 복사
	int[] copyArr1 = new int [arr.length];
	for(int i=0;i<arr.length;i++) {
		copyArr1[i]=arr[i];
	}
	System.out.println("arr 주소 : "+arr);
	System.out.println("copyArr1 주소 : "+copyArr1);
	
	System.out.println("arr : "+Arrays.toString(arr));
	System.out.println("copyArr1 : "+Arrays.toString(copyArr1));
	
	//System.arraycopy(원본배열,원복복사 시작 인덱스, 복사배열명,복사배열 삽입 시작 인덱스,복사길이)
	int[] copyArr2= new int[arr.length];
	System.arraycopy(arr, 0, copyArr2, 0, arr.length);
	
	System.out.println("copyArr2 : "+Arrays.toString(copyArr2));
	
	//복사할 배열의 참조변수 = Arrays.copyOf(원본배열명, 복사할 길이);
	int[] copyArr3 = Arrays.copyOf(arr, arr.length);
	System.out.println("copyArr3 : "+Arrays.toString(copyArr3));

**문장 하나씩 끊어서 char에 저장 : 변수.charAt()

배열의 정렬
-자바에서 제공
-Arrays.sort(배열명);

오늘 강의는 예제풀이를 위주로 진행되었다. 대표적인 예제는 다음과 같다

//로또 번호 생성기
//배열을 이용한 중복데이터 제거 + 정렬
public void creatLootoNumber(){
	
	//1~45 사이 중복되지 않은 난수 6개 생성
	//생성된 난수가 오름차순 정렬
	//[5,11,13,18,24,25]
	
	//정수 6개를 저장할 배열 선언 및 할당
	int[] lotto = new int[6];
	
	//생성된 배열 순차접근하는 for문 작성
	for(int i=0; i<lotto.length;i++) {
		
		//1~45 난수 생성
		int random=(int)(Math.random()*45+1);
		
		//생성된 난수 순서대로 배열요소에 대입
		lotto[i]=random;
		
		//중복 검사를 위한 중첩for문
		for(int x=0;x<i;x++) {
			
			//현재 생성된 난수와 같은 수가 앞쪽 요소에 있는지 확인
			if(random==lotto[x]) {
				i--;//i가 중복이면 난수를 새로 생성해야 하므로
					//i값을 인위적으로 감소시켜 중복난수를 덮어쓸 기회 제공
				break;//중복데이터를 발견하면 뒤의 데이터는 추가적으로 검사 할 필요 없다
					//효율을 위해 중복검사 break
			}
		}
	}
	//중복제거된 배열을 정렬
	//자바가 정렬 방법을 제공
	//Arrays.sort(배열명) : 배열 내 요소값들이 오름차순 정렬
	Arrays.sort(lotto);
	
	//결과 출력
	System.out.println(Arrays.toString(lotto));

다음 예제들은 난이도가 있어 풀이하는데 어려움이 있던 예제들이다. 조건은 다음과 같다.
링크텍스트

13번

public void practice13() {
	
	System.out.print("문자열 : ");
	String word=sc.next();
	String sum="";
	char[] ch=new char[word.length()];
	int count=0;
	
	for(int i=0; i < word.length(); i++) {
		
		ch[i]=word.charAt(i);
	}
	
	System.out.print("문자열에 있는 문자 : ");
	
	for(int i=0;i<word.length();i++) {//중복체크용 for
		
		boolean flag= true;//중복값 체크용
		for(int x=0;x<i;x++) {
			if(ch[i]==ch[x]) {
				flag=false;
				break;
			}
		}
		if(flag) {//중복 발생하지 않았을 경우
			
			if(i==0) {//첫글자
				System.out.print(ch[i]);
			}else {
				System.out.print(", "+ch[i]);
			}
			count++;//중복 아닐 때 count증가
		}
	}
	System.out.println("\n문자 개수 : "+count);
	
}

14번

public void practice14() {
	
	System.out.print("배열의 크기를 입력하세요 : ");
	
	int size = sc.nextInt();
	System.out.println();//계행을 위한 print구문
	
	String[]arr=new String[size];
	
	for(int i=0;i<arr.length;i++) {
		System.out.println(i+1+"번째 문자열 : ");
		
		arr[i]=sc.nextLine();
	}
	while(true) {
		System.out.print("더 값을 입력하시겠습니까?(y/n)");
		char ch=sc.next().charAt(0);
		if(ch=='y'||ch=='Y') {
			
			System.out.print("더 입력 받을 개수 : ");
			int addSize=sc.nextInt();
			sc.nextLine();//입력받은 계행 문자 제거
			//새로 입력 받을 배열 생성
			String[] newArr=new String[arr.length+addSize];
			//배열 복사
			for(int i=0;i<newArr.length;i++) {
				//인덱스의 크기가 기존 배열보다 크거나 작을 경우
				if(i<arr.length) {//깊은 복사 필요
					newArr[i]=arr[i];
				}else {//작은 복사 필요
					System.out.println(i+1+"번째 문자열 : ");
					newArr[i]=sc.nextLine();
				}
				
			}
			//기존 배열 공간을 참조하던 arr에 newArr 대입 필요
			//추가 입력시 위 코드를 반복하며 기준배열arr을 기준으로
			//newArr의 길이를 할당하기 때문에 꾸준히 for문 에서 변경된
			//arr값을 갱신해줘야한다
			arr=newArr;
			
			
		}else if(ch=='n'||ch=='N') {
			break;//while 반복문 종료
			
		}else System.out.println("잘못 입력하셨습니다. 다시 입력하세요.");
		
	}
	
	
	
	System.out.println(Arrays.toString(arr));
}

오늘 풀이한 예제는 마지막 2개에서 막혔다. 바로 복습이나 하자.

profile
모든게 처음

0개의 댓글