부트캠프 강의 - 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 |