Programming Languages(47)
-
[Java] Lombok 사용 시 주의사항
문제 상황 Lombok은 Java 기반의 라이브러리로 getter/setter, toString, equals, hashCode 등 여러 반복적이고 귀찮은 코드들을 애너테이션 선언만으로 컴파일 시점에 바이트 코드를 조작해서 넣어준다. 그런데 만약 애너테이션을 선언했는데 개발자가 직접 코드를 작성했다면 어떻게 될까? 테스트 롬복만 추가한 프로젝트에서 진행했다. plugins { id 'java' } group = 'io.jeidiiy' version = '1.0-SNAPSHOT' repositories { mavenCentral() } dependencies { compileOnly 'org.projectlombok:lombok:1.18.26' annotationProcessor 'org.projectlo..
2023.04.15 -
[Effective Java] item 10. equals는 일반 규칙을 지켜 재정의하라
Java를 사용할 때면 객체를 비교하기 위해 equals를 재정의하는 경우가 종종 있다. equals 메서드는 재정의하기 쉬워 보이지만 잘못하면 끔찍한 결과를 초래한다. 이 문제를 회피하기 가장 쉬운 방법은 아예 재정의하지 않는 것이다. 그냥 두면 그 클래스의 인스턴스는 오직 자기 자신과만 같게 된다. Object.equals를 그대로 상속받기 때문이다. 그러니 다음에서 열거한 상황 중 하나에 해당한다면 재정의하지 않는 것이 최선이다. equals를 재정의할 필요가 없는 경우 각 인스턴스가 본질적으로 고유하다. 값을 표현하는 게 아니라 개체를 표현하는 클래스가 여기에 해당된다. Thread가 좋은 예로, Object의 equals는 이러한 클래스에 딱 맞게 구현되었다. 값 클래스라 하더라도, 값이 같은 ..
2023.04.15 -
[Groovy] 기본 문법
Groovy란? Java에 python이나 ruby 등의 특징을 더한 동적 객체 프로그래밍 언어이다. Gradle에서 build.gradle에서 사용되는 언어가 기본적으로 Groovy이기 때문에 기본 문법을 알면 좋다. 변수 동적 타입 바인딩 def a = 20 // 값을 할당할 때 a 변수의 타입이 결정됨 a = "문자열" // 다른 값 할당 시 변수 타입이 변함 b = "문자열" // 변수 선언 시 def 생략 가능 정적 타입 바인딩 int a = 20 // 변수 a는 int로 자료형이 고정됨 a = "문자열" // 다른 타입을 할당하면 오류 발생 문자열과 자동 형변환 String a = "문자열" // 변수 a는 String으로 자료형 고정 a = 20 // 정수 20이 문자열 "20"으로 자동 형..
2023.04.10 -
[Kotlin] 11. object 키워드: 클래스 선언과 인스턴스 생성
Kotlin에서 object 키워드는 다양한 상황에서 사용하지만 모든 경우 클래스를 정의하면서 동시에 인스턴스를 생성한다는 공통점이 있다. object를 사용하는 여러 상황을 살펴보자. 객체 선언(object declaration) 싱글턴 객체를 정의하는 방법 중 하나이다. 동반 객체(companion object) 인스턴스 메서드는 아니지만 어떤 클래스와 관련 있는 메서드와 팩토리 메서드를 담을 때 쓰인다. 동반 객체 메서드에 접근할 때는 동반 객체가 포함된 클래스의 이름을 사용할 수 있다. Java의 정적 메서드 및 정적 필드를 대신한다. 객체 식 Java의 익명 내부 클래스 대신 쓰인다. 1. 객체 선언: 싱글턴을 쉽게 만들기 Java에서 싱글턴을 만들 때는 보통 모든 생성자를 private으로 만..
2023.03.28 -
[Java] 인증번호 생성 방법
1. 문제 프로젝트에서 이메일 인증을 통해 회원가입을 수행하도록 하는 요구사항이 발생했다. 이때 6자리 숫자를 입력하는 방법으로 인증을 하도록 했는데 이 방법에 대해서 찾아본 내용들을 정리한다. 2. 인증번호 생성 방법 자바에서 인증번호를 생성하는 방법은 여러 가지가 존재한다. Random ThreadLocalRandom SecureRandom 이 중에서 세 번째인 SecureRandom을 사용하도록 한다. 3. Random 탈락 이유 Java에서는 난수를 제공하는 방법으로 Random 패키지를 제공한다. 하지만 암호학적으로 안전하지 않다. 이는 공식 문서에 언급되어 있다. 💡 Instances of `java.util.Random` are not cryptographically secure. Consi..
2023.03.28 -
[Kotlin] 10. 컴파일러가 생성한 메서드: 데이터 클래스와 클래스 위임
Java에서는 클래스가 equals, hashcode, toString 등의 메서드를 구현한다. 그리고 보통 이런 메서드들은 기계적으로 구현된다. 일반적으로 IDE에서 이런 기능을 지원해줘서 직접 구현하는 일은 많이 없지만 코드가 지저분해지는 것은 어쩔 수 없다. Kotlin에서는 이러한 메서드들을 컴파일러가 내부적으로 구현해주기 때문에 소스코드를 깔끔하게 유지할 수 있다. 1. 모든 클래스가 정의해야 하는 메소드 1. toString() Java와 마찬가지로 Kotlin에서도 객체의 기본 toString()은 클래스이름@숫자 와 같은 형식을 띤다. 이는 별로 좋은 방식은 아니므로 객체의 필수 정보를 포함하여 toString()을 오버라이드해야 한다. 2. equals() Java에서는 두 값에 대한 비..
2023.03.28