얕은복사
얕은복사(shallow copy) : stack의 주소값만 복사
얕은복사를 하면 한쪽을 바꿔도 양쪽 다 바뀐다는 특징을 갖고 있다.
* 얕은 복사는 stack에 저장되어 있는 배열의 주소값만복사한다는 것이다.
* 따라서 두 개의 레퍼런스 변수는 동일한 배열의 주소값을 가지고 있다.
* 하나의 레퍼런스변수에 저장된 주소값을 가지고 배열의 내용을 수정(값 변경)을 하게 되면
* 다른 레퍼런스변수로 배열에 접근했을 때도 동일한 배열을 가리키고 있기 때문에 변경된 값이 반영되어 있다.
* 얕은 복사의 활용
* 얕은 복사를 활용하는 것은 주로 메소드 호출 시 인자로 사용하는 경우와
* 리턴값으로 동일한 배열을 리턴해주고 싶은 경우사용한다.
public class Application2 {
public static void main(String[] args) {
String[] names = {"홍길동", "유관순", "이순신"};
System.out.println("names의 hashCode : " + names.hashCode());
// 메소드 호출방법
// non-static일경우
// 클래스명 사용할변수 = new 클래스명(); -> 객체 생성을 해야 사용가능
// 사용할변수.메소드명().;
//static일경우
//클래스명.메소드명();
// --> 같은 클래스내의 static메소드는 앞의 클래스명을 생략할 수 도 있다.
print(names); // 매개변수에 넣는 값을 전달 인자 , 전달인자 : 주소 값
for(int i = 0; i < names.length; i++) {
System.out.print(names[i] + " ");
}
/* 리턴값으로 활용 */
String[] animals = getAnimals(); // ctrl + alt + v 네이밍 자동완성
System.out.println("리턴받은 animals의 hashCode : " + animals.hashCode());
print(animals);
}
// 얕은 복사를 활용하는 것은 주로 메소드 호출 시 인자로 사용하는 경우
public static void print(String[] sarr) { // String[] sarr = names; 얕은복사를 한것이다.
System.out.println("sarr의 hashCode : " + sarr.hashCode());
for(int i = 0; i < sarr.length; i++) {
System.out.print(sarr[i] + " ");
}
System.out.println();
// sarr[1] = "유승제";
}
public static String[] getAnimals() {
// String[]은 반환형이다
// 반환형 : 기본자료형 8가지 , String , 기본자료형타입의배열 8가지, String[] 이 들어갈 수 있다.
// 반환형이 있을경우 뒤에 무조건 return이 붙는다
String[] animals = new String[] {"낙타", "호랑이", "나무늘보"}; // new String[]은 생략 가능하다.
System.out.println("새로 만든 animals의 hascode : " + animals.hashCode());
return animals;
}
}
//결과창
names의 hashCode : 918221580
sarr의 hashCode : 918221580
홍길동 유관순 이순신
홍길동 유관순 이순신 새로 만든 animals의 hascode : 1804094807
리턴받은 animals의 hashCode : 1804094807
sarr의 hashCode : 1804094807
낙타 호랑이 나무늘보
깊은복사
깊은복사(deep copy) : heap의 배열에 저장된 값을 복사
* 깊은 복사는 heap에 생성된 배열이 가지고 있는 값을
* 또 다른 배열에 복사를 해놓은 것이다.
* 서로 같은 값을 가지고 있지만, 두 배열은 서로 다른 배열이기에
* 하나의 배열에 변경을 하더라도 다른 배열에는 영향을 주지 않는다.
* 깊은 복사를 하는 방법은 4가지가 있다.
* 1. for문을 이용한 동일한 인덱스의 값 복사
* 2. Object의 clone()을 이용한 복사 // Object는 모든 class의 부모다
* 3. System의 arraycopy()을 이용한 복사
* 4. Arrays의 copyOf()를 이용한 복사
* 이 중 가장 높은 성능을 보이는 것은 순수 배열의 복사를 위해 만들어진 arraycopy()메소드이며
* 가장 많이 사용되는 방식은 좀 더 유연한 방식인 copyOf()메소드이다.
* clone()은 이전 배열과 같은 배열밖에 만들수 없다는 특징을 가지고,
* 그 외 3가지 방법은 복사하는 배열의 길이를 마음대로 조절할 수 있다는 특징을 가지고 있다.
import java.util.Arrays;
public class Application3 {
public static void main(String[] args) {
int[] originArr = {1, 2, 3, 4, 5};
print(originArr);
/* 1. for문을 이용한 동일한 인덱스 값 복사 */
int[] copyArr1 = new int[10];
// originArr 으로부터 값을 꺼내오는 작업
for(int i = 0; i < originArr.length; i++) {
copyArr1[i] = originArr[i];
}
print(copyArr1);
/* 2. Object의 clone()을 이용한 복사 */
int[] copyArr2 = originArr.clone();
print(copyArr2);
/* 3. System의 arraycopy()를 이용한 복사 */
int[] copyArr3 = new int[10];
/* 원본배열, 복사를 시작할 인덱스, 복사본 배열, 복사를 시작할 인덱스, 복사할 길이 */
// 복사할 배열의 위치를 유연하게 변경가능하다.
System.arraycopy(originArr, 0, copyArr3, 3, originArr.length);
print(copyArr3);
/* 4. Arrays의 copyOf()를 이용한 복사 */
int[] copyArr4 = Arrays.copyOf(originArr, 7); //System에 있는 arraycopy()를 들고와서 사용하는것
print(copyArr4);
}
public static void print(int[] iarr) {
System.out.println("iarr의 hashCode : " + iarr.hashCode());
for(int i = 0; i < iarr.length; i++) {
System.out.print(iarr[i] + " ");
}
System.out.println();
}
}
//결과창
iarr의 hashCode : 918221580
1 2 3 4 5
iarr의 hashCode : 1804094807
1 2 3 4 5 0 0 0 0 0
iarr의 hashCode : 951007336
1 2 3 4 5
iarr의 hashCode : 2001049719
0 0 0 1 2 3 4 5 0 0
iarr의 hashCode : 1528902577
1 2 3 4 5 0 0
//향상된 for문
for 콜론 앞쪽의 자료형은 뒤에 콜론의 자료형을 보면 결정이 된다.
for(int i : arr2) { // :을 기준으로 뒤에는 반복할 대상객체가 들어간다. 콜론 앞쪽은 인덱스별 순차적인 값을 담을 변수를 지정한다.
i+= 10;
}
for(int i = 0; i < arr2.length; i++) {
System.out.print(arr2[i] + " ");
}
System.out.println();
/*
* 주의 : 향상된 for문은 배열에 인덱스에차례로 접근할 때는 변하게 사용할 수 있지만 값을 변경할 수 는 없다.
* 대신 변경하는 것이 아니고 사용하는 목적이라면 조금 더 편하게 사용할 수 있다.
* */ // 값이 있고 있는 값 그대로를 출력만 할때 많이 쓴다.
for(int i : arr2 ){
System.out.print(i + " ");
}
System.out.println();
'JAVA > self-study' 카테고리의 다른 글
[JAVA] Map 연습문제 (0) | 2024.05.23 |
---|---|
[IntelliJ] 매크로 설정 (0) | 2024.03.15 |
[JAVA] JVM, JDK, JRE란? (2) | 2024.03.10 |
[JAVA] JAVA란? (0) | 2024.03.10 |
[IntelliJ] JAVA 콘솔창에서 한글이 깨지는 경우 (0) | 2024.03.10 |