728x90
반응형

Java 27

effectively final 및 lambda capturing에 대해 톺아보기

개요 당연하게 사용하던 Java의 람다 기능에 대해서 의문을 갖지 않고 막 써댔다. 그렇지만, 면접에서의 질문을 받았을 때 당황했다. 뜬금포로 final을 쓰고 안쓰고의 차이를 물어보셨는데 순간 답변을 하지 못했다. 그래서 정리해본다. 람다 캡쳐링에 대해서 알아보기 이전에 Effectively final에 대해 먼저 알아보자. Effectively Final 이란? 해당 단어를 deepL을 통해 해석해보면 사실상 최종 이라고 해석해준다. final을 선언한 상수와 같이 변경되지 않았다면 그와 같은 수준으로 컴파일러가 해석해준다. effectively final이 되려면 아래의 3가지 조건을 만족해야 한다. 아래 3가지 조건은 공식문서를 통해서 나와있는 정보들이다. 명시적인 final을 선언하지 않았다. ..

Java 2023.12.08

참조 유형

이펙티브 자바를 읽다가 약한참조에 대한 이야기가 나와서 포스팅한다. 참조에는 아래 4가지가 존재한다. Strong References (강한 참조) Soft References (소프트 참조) Weak References (약한 참조) Phantom References (팬텀 참조) 이 해당 참조 유형에 따라 GC 실행 대상여부, 시점이 달라진다. 강한참조 new 연산자를 사용하여 객체를 인스턴스화 하고 참조하는 방식. 참조가 해제되지 않으면 GC의 대상이 되지 않는다. Test test = new Test(); 해당 test라는 변수가 참조를 가지고 있다면 GC의 대상이 되지 않는다. test = null이 되는 순간 GC의 대상이 된다. 소프트참조 대상 객체의 참조가 SoftReference만 있다면..

Java 2022.09.12

Checked Exception, Unchecked Exception

예외를 알아보기 전에 에러와 예외의 차이부터 알아보도록 하자. 에러 일단 에러(Error)는 시스템이 비정상적인 상황에 발생하게 된다. 수습할 수 없는 상황에 놓이게되어 개발자가 예측하지 못한경우이다. 예외 예외는 개발자가 구현한 로직에서 발생된 실수나 사용자의 영향이 미쳐 발생하게 되는 것이다. 그렇기에 미리 예측해서 방지할 수가 있다. 이펙티브 자바를 회독하며 스터디를 진행하면서 2장에 IllegalArgumentException이 나오게 되어 이 예외 부분을 정리하게 됐다. Checked, Unchecked Exception 기본적으로 오류, 예외는 Object를 상속받는 Throwable클래스를 상속받아 구현이 되어있다. 이미지 출처 - https://www.programcreek.com/2009..

Java 2022.09.07

변성

자바 변성 (Variance) 자바의 가변성에는 크게 공변, 무공변, 반공변이 존재한다. 제네릭을 잘 사용하려면 이 가변성에 대한 이해가 필요하다. 변성을 제대로 이해하려면 "타입 S가 T의 하위 타입일 때, Box[S]가 Box[T]의 하위 타입인가?" 라는 질문에서 시작하는게 좋다. 배열은 공변, 제네릭은 무공변이 기본이라고 다들 알고 있을 것이다. 무공변 (Invariance) or 불공변 기본적으로 제네릭은 무공변이다. 무공변이라고 하니 헷갈리는것 같다. 사전적으로 번역해보면 불공변으로 나오게 된다. 타입 S가 T의 하위 타입일 때, Box[S]와 Box[T] 사이에 상속 관계가 없는 것 쉽게 말하면 너는너, 나는 나 인 느낌이다. 그래서 선언한 유형만 들어갈 수 있게 코드를 구성할 수 있다. O..

Java 2022.08.11

일급 컬렉션

일급 컬렉션 일단 나는 넥스트스텝의 TDD, Clean Code with Java 12기를 하면서 여기서도 일급 컬렉션을 사용했었다. 참 웃겼던건 이것을 조금 응용을 했었어야 했는데 개념 자체도 자세하게 정리가 덜 된것 같았다. 도메인에서부터 차근차근 만들어가는 것에서는 어느정도 생각이 잘 들었지만, 기존 레거시 코드에 이런게 적용되어 있지 않고 뚱뚱하게 로직이 작성되어 있으면 그냥 넘어갔던게 흔했다. 객체지향 생활체조 원칙 소트웍스 앤솔러지에서 발췌된 객체지향 생활체조 원칙이다. 규칙 1: 한 메서드에 오직 한 단계의 들여쓰기만 한다. 규칙 2: else 예약어를 쓰지 않는다. 규칙 3: 모든 원시값과 문자열을 포장한다. 규칙 4: 한 줄에 점을 하나만 찍는다. 규칙 5: 줄여쓰지 않는다(축약 금지)...

Java 2022.08.09

변수

여기서 나오는 모든 예제는 깃허브에 있다. 📌 변수 변수는 값을 저장하는 공간이다. 📌 변수란? 프로그래밍에서의 변수란, 값을 저장할 수 있는 메모리상의 공간이라고 한다. 이 공간에 저장된 값은 변할 수 있기 때문에, 변수라고 이름이 붙여졌다. 변수란, 단 하나의 값을 저장할 수 있는 메모리 공간 그렇기 때문에, 새로운 값을 저장하면 기존의 값은 날아가게 된다. 📌 변수의 선언과 초기화 📌 변수의 선언 변수의 선언 방법은 public class Class { int age; // age라는 이름의 변수 선언 // int : 변수 타입 // age : 변수 이름 } 변수 타입은 변수에 저장될 값이 어떤 타입인지를 지정해주는 것이다. 변수 이름 변수의 이름이다. 이 변수 이름 은 메모리 공간에 이름을 붙여주..

Java 2022.08.07

상태 패턴 적용

스테이트 패턴 적용기 모든 코드는 깃허브에 있음을 알린다. 현재 패스트캠퍼스의 디자인 패턴 강의를 수강도 하고있고, 동시에 디자인 패턴에 대한 책도 한권 읽었었다. 그러니까 메인 메소드만 있는곳에서 디자인패턴을 적용하여 연습을 조금 했었다. 그리고 프로젝트에 도입을 했었는데 약간 2% 부족한 패턴이 탄생했었다. 지금에서의 완벽한 디자인패턴 프로젝트를 통해서 유저 포인트를 조건에 따라 변경해주는 로직이 있었다. 자... 예전의 나는 보잘 것 없었다. ㅋㅋㅋㅋ 이게 그때 당시의 나에겐 최선이었을지도?? 아무튼 각설하고 저 로직을 이제 바꿔보려고 한다. 해당로직의 bean이라는 객체는 단지 저 포인트와 해당 유저의 아이디만 가지고 있는 일종의 DTO이고, 네이밍마저 가독성을 해쳤다. 이제부터 리팩토링 과정을 ..

Java 2022.08.07

프로젝트 리팩토링

Querydsl 지금 현재 리팩토링을 진행중인 프로젝트가 있는데, 내가 스터디를 했던 JPA를 적용시켜 Mybatis에서 JPA로 이전작업을 하는 중에 생각했던것 보다 QueryDSL을 더 많이 사용하는 것 같다. 많은 분들이 올리신 JPA와 같이 쓰는 QueryDSL은 별도의 support클래스를 만들어서 할당하는 방식으로 사용했다. 나는 그런데 조금 다르게 설정을 했다. 커스텀 인터페이스 구성 공식문서의 4.6.1챕터 에서 보면 Querydsl을 같이 사용하려면 해당 엔티티 Repository인터페이스에 다중상속으로 RepositorySupport 인터페이스를 상속해주고 RepositorySupportImpl에서 Support 인터페이스를 구현해주었다. 이렇게 말이다. @Repository publi..

Java 2022.08.07

디자인 패턴 - Bridge Pattern

모든 코드는 깃허브에 있다. Bridge 패턴이란? 브릿지 패턴은 구현부에서 추상층을 분리하여 각자 독립적으로 변형 및 확장이 가능하도록 만드는 패턴이다. 이렇게 보면 너무 추상적인 문장이었다. 기능과 구현에 대해 두개의 별도 클래스로 구현한다. Bridge의 뜻은 다리이다. 다리가 떨어진 장소를 연결하듯이 Bridge 패턴도 두 장소를 연결하는 역할을 한다고 보면된다. 이것이 Bridge 패턴의 핵심이다. 다리역할을 해주는 두 곳은 기능 클래스 와 구현 클래스 이다. 두가지 경우로 나눠서 생각해보자. 새로운 기능을 추가하고 싶은 경우 새로운 구현을 추가하고 싶은 경우 어떤 새로운 클래스 ex가 있다고 예를 들자. 이 ex 클래스에 새로운 기능(=새로운 메소드)를 추가하고 싶을 때 어떻게 할것인가? 여기..

Java 2022.08.07

Oauth 이슈

진행중인 사이드 프로젝트에서 생겼던 이슈를 정리합니다. 모든 코드는 깃허브에 있습니다. 스터디 위키 정리중에창훈님께서 스프링 시큐리티에 대한 정보를 공유해주셨습니다. 그안에 포함되어있는 스프링 시큐리티 Oauth2에 대해서 포스팅을 해볼 것입니다. Oauth 란? OAuth는 인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준입니다. 이 매커니즘은 여러 기업들에 의해 사용되는데, 저희 서비스로 생각한다면 구글, 카카오, 애플, 깃허브, 페이스북 들이 있으며 사용자들이 타사 애플리케이션이나 웹사이트의 계정에 관한 정보를 공유할 수 있게 허용해줍니다. OAuth인..

Java 2022.08.07
728x90
반응형