Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코테준비
- 백준 1000번 java
- 문자열포맷
- 백준 1000번
- 공부정리
- java
- 프렌즈4블록
- 개발상식
- 자료구조힙
- 객체프로그래밍
- 자바문자열
- java method
- 카카오코테
- Java heap
- 자바
- 알고리즘
- 자료구조 트리
- 프렌즈4블록java
- 카카오코딩테스트
- 카카오기출
- heap
- 객체프로그래밍이란
- 백준 1924번 java
- 백준
- 코딩테스트기출
- heap정렬
- 힙정렬자바
- 프로그래머스
- 백준 1924번
- 카카오1차
Archives
- Today
- Total
일단 시작해보는 블로그
[Java] ArrayList, 참조값 복사와 값 복사 clone() 본문
자료구조나 변수를 복사할 때는 두가지 종류가 있다.
하나는 참조 값을 할당하는 것 다른 하나는 값을 할당하는 것.
참조 값을 할당하는 것을 얕은 복사라고 하고, 값을 할당하는 것을 깊은 복사라고 한다. 무슨 복사인지는 의미없지만 상황에 따라서 쓰이는 경우가 있으니 다음 예제로 익혀봤다.
얕은 복사 : 참조 값만 할당 (destination = source)
package data_structure;
import java.util.ArrayList;
class Fruit {
private String name;
private int count;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
}
public class ArrayList_copy {
static ArrayList<Fruit> source = new ArrayList<Fruit>();
static ArrayList<Fruit> destination = new ArrayList<Fruit>();
public static void initArrayList(){
if(null != source){
source.clear();
String[] names = new String[] {"apple", "banana", "cherry"};
for(int i=0; i<names.length; i++){
Fruit f = new Fruit();
f.setName(names[i]);
f.setCount(i+1);
source.add(f);
}
}
if(null != destination){
destination.clear();
}
}
public static void printArrayList(){
System.out.println("==== source result ====");
for(int i=0; i<source.size(); i++){
System.out.println("source["+i+"] name : " + source.get(i).getName());
System.out.println("source["+i+"] count : " + source.get(i).getName());
}
System.out.println();
System.out.println("==== destination result ====");
for(int i=0; i<destination.size(); i++){
System.out.println("destination["+i+"] name : " + destination.get(i).getName());
System.out.println("destination["+i+"] count : " + destination.get(i).getName());
}
}
public static void main(String[] args) {
initArrayList();
//얖은 복사, 참조 값만 복사
destination = source;
Fruit f = new Fruit();
f.setName("kiwi");
f.setCount(4);
destination.add(f);
printArrayList();
}
}
-> 참조 값을 할당받는 거라서 같은 메모리를 가리키게 되고 당연히 메모리가 변경되면 참조값을 담고 있는 변수 명이 달라도 값은 같이 반영이 된다.
깊은 복사 : 값을 할당
package data_structure;
import java.util.ArrayList;
class Fruit {
private String name;
private int count;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getCount(){
return count;
}
public void setCount(int count){
this.count = count;
}
}
public class ArrayList_copy {
static ArrayList<Fruit> source = new ArrayList<Fruit>();
static ArrayList<Fruit> destination = new ArrayList<Fruit>();
public static void initArrayList(){
if(null != source){
source.clear();
String[] names = new String[] {"apple", "banana", "cherry"};
for(int i=0; i<names.length; i++){
Fruit f = new Fruit();
f.setName(names[i]);
f.setCount(i+1);
source.add(f);
}
}
if(null != destination){
destination.clear();
}
}
public static void printArrayList(){
System.out.println("==== source result ====");
for(int i=0; i<source.size(); i++){
System.out.println("source["+i+"] name : " + source.get(i).getName());
System.out.println("source["+i+"] count : " + source.get(i).getName());
}
System.out.println();
System.out.println("==== destination result ====");
for(int i=0; i<destination.size(); i++){
System.out.println("destination["+i+"] name : " + destination.get(i).getName());
System.out.println("destination["+i+"] count : " + destination.get(i).getName());
}
}
public static void main(String[] args) {
initArrayList();
//깊은 복사, 값을 할당
destination = (ArrayList<Fruit>)source.clone();
Fruit f = new Fruit();
f.setName("kiwi");
f.setCount(4);
destination.add(f);
printArrayList();
}
}
-> 값 자체를 할당하는 것. 그냥 값을 복사한거라서 참조값도 서로 다르고 그냥 값만 같은 상태. 따라서 다른 곳에 추가되던 말던 독립적임.
'개발 > Java' 카테고리의 다른 글
[Java] 정규표현식, Regular Expression (0) | 2019.09.03 |
---|---|
[Java] 데이터 타입 (0) | 2019.08.23 |
[Java] indexOf(int ch), substring() (0) | 2019.08.22 |
[Java] String 다루기 - matches, regex (0) | 2019.08.22 |
[Java] HashMap (0) | 2019.08.21 |
Comments