inflearn logo
강의

講義

知識共有

Java基礎からマスターする with ウンジョン先生 (Do it Javaプログラミング入門) - Part 2(マスター編)

様々なデータ構造について調べてみましょう。

컬렉션 프레임워크에서 get()

264

yongtech54

投稿した質問数 15

0

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"; // 불가능
  1. 위와 같이 배열도 ArrayList 객체도 모두 Reference type입니다. 배열에 대한 인덱스 접근은 r-value, l-value로 모두 기능할 수 있는데 ArrayList에 대한 get()은 r-value(값으로만 사용)로써만 기능하고 있습니다.

 

HashMap<String, String> h1 = new HashMap<>();
h1.put("1", "one");
h1.get("1") = "하나"; // 불가능
  1. 다른 컬렉션 프레임워크지만 동일한 문제입니다.

    put(key, value)를 사용해 값을 저장하고 get(key)를 사용해 value를 가져올 때 get()으로 값을 바꿀 수는 없는 건가요?

     

HashMap<String, ArrayList<String>> hashMap = new HashMap<>();
hashMap.get(date).add(Obj); // 가능
  1. 이 경우에는 get()으로 참조한 메모리에 대해 다시 참조하여 메서드 사용이 가능했습니다. 이러한 동작이 get()으로 값을 반환하는 것이 아니라 객체 메모리에 접근한다고 생각했습니다.

 

  1. 위에 질문과 함께 조금 더 직관적인 질문 드립니다. 

    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()으로는 메서드까지는 접근이 가능하나 값 변경이 안되었고

참조변수는 메서드 접근은 물론 값 변경(엄밀히 말하면 참조 변경)까지 되었습니다.

이유가 궁금합니다.

 

감사합니다.

java 객체지향 알고리즘

回答 2

0

eunjong

예... 객체의 경우 참조변수가 반환되는것이고, 그 경우 값을 넣는것은 허용되지 않습니다. C++ const 키워드를 생각하시면 되겠네요~

0

yongtech54

아! const 참조변수의 형태로 반환된다는 말씀이네요!

C++로 설명을 도와주시니 더 명확히 이해됐습니다! 감사합니다!

0

eunjong

get() 메서드의 경우는 컬렉션 요소의 값을 가져오는 기능을 합니다. help를 보시면 반환값이 <E> 인것을 보실 수 있는데 이는 그 값을 반환하겠다는 의미입니다. 반환된 값은 객체나 기본 테이터인 경우 그 값인데, 그 값에 무언가를 넣은다는것은 가능하지 않습니다. 마치 1 = 3; 과 같은 결과가 되는 것입니다. 따라서 값을 넣을때는 해당 메모리에 값이 대입되는 메서드를 사용하는 것이 맞습니다. 말씀하신대로 변수인 경우는 l-value와 r-value가 모두 가능하지만, 상수인 경우는 l-value가 안되는것과 같은 경우입니다.

0

yongtech54

감사합니다!

말씀하신 "반환된 값은 객체나 기본 테이터인 경우 그 값인데"의 부분에서 객체의 경우 내부적인 값은 객체 메모리 주소의 형태로 참조가 반환되는 것이고 primitive type인 경우 stack에 저장된 값 그 자체가 반환된다로 이해해도 괜찮을까요?

 

즉 C/C++ 기준으로 reference type인 경우 주소 상수가 반환되고 prmitive인 경우 값이 반환됨로 생각해도 될까요?

싱글턴패턴

0

3

1

이진 탐색 문제 질문드립니다

0

248

1

ChatRoom에서 synchronized 사용 이유

0

477

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