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개에서 막혔다. 바로 복습이나 하자.