BackEnd/Java13 [Java] static inner class 는 언제 로드, 초기화가 될까? 최근 코코아 과정 수업도중에 질문받은 내용중 인상깊었던 질문을 조금더 정리해볼까 한다. 학생분이 질문했을때 나 또한 순간 static 키워드에 생각이 쏠려서 "왜? 맨처음 초기화가 안된거지?"라는 생각에 빠졌는데... 가장 큰 키워드를 생각 안하고있었다... "Inner Class"라는 점.... 이점만 다시 상기하면 다행이 나의 설명이 틀리지는 않았었다! (진짜 사람이 순간 당황하니까 진짜 내가 알고있던 지식이 왜곡 되는 느낌이였다.... ) 우선 문제가된 singleton 코드를 잠시 살펴본후, 이에 대하여 알아보자! 1. LazyHolder 방식의 singleton public class OuterSingleton { private OuterSingleton() { } public static Ou.. BackEnd/Java 2022. 11. 16. [Java] 동일성(identity)과 동등성(equality) 팀원들과 면접 스터디를 진행중인데, 한번쯤 정리하면 좋은 내용이라 생각되어 정리해본다. 1. 동일성(identity) 우선 다음 그림을 살펴보자. 변수 1은 객체1을 가리키고 있고, 변수2 와 변수3은 객체2를 가리키고 있다. 즉, 변수2 와 변수3은 동일한 객체를 가리키고 있으므로, 두 변수는 동일하다고 이야기할 수 있다. 그리고 해당 변수가 동일한지 == 연산자를 통해 판별할 수 있다. 참고로 Primitive 타입은 주소가 없으므로 == 연산자를 사용하였을 때 내용이 같으면 동일하다고 판단한다. 2. 동등성 (equality) 두 개의 객체가 같은 정보를 갖고 있는 경우 동등하다고 판단한다. 즉, 참조하고 있는 객체의 주소가 서로 다르더라도 내용만 같으면 두 변수는 동등하다고 말할 수 있다. Jav.. BackEnd/Java 2022. 9. 6. [Java] Annotation Processor 이번시간에는 Lombok이 어떻게 동작하는지 그 핵심원리인 annotation processor에 대하여 학습해보자! 1. Lombok의 원리 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 annotation processor 는 compile 할때 중간에 끼어들어서 특정 annotation 이 붙어있는 소스코드를 참조하여 추가적인 소스코드를 삽입시킬 수 있다! 소스코드의 AST(abstract syntax tree)를 조작하는 것 이다! https://javaparser.org/inspecting-an-ast/ Inspecting an AST Inspecting an AST javaparser.org 원래는 AST 의 정보는 참조만 할 수 있고, 소스 코드를 조작할수는.. BackEnd/Java 2022. 6. 8. [Java] Dynamic Proxy 1. Spring Data JPA는 어떻게 동작할까? " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번글의 가장 큰 주제는 Spring Data JPA에서 다음과 같은 코드들이 어떻게 구현체를 만드는지 이다! public interface BookRepository extends JpaRepository {} 어떻게 interface만 정의했는데, 객체의 CRUD 가 작동할까? 도대체 누가 BookRepository 타입의 객체를 누가 만들어주는 것 일까! 이에 대한 핵심이 바로! Proxy 라는 class 이다! Spring AOP를 기반으로 동작하며 RepositoryFactorySupport에서 프록시를 생성한다. 저 빨간 박스 안에서 Proxy를 생성하여 반환하.. BackEnd/Java 2022. 6. 7. [Java] Reflection 이번 글은 Spring의 DI(의존성 주입)이 어떻게 동작하는 것 일까? 란 의문으로부터 공부한 글 입니다. 여러 블로그와 백기선님의 더 자바 강의를 살펴보며 정리한 글 입니다. 1. 리플렉션 API 1부 : 클래스 정보 조회 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Reflection은 Class를 통해서 접근할 수 있다. Class (Java Platform SE 8 ) Determines if the specified Class object represents a primitive type. There are nine predefined Class objects to represent the eight primitive types and void. These .. BackEnd/Java 2022. 5. 22. [Java] 바이트코드 조작하기 소스코드의 커버리지를 측정하는, 가령 Jacoco와 같은 tool들이 바이트코드를 이용하여 측정한다. 이러한 소스코드 커버리지는 내 전체 소스코드에서 얼만큼을 테스트로 커버 했는지? 를 알려주는 유용한 도구이다. 이번 시간에는 이러한 바이트코드를 직접 조작하는 방법에 대하여 공부하는 글이다! 1. Jacoco를 통한 코드 커버리지 측정 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 간단하게 Jacoco를 사용하는 것부터 확인해보자. 테스트 해볼 간단한 코드는 다음과 같다. public class MeetUp { private int maxNumberOfAttendees; private int numberOfEnrollment; public void addPerson.. BackEnd/Java 2022. 5. 20. [Java] JVM 구조 1. JVM, JDK, JRE " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번에는 JVM, JRE, JDK의 차이점에 대하여 알아보자. 1-1) JVM (Java Virtual Machine) 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행하는 역할을 합니다. 그럼 자바 바이트 코드는 무엇일까? 우리는 기본적으로 Hello.java 와 같이 java 파일을 만든다. 이를 컴파일한것이 바이트 코드이다. 이를 다음 명령을 통해서 compile 해보자. javac Hello.java 실행 결과를 보면 compile된 class 파일을 확인할 수 있다. 이를 JVM을 통해서 OS가 이해할 수 있는(.. BackEnd/Java 2022. 5. 19. [Java] equals, hashCode 를 같이 구현하는 이유 이번글은 "Java에서 equals 와 hashCode를 왜 같이 구현할까?" 라는 의문에 대한 스스로의 답을 정리하는 글 입니다! 1. equals 만 재정의 할 경우 우선 설명에서 사용할 Item class를 살펴보자. public class Item { private String name; public Item(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item item = (Item) o; return Objects.equals(name, item.. BackEnd/Java 2022. 5. 8. [Java] Java 에서의 Thread, Light Weight Process 1. Green Thread Model (many-to-one) JVM 1.3 이전에는 JVM 내부적으로 스레드 모델을 가지고 있어 자체적으로 개발자가 멀티스레드 코드를 작성하여 실행하면 user thread가 실행된다. 이를 green thread model이라고도 부른다. 이러한 모델은 어떠한 OS의 지원없이 완벽하게 JVM으로부터 관리되는 방식이다. user thread는 개발자 입장에선 thread이지만 실제 하드웨어, 운영체제와 상관없이 JVM이 관리하는 thread로 실행되었다. 또한 한번에 단 한개의 user thread 만이 처리가 될 수 있기 때문에 이러한 모델을 many-to-one 모델이라 부른다. 이러한 many-to-one 모델인 green thread model 은 multi-c.. BackEnd/Java 2022. 3. 30. [Java] Exception 기초 2종류의 Exception " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Unchecked Exception – RuntimeException을 상속 Runtime Time Exception 이라고도 부른다. Exception이 발생하는 메소드에서 throws 키워드를 추가하거나, try-catch로 Exception을 처리할 필요가 없다. Exception을 처리해 줘도 상관은 없다. 컴파일 시점에 Exception을 catch하는지 확인하지 않는다. 컴파일 시점에 Exception이 발생할 것인지의 여부를 판단할 수 없다. Checked Exception과 Unchecked Exception 선택 방법 호출하는 메소드가 Exception을 활용해 무엇인가 의미 있는 .. BackEnd/Java 2022. 2. 23. [Java] StringBuilder와 StringBuffer의 차이 1. 글을 작성한 목표 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 Java에서 String 클래스는 불변성을 갖습니다. 따라서 변하지 않는 문자열을 자주 사용하는 경우엔 좋은 성능을 기대할 수 있습니다. 하지만 문자열에 대한 변경이 자주 일어나는 프로그램에서 String만 사용하게 된다면 효율적인 성능을 기대하기 어렵습니다. 이를 해결하기 위해 StringBuilder , StringBuffer을 사용하면 효율적인 성능을 보일 수 있습니다. 언제 StringBuilder를 사용하는지?, 또 언제 StringBuffer을 사용하는지? 에 대하여 살펴봅시다. 우선 String 부터 살펴봅시다. 2. String " data-ke-type="html"> HTML 삽입 미리.. BackEnd/Java 2022. 2. 14. [Java] 람다와 익명클래스의 scope 주말에 팀 slack에 재미있는 내용이 올라와 공부후 정리해 본다. 1. 문제 상황 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 내가 읽었던 유명한 자바 책 에서는 람다는 익명클래스 라고 나와있었다. 이는 틀린말이 아니다. 다만 정확하게 "익명클래스 == 람다" 가 아니라는 점에서 문제점이 발생한다. 다음 예시를 살펴보자. anonymous 는 익멱 클래스를 활용한 코드이며, lambda는 람다식을 활용한 코드이다. 두 코드 하는 역할은 동일한데, lambda 쪽에서 number 라는 변수를 사용할려 할면 문제가 발생한다. (" 'number' 라는 변수는 초기화 되어있지 않기 때문" 이라는 경고를 보여준다) 다음 코드의 일부를 살펴보자. private final in.. BackEnd/Java 2022. 1. 23. 이전 1 2 다음