이론 정리/java 60

java의 Atomic Type(AtomicInteger, AtomicBoolean)

java의 Atomic Type(AtomicInteger, AtomicBoolean) 멀티 쓰레드 환경에서는 주로 동시성 문제 해결을 위해 다양한 방안이 도입된다. 그중 유명한 것들이 synchronized, volatile, 그리고 Atomic이다. Atomic?? CAS 일단 Atomic Type은 CAS(Compare And Swap)알고리즘을 사용한다. 이게 뭐냐면... 변수의 값을 변경하기 전에 기존에 가지고 있던 값이 예상하던 것과 같은 경우에만 새로운 값으로 할당하는 방법 예를 들자면 public class AtomicExample { int val; public boolean compareAndSwap(int oldVal, int newVal) { if(val == oldVal) { val..

이론 정리/java 2023.01.09

lambda에서의 지역 변수 final, effectively final

lambda에서의 지역 변수 lambda식에서 지역 변수는 final의 특성을 가져야 한다. 즉, 람다식에서 지역변수를 읽어오는 것은 가능하지만, 값을 변경하는 것은 불가능해야 한다는 것이다. final, Effectively Final 한번 일단 작성해보자 @FunctionalInterface public interface SumInterface { public int sum(int x, int y); }이런 FunctionalInterface가 있고 public void test() { int a = 5; int b = 10; SumInterface si = (x, y) -> (x+y); int ans = si.sum(a, b); System.out.println(ans); }이런 식으로 sum을 해..

이론 정리/java 2023.01.09

메서드 참조

메서드 참조(Method reference) 하나의 메서드만 호출하는 람다식은 메서드 참조로 더 간단히 할 수 있다. 종류 람다 메서드 참조 static메서드 참조 (x) -> ClassName.method(x) ClassName::method 인스턴스메서드 참조 (obj, x) -> obj.method(x) ClassName::method 특정 객체 인스턴스메서드 참조 (x) -> obj.method(x) obj::method 사용법은 그냥 클래스이름::메서드이름 으로 적어주는거임. 저중에서 특정 객체 인스턴스메서드 참조는 잘 안쓰이고, 위의 두개가 쓰인다. Static 메서드 참조 Integer method(String s) { // 그저 Integer.parseInt(String s) 만을 호출 r..

이론 정리/java 2023.01.08

람다식이란??

람다식이란?? 메소드를 하나의 식으로 표현한 것. 익명 함수(annonymous function)이라고도 한다. 이를 사용하면 기존의 함수를 간단하고 명확한 식으로 표현할 수 있게 된다. 함수형 언어 JDK1.8부터 함수형 언어의 기능을 java가 지원하기 시작했다. 그래서 java는 oop언어임과 동시에 함수형 언어의 기능을 포함하고 있다. 람다식이란?? 1. 함수(메서드)를 간단한 식으로 표현하는 방법이다. 예를 들어 // 메서드 int max(int a, int b) { return a > b ? a : b; }요런 애를 // 람다식 (a, b) -> a > b ? a : b이런 식으로 간단하게 표현하는 것이다. 2. 람다식은 익명 함수(anonymous function)이다. 위의 예시에서 볼 수..

이론 정리/java 2023.01.07

함수형 인터페이스

함수형 인터페이스 단 하나의 추상 메서드만 선언된 인터페이스 에를 들면 interface MyFunction { public abstract int max(int a, int b); }이런 식으로 하나의 추상 메서드만 선언된 것을 말한다. 참고로 이거에다가 @FunctionalInterface 라는 어노테이션을 붙이면 컴파일러가 이친구가 제대로 작성된 추상 메서드인지 확인해준다. -> 엥간하면 이거 붙이자. 그래서 이 함수형 인터페이스 로직을 구현해 주면 MyFunction f = new MyFunction() { public int max(int a, int b) { return a > b ? a : b; } };이렇게 될 것이다. 이를 활용해서 람다식의 참조변수로 쓸 수 있는데 int value = ..

이론 정리/java 2023.01.07

logging - java에서 System.out.println()을 왜 사용하면 안될까??

logging - java에서 System.out.println()을 왜 사용하면 안될까?? 보통 현업에서 일할때에 절대 System.out.println()을 쓰지 말라는 말을 듣는다. -> 가급적 쓰지말자~ 가 아니라 절대다!! 대신 로깅을 진행할 때에는 주로 얼마전에 문제가 있었던 Log4j를 사용하고는 한다. 왜일까?? Sync문제 발생 한번 System.out.println()의 구현 코드를 살펴보도록 하자. 다양한 내부 코드들이 있는데, 이거는 보면 동작 과정에서 synchronized를 사용해서 동기화를 걸어준다.(writedln도 물론 synchronized가 걸려있는것을 확인 가능하다.) 즉, 해당 코드가 작동할 때에 다른 쓰레드는 작동이 불가능하다는 것이다!! 따라서 이 System.o..

이론 정리/java 2023.01.06

java 깊은복사 vs 얕은복사(feat.clone)

깊은복사 vs 얕은복사(feat.clone) 간단하게 말하면 얕은복사 객체의 주소값을 복사함 깊은복사 객체의 실제 값을 복사함 이거임. 솔직히 뭐 딱히 쓸말이 없긴하다... 그래도 좀 상세히 알아보아요 얕은복사 먼저 얕은복사이다. @Getter @Setter @AllArgsConstructor public class Person { private String name; private int iq; }이런 식으로 Person이라는 객체를 선언해 줄 것이다. 그리고 @Test public void 복사() { Person person = new Person("류찬", 200); Person ryoochan = person; ryoochan.setIq(300); System.out.println("본래의 Ob..

이론 정리/java 2023.01.02

ThreadLocal - 쓰레드로컬 이란?

ThreadLocal - 쓰레드로컬 이란? Comment 이름 그대로… 쓰레드 단위 로컬 변수 할당임ㅇㅇ 사실 이 Thread local에 대해서는 잘 몰랐는데, 놀랍게도 java1.2버전부터 제공되고있던 유서깊은 클래스였다고 한다. 그게 뭔데 일단 보통 java에서는 멀티 쓰레드를 이용해 한번에 작업을 처리해서 성능상의 이점을 얻을 수 있다. 근데 이 멀티 쓰레드 간에 리소스를 어떻게 공유해야 할지, 그리고 그 리소스의 동시성 문제를 어떻게 해결할 수 있을지 고민해야 한다. 그 방안 중 하나가 바로 Thread local이다. 그거 어떻게 하는건데. 일단 ThreadLocal의 내부는 Map구조를 갖고 있는데, key - thread정보, value - 변수 요렇게 저장한다. 그래서 각각의 쓰레드는 자..

이론 정리/java 2022.12.28

java의 Equals and HashCode(feat. HashMap)

Equals and HashCode(feat. HashMap) 보통 Spring boot를 사용할 때에 class에서 equals랑 hashcode를 같이 정의하고는 한다. 그리고 lombok에는 아예 @EqualsAndHashCode 라는 애가 있어 두개를 같이 사용할수도 있다. 그럼 이녀석들이 무엇일까? Default 먼저 이런 class를 정의해 주자. 해당 class는 RyooChan의 intelligence와 look을 인자로 갖고 있다. 이런 식으로 Object를 가져와서 값이 동일한지를 검사해 준다. Test결과 두 객체는 서로 다르다. 참고로 저거 equals를 조금 공부해 봤으면 아니 얘는 값을 비교하는건데 왜 달라?? 라고 생각할 수 있을거같은데 Object를 equals를 비교하면 요..

이론 정리/java 2022.12.25

java hashmap의 시간복잡도에 관해서

HashMap은, Map인터페이스의 컬렉션 중 하나이다. 이 HashMap은 key-value로 하나의 key가 하나의 value를 갖도록 한다. 이전에 ArrayList와 LinkedList의 차이점에 대한 글을 작성한 적이 있다. 각각의 내용들에 대해서 생각해 보면, 두 자료구조 모두 값을 읽어오거나 변경할 때에 시간복잡도를 고려해줄 필요성이 있었다. 근데 이 HashMap은 값을 넣거나 변경할 때 모두 시간복잡도가 O(1)이다!! 이게 어떻게 가능할까? Put의 시간복잡도 HashMap의 동작 방식 위에서 설명하였듯 HashMap은 하나의 key가 하나의 value를 갖는다. 이 key를 찾아가기 위해서 어떠한 key가 입력되면 java에서는 이곳에 해시함수를 적용시켜 고유 index를 만든다. 예..

이론 정리/java 2022.12.25