컬렉션 프레임워크에서 get()
264
15 asked
ArrayList<String> a = new ArrayList<>();
a.add("1");
a.add("2");
a.add("3");
int[] arr = {1, 2, 3};
arr[0] = 4; // 가능
a.get(0) = "one"; // 불가능위와 같이 배열도 ArrayList 객체도 모두 Reference type입니다. 배열에 대한 인덱스 접근은 r-value, l-value로 모두 기능할 수 있는데 ArrayList에 대한 get()은 r-value(값으로만 사용)로써만 기능하고 있습니다.
get()의 반환형이 E로 제네릭(객체)인데 read only로 취급되는건가요...?
get()으로 해당 위치를 참조하는게 아닌건가요?
해당 메모리가 아닌 메모리의 값을 꺼내오는건가요?
HashMap<String, String> h1 = new HashMap<>();
h1.put("1", "one");
h1.get("1") = "하나"; // 불가능다른 컬렉션 프레임워크지만 동일한 문제입니다.
put(key, value)를 사용해 값을 저장하고 get(key)를 사용해 value를 가져올 때 get()으로 값을 바꿀 수는 없는 건가요?
HashMap<String, ArrayList<String>> hashMap = new HashMap<>();
hashMap.get(date).add(Obj); // 가능이 경우에는 get()으로 참조한 메모리에 대해 다시 참조하여 메서드 사용이 가능했습니다. 이러한 동작이 get()으로 값을 반환하는 것이 아니라 객체 메모리에 접근한다고 생각했습니다.
위에 질문과 함께 조금 더 직관적인 질문 드립니다.
public static void main(String[] args) {
// Calendar calendar = new Calendar();
// calendar.run();
HashMap<String, String> h = new HashMap<>();
h.put("1", "before");
System.out.println(h.get("1").equals("1")); // 참조하여 메서드 동작 확인
h.get("1") = "after"; // 불가능 => 왜 안되는지?
String str = "before";
System.out.println(str.equals("before")); // 참조하여 메서드 동작 확인
System.out.println(str);
str = "after"; // 변경 가능 => 왜 되는지?
System.out.println(str);
}위 코드에서 각각 get()과 참조 변수 자체로 접근하였습니다.
get()으로는 메서드까지는 접근이 가능하나 값 변경이 안되었고
참조변수는 메서드 접근은 물론 값 변경(엄밀히 말하면 참조 변경)까지 되었습니다.
이유가 궁금합니다.
감사합니다.
Answer 2
0
예... 객체의 경우 참조변수가 반환되는것이고, 그 경우 값을 넣는것은 허용되지 않습니다. C++ const 키워드를 생각하시면 되겠네요~
0
get() 메서드의 경우는 컬렉션 요소의 값을 가져오는 기능을 합니다. help를 보시면 반환값이 <E> 인것을 보실 수 있는데 이는 그 값을 반환하겠다는 의미입니다. 반환된 값은 객체나 기본 테이터인 경우 그 값인데, 그 값에 무언가를 넣은다는것은 가능하지 않습니다. 마치 1 = 3; 과 같은 결과가 되는 것입니다. 따라서 값을 넣을때는 해당 메모리에 값이 대입되는 메서드를 사용하는 것이 맞습니다. 말씀하신대로 변수인 경우는 l-value와 r-value가 모두 가능하지만, 상수인 경우는 l-value가 안되는것과 같은 경우입니다.
0
감사합니다!
말씀하신 "반환된 값은 객체나 기본 테이터인 경우 그 값인데"의 부분에서 객체의 경우 내부적인 값은 객체 메모리 주소의 형태로 참조가 반환되는 것이고 primitive type인 경우 stack에 저장된 값 그 자체가 반환된다로 이해해도 괜찮을까요?
즉 C/C++ 기준으로 reference type인 경우 주소 상수가 반환되고 prmitive인 경우 값이 반환됨로 생각해도 될까요?
싱글턴패턴
0
8
1
이진 탐색 문제 질문드립니다
0
248
1
ChatRoom에서 synchronized 사용 이유
0
478
1
미로찿기 질문드립니다
0
304
2
socket 질문드립니다
0
280
1
지역 내부 클래스 질문드립니다.
0
204
1
큐 구현하기 질문드립니다
0
322
2
수업자료
0
175
1
섹션 1 - 1 equals 재정의 하면 왜 hashcode도 재정의 해야하는지..
0
237
1
synchronized 과정
0
201
1
awt 패키지 접근 불가 에러
0
518
1
iterator 관련 질문입니다.
0
239
1
수업 중간에 메소드 정의 보시는거 어떻게 하는지 알 수 있을까요?
1
287
2
예외처리 질문드려요
0
393
1
멀티 쓰레드 동기화 관련 질문입니다!
1
407
1
Generic 강의중 궁금한점
0
377
1
여러 가지 보조 스트림 클래스들
0
314
1
교재내용
0
334
1
힙메모리
0
443
1
미로찾기 문제에 VISIT의 쓰임
1
485
2
입출력 스트림 질문입니다.
0
271
1
알고리즘 강의는 무슨언어로 진행하시나요? 혹시 자바로 하시나요?
0
401
2
강의 화면의 깃랩은 어떻게 들어가나요?
0
686
2
강의가 잘못 업로드 되어 있습니다.
1
425
2

