안녕하세요 기선님 영상 잘봤습니다 질문 두개가 있는데, 하나는 왜 가비지 컬렉터를 호출하는것인가요? 제가 알기론 가비지 컬렉터는 사용하지 않는 변수 혹은 인스턴스의 메모리를 해제하는 것으로 알고있는데 둘의 연관관계를 모르겠습니다. 2번째 질문은 Account account = null로 지정하고 왜 try 부분에서 인스턴스를 할당하는것인가요? 제가 직접 try 부분에 Account account = BrokenAccount(“푸틴”) 으로 완전객체를 만들어서 테스트 해본결과 actual값은 똑같아서요. 기선님이 예제 테스트케이스를 짤때 불완전한 객체로 만들어야 한다는 언질을 남긴거 같아서요, 항상 영상 잘보고있습니다 매번 감사합니다.
finalizer 자체를 사용하는게 예측이 힘들고 위험하기 때문에 개인적으로는 아래 방법을 더 선호합니다. public class Account { private String name; public Account(String name) { this(checkPutin(name)); this.name = name; } private Account(Void checkPutin) { } private static Void checkPutin(String name) { if (name.equals("푸틴")) { throw new IllegalArgumentException("푸틴은 안 돼~"); } return null; } public void transfer(int amount, String to) { System.out.printf("transfer %d from %s to %s.", amount, this.name, to); } }
이펙티브 자바 책을 봐야지봐야지 하면서 계속 미루고만 있었는데, 이렇게 강의로 내주신다면 감사히 수강하겠습니다.
안녕하세요 기선님 영상 잘봤습니다
질문 두개가 있는데, 하나는
왜 가비지 컬렉터를 호출하는것인가요? 제가 알기론 가비지 컬렉터는 사용하지 않는 변수 혹은 인스턴스의 메모리를 해제하는 것으로 알고있는데 둘의 연관관계를 모르겠습니다.
2번째 질문은
Account account = null로 지정하고 왜 try 부분에서 인스턴스를 할당하는것인가요?
제가 직접 try 부분에 Account account = BrokenAccount(“푸틴”) 으로 완전객체를 만들어서 테스트 해본결과 actual값은 똑같아서요.
기선님이 예제 테스트케이스를 짤때 불완전한 객체로 만들어야 한다는 언질을 남긴거 같아서요,
항상 영상 잘보고있습니다 매번 감사합니다.
Finalize 는 gc 돌때 호출됩니다
@@김지훈-x4x 잊고있었는데 드디어 알았네요.. 감사합니다
인터뷰 질문으로 사용하기 좋네요. 감사합니다.
음 이건 너무 심한것 같고요. 이 영상 맨 뒤에 이어지는 영상을 인터뷰 질문으로 쓰시면 좋을 것 같습니다.
준비하시는 강좌가 혹시 The Java 씨리즈의 여러 해킹과 보안에 관한건가요?ㅋ
재미있고 유익하네요!! 감사합니다 ㅎㅎㅎ
예외가 발생하고 gc후 객체가 죽을때 finalize메소드를 실행하는것을 이용해 이체를 한다,,
단, sleep으로 매인객체가 죽는걸 잠시 잡아두는 사이에 이체작업은 끝내야하는거,,,
인가요??
아니 그게 아니구요. 3초는 GC가 실행이 될 수 있도록 시간을 좀 벌어준거죠. System.gc()를 호출한다고 GC가 바로 될거라는 보장이 없어서요.
오 재밌네요
오 영상을 보고 책을 다시 보니 이해가 확실히 잘되네요! 감사합니다~
ㅋㅋㅋㅋㅋㅋㅋ 몰라도 되는데~ 하시는 게 너무 유쾌하십니다 재밌게 봤습니다 선생님!
덕분에 새로운 지식을 알고갑니다.
당연히 오버라이딩 하실줄 알았는대 finalize 상속이라니 생각도 못했습니다.
와 엄청 신기하네요
오... 재밌네요
잠시 해커가 되는 상상을 했네요 재밌는주제의 강의였어용
오..재밌어요 ㅋㅋㅋ
궁금한게 있는데요, Finalizer 공격이 가능케할려면 소스코드 수정 권한이 있어야하는것아닌가요? 소소코드 부분은 어떻게 가능케하나요?
영상은 보시고 나서 질문하시는거죠?
@@keesun.b 아 넵 봤습니다! 제가 질문을 구체적으로 못한것같아서 죄송합니다. 그러니까 제 말의 뜻은 Account를 상속받는 새 클래스를 만든다 하더라도 결국은 코드가 빌드되는 환경 안에 그 클래스가 있어야하지 않나?라는 의문이었습니다.
@@ykc2283 당연히 코딩을 해야 하니까 빌드가 되는 환경이 필요한건 맞는데요. Account 코드를 수정할 필요는 없구요. (영상에서 보여드렸다시피) 이미 빌드되서 컴파일된 클래스 파일만 참조할 수 있으면 (클래스패스에 추가해서) 가능합니다.
@@keesun.b 그렇군요 감사합니다~
재밌네여 ㅋㅋ
재밌네요 ㅋㅋ
finalize attack
final class로 만들거나 class에 finalize를 만들어서 사용
Thread.sleep(mills: 3000L);
이렇게 콜론은 java 몇 버전부터 되는건가요?
통합개발도구인 Intellij 기능이예요. 타이핑한 것이 아닙니다.
@@팡팡-j1e 아 네...감사합니다.
이클립스도 어시스트 뭐시기 기능키면 됨
사용하시는 키보드 모델이 뭔가용?? 소리가 착착 감겨용
매직키보드 입니다 ㅋ
제 계좌도 추가해주세요 🙇♂️
finalizer 자체를 사용하는게 예측이 힘들고 위험하기 때문에 개인적으로는 아래 방법을 더 선호합니다.
public class Account {
private String name;
public Account(String name) {
this(checkPutin(name));
this.name = name;
}
private Account(Void checkPutin) {
}
private static Void checkPutin(String name) {
if (name.equals("푸틴")) {
throw new IllegalArgumentException("푸틴은 안 돼~");
}
return null;
}
public void transfer(int amount, String to) {
System.out.printf("transfer %d from %s to %s.", amount, this.name, to);
}
}