일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 프로그래머스
- 코테준비
- 플러터 개발
- 알고리즘공부
- 기술면접공부
- 스프링부트
- 자료구조공부
- JPA 공부
- Flutter
- 플러터 공부
- nestjs
- nestjs스터디
- Kafka
- 기술공부
- 스프링
- JPA공부
- querydsl
- JPA스터디
- 자바공부
- 스프링공부
- nestjs공부
- JPA
- 스프링부트공부
- K8S
- DDD
- 코테공부
- 스프링 공부
- JPA예제
- 카프카
- Axon framework
- Today
- Total
목록Language/[Java] (91)
DevBoi
JVM C/C++은 컴파일 플랫폼과 타겟 플랫폼이 다를 경우 프로그램이 동작하지 않는다. 크로스 컴파일 : 타겟 플랫폼에 맞춰서 컴파일을 하는 것이다. JVM은 java 소스를 컴파일 하면, 자바 바이트코드로 만들어준다. 자바 바이트코드는 Jvm이 설치된 플랫폼이면 다 정상 작동한다. Java 프로그램 동작과정 1. 프로그램이 실행되면, JVM은 OS로 부터 이 프로그램이 필요한 메모리를 할당 받는다. 2.자바 컴파일러가 자바 소스코드를 읽어, 해당 소스코드를 자바 바이트 코드로 컴파일한다. 3.Class Loader가 동적로딩을 통해 class파일들을 동적 로딩 및 링크하여 런타임 데이터 영역, JVM메모리 영역에 올린다. 4.Execution Engine이 메모리에 올라간 class들을 기계어로 변경..
JVM : 메모리 관리 및 가비지 컬렉터 기능을 수행한다. 가비지 컬렉터 : 동적으로 할당된 메모리 영역중 사용하지 않는 영역을 탐지하여 해제하는 기능이다. 동적으로 할당되었다고 하면, Java의 힙을 얘기하는 것이다. Stack : 정적으로 할당된 메모리 영역 원시 타입의 데이터가 값과 함께 할당, Heap 영역에 생성된 Object타입의 데이터 참조값 할당 Heap : 동적으로 할당된 메모리 영역 모든 Object 타입의 데이터가 할당 Heap영역의 Objecet를 가리키는 참조 변수가 Stack에 할당 쉽게 얘기해서, 저 메인 메소드 내의 로직이 처리 될때 Stack : 원시타입은 값 저장, Wrapper클래스는 참조값만 저장한다. Heap : Object 하위 상속 받는 모든 객체들의 값이 담긴다..
제네릭은 일반적인 이라는 이름, 뭐이름은 중요하지 않고 클래스 내부에서 지정하는 것이 아닌 , 외부에서 사용자에 의해 지정되는 것을 의미한다. 한마디로, 특정 타입을 미리 지정해주는 것이 아니라 필요에 의해 지정할수 있도록 하는 일반 제네릭 타입이라는 것이다. 제네릭의 장점 - 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할수 있다. - 클래스 외부에서 타입을 지정해주기 때문에 타입을 체크하고 변환해줄 필요없이 관리가 편하다. - 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다. 제네릭을 실제로 구현하고있는 것을 예시로 한번 생각해보자 우리가 많이 쓰는 ArrayList가 있다. 이걸 만들고있는 라이브러리를 보면, 제네릭으로 구현이 되어있다. 우리는 ArrayList,..
자바 리플렉션? 반사? 이게 뭥미라는 사람들이 점차 많아진다. 사용방법은 아래와 같다 https://www.baeldung.com/java-reflection https://www.baeldung.com/reflections-library 1. 리플렉션 이란? 자바에서 제공하는 API 로써, 실제로 그 클래스 타입을 알지 못해도, 해당 해당 하는 타입의 메소드와 타입, 변수를 접근 할수 있게 해준다. 2.리플렉션을 왜씀? 자바는 정적언어라, 한계가 많은데 동적으로 필요한 부분을 지원해주기 위해서 해당 API를 제공해준다. 정적 언어: 컴파일 시점에 타입을 결정 ex) Java, C, C++ 등.. 동적 언어: 런타임 시점에 타입을 결정 ex) Javascript, Python, Ruby 등.. 애플리케이..
Java Stream 심화 공부를 해보자, 1.list.parallelStream 의 사용 List에 초기값이 있다고 가정하면, 해당 Stream에 List를 저렇게 병렬로, 즉 각각의 쓰레드 별로, 생성할수 있다.(Stream 객체를) 저렇게 보면, 무슨 차이지? 싶은데, 여러개 혹은 많은 량의 데이터를 생성할떄 해당 쓰레드 별로의 생성은 아주 효과적이다. 2. Unboxing, boxing의 간편을 위해서, Long,double,int에 대한 기본 Stream을 제공한다. 박싱, 언박싱이란 무엇인가? 자바의 자료형은 기본형과 참조형이 있다. Integer과 같은건 기본형이고, int와 같은건 참조형이다. 참조형은 레퍼런스타입이고, 인터페이스와 같은 타입으로, 다양하고 활용가능하게끔 하기위해 사용되는 ..
java 8에서 새로 나온 부분이 있다. 바로 stream, optional이다. 어떤게 좋은지 바로 테스트 해보자 우선 Stream이란, 컬렉션의 요소를 하나씩 처리할수있는 Iteator와 비슷한 기능을 하고, 해당 기능을 수행함으로써, 코드가 간결해지고, 병렬처리를 가능하도록 해준다. ArrayList를 사용해서, 해당과 같이 값을 하나씩 체크를 했다. 이걸 Stream으로 한다면? 누가봐도 간결한 코드를 가진다. int 배열, String 배열을 바꾸는건 어떨까? 주로 배열을 바꿀테니까.. 이렇게 String 배열과 int 배열에 대한 변환을 주면된다. 물론 Stream의 형식이 제네릭 타입이기 때문에, 요런식으로도 가능하다. 다음에는, Stream의 플랫맵이나 기타등등 다양한 사용함수들을 알아보고..
자바 가비지 컬렉션의 동작및 개념에 대해서 알아본다. 우선 가비지 컬렉션이란? 프로그램을 개발하다가, 유효하지 않은 메모리인 가비지가 발생하게되고 C나 다른 언어는 free를 통해, 직접 메모리를 해제해주어야 하지만, java 는 가바지컬렉터가 불필요한 메모리를 알아서 정리해준다. Java 에서는 객체는 대부분 일회성이며, 메모리에 오랫동안 남아있는 경우는 드물다는 전제로 설계되었다. 객체의 생존 기간에 따라 물리적인 heap영역을 나누게 되었고, 이에 따라 Young Old, 총 2가지 영역으로 설계되었다. 1. Young 영역 (Young Generation) 새롭게 생성된 객체가 할당되는 지역이다. 대부분으니 객체가 금방 Unreachable(1회성 상태) 가 되기 때문에 많은 객체가 Young영역..
Stream 공부하면서 많이 나오는 Optional변수 관련 내용을 공부해보자 1. Optional이란? 존재할수도있고 안할수도있고, 즉 nullable한 변수이다. null이 될수도있는 하나의 래퍼 클래스이다. 2. 장점 1. 우선, NPE 유발할수있는 null을 직접 다루지않아도 된다. 2. null Exception 체크를 하지않아도 된다. 방어로직이 준다. 3.사용 이런식으로 .empty()로, 싱글톤으로 이미 생성된 변수이름으로 call할수 있고, Optional.of 로 객체를 넣어서 생성할수도있다. 방법은 다양하지만, Option.of사용시 NPE조심 2. Optional.ofNullable() 로 Optional 변수 생성 이것은 nullable에 대한 처리를 해주는 메소드 이며, 아까 O..
우선 저번에 한 Stream 관련 좀더 상세 사용 예제를 작성할 예정이다. 우선 해당 배열을 List로 변경한뒤에 출력을했다. 순서는 그대로지만, 정렬을 하려면 함수를 하나더 콜해야한다. 이건, 데이터를 직접 바꾸는 일이다. 즉, List객체의 sorting 이 필요할떄마다, sort먹이고 출력 먹이고 출력이다. 굉장히 비효율적이다. 예를들어서, 어디에다가는 오름차순, 어디에다가는 내림차순일때 일일히 데이터를 바꿔야 한다는 단점이 있다. 그럼 이제Stream 객체를 사용해보자 Stream 객체의 장점은 아래와 같다. 객체라기보다는 API이다. 난 부르기 편한대로 부른다. 무튼 Stream APi를 사용하면 아래와 같은 장점이 있다. 1. Stream은 데이터를 직접적으로 변경하지 않는다. 즉 다시말하면,..
1. 제네렉은, 특정 클래스나 함수의 불필요한 타입변형을 막아준다. 대부분 파라미터나, return에 대해서, 특정 타입에 대한 선언을 해주는데, 특정 타입에 대한 정의를 하면 불편한, 공통의 소스들에 대해서는, 이런 제네릭 사용방법이 아주 핵심이다. 바로 쉬운 예를 하나 들어본다. Student라는 클래스이고, 이 하위에 함수를 ShowType으로 하고, 해당 Student 클래스를 생성할때, 해당 파라미터로 생성자를 만든다. 이떄, showtype을 하면, 이떄 생성한 파라미터에 대한 classtype을 보여주게 만들었다. 이렇게 하면, integer든,string이던, 한가지 소스에 student 를 선언할수있다. 2. 와일드 카드 showPrint 메소드를 보자, 해당 메소드에서는 와일드 카드를 ..