부트캠프 강의 - java
1. 문제
   - override가 동적 바인딩이라고 불리는 이유?

2. 시도
   - Superclass s = new SubClass(); s.f(); 일 때, s.f()가 SubClass의 f함수가 호출됨

3. 해결
   - 컴파일 단계에서는 s.f()는 SuperClass에 f()가 있으므로 문제가 없다고 인식하고 컴파일 완료
   - 이 후 런타임 시점에 s.f()를 실행할 때, 먼저 jvm은 s를 힙에서 찾음
   - s의 타입은 SuperClass이므로 먼저 상위타입에서 해당 메서드를 찾음
   - 그런 후, 이 인스턴스가 상속관계이므로 하위타입에서 f()가 재정의 되어있다는 것을 확인하고 아래 메서드를 찾아서 실행
   - 이렇게 런타임시에 호출하는 메서드를 동적으로 찾아서 결정하는 것을 '동적바인딩'이라고 부름

4. 알게된 점
   - overloading은 컴파일 시점에 호출하는 메서드를 찾아 결정하기 때문에 '정적바인딩'
   - overriding은 런타임 시점에 호출하는 메서드를 찾아 결정하기 때문에 '동적바인딩'
1. 문제
   - 람다 캡처링에 대해 자세히 알아보자

2. 시도
   - 람다 내부에서 지역변수를 사용할 때, 사용하려는 지역변수는 final이거나 effectively final이어야 함(지역변수의 값이 바뀌면 안됨)
   - 이유가 뭘까

3. 해결
   - 가장 먼저 JVM 메모리 구조에서 지역변수는 stack에, 인스턴스는 heap에 생성됨
   - 람다도 결국 인스턴스임. 따라서 heap에 생성됨
   - 따라서, 지역변수와 람다는 생성과 소멸 주기가 다름
   - 지역변수는 stack에서 사라졌지만, 람다는 heap에 여전히 남아있을 수 있음. 그래서 람다에서 사라진 지역변수를 참조하려고 하면 에러가 남
   - 그래서 java에서는 이러한 문제를 해결하기 위해 '람다 캡처링'을 사용함
   - 람다에서 사용하려는 지역변수를 '캡처(복사)'해서 사용함
   - 그리고 람다를 생성하는 시점과 쓰레드에서 실행하는 시점이 다를 수 있는데, 그 사이에 지역변수 값이 바뀌게 되면 문제가 발생할 수 있음
   - 그래서 람다에서 사용하는 지역변수는 final이거나 effectively final이어야 함

4. 알게된 점
   - 람다 캡처링을 알기위해서는 jvm 메모리 구조부터 중요하다
   - 기본기는 배신하지 않는다

코테준비

1. 백준 15683 - 감시

: CCTV를 어떻게 둘러보는지를 표현하는게 관건이었던 문제. 나머지는 편안한 재귀였다

 

2. 백준 17825 - 주사위 윷놀이

: map자체를 표현하는 게 관건이었던 문제. 나머지는 재귀 후 시뮬레이션하는 문제였다


오늘 하루도 고생했다

'TIL(Today I Learned)' 카테고리의 다른 글

2023.08.07  (0) 2023.08.07
2023.08.04  (0) 2023.08.04
2023.08.02  (0) 2023.08.02
2023.08.01  (0) 2023.08.01
2023.07.31  (0) 2023.07.31

+ Recent posts