자바
-
Spring Boot - JavaMailSender를 활용하여 메일 전송하기Framework & Library/Spring Boot 2023. 1. 31. 16:26
JavaMailSender를 활용하여 메일 전송하기 의존성 추가 implementation 'org.springframework.boot:spring-boot-starter-mail' 이메일 발송을 위해 build.gradle 파일에 위에 의존성을 추가한다. Gmail SMTP Server 설정 구글 계정만 있으면 무료로 메일을 전송할 수 있는 Gmail SMTP Server를 이용할 것이다. Gmail SMTP Server를 사용하려면 요구사항에 맞는 설정이 필요하며, 그 내용은 위와 같다. spring: mail: host: smtp.gmail.com port: 587 username: {USER_GMAIL_ADDRESS} password: {USER_GMAIL_PASSWORD} properties:..
-
제네릭 - 아이템 28. 배열보다는 리스트를 사용하라Study/Effective Java 2023. 1. 4. 14:55
배열보다는 리스트를 사용하라 배열과 제네릭의 차이 1. 공변과 불공변 배열과 제네릭 타입에는 중요한 두 가지 차이가 있다. 첫 번째, 배열은 공변이다. 예를 들어, Sub가 Super의 하위 타입이라면 배열 Sub[]는 배열 Super[]의 하위 타입이 된다. 즉, 같이 변한다는 의미이다. 반면, 제네릭은 불공변이다. 즉, 서로 다른 타입 Type1과 Type2가 있을 때, List은 List의 하위 타입도 아니고 상위 타입도 아니다. Object[] objectArray = new Long[1]; objectArray[0] = "타입이 달라 넣을 수 없다."; // ArrayStoreException을 던짐 Long용 저장소에 String을 넣을 수는 없다. 배열에서는 이러한 문제점을 런타임에야 알게 ..
-
제네릭 - 아이템 26. 로 타입은 사용하지 말라Study/Effective Java 2023. 1. 3. 14:49
로 타입은 사용하지 말라 제네릭이란? 클래스와 인터페이스 선언에 타입 매개변수가 사용되면, 이를 제네릭 클래스 혹은 제네릭 인터페이스라고 부르며 이를 통틀어 제네릭 타입이라고 한다. 각각의 제네릭 타입은 일련의 매개변수화 타입을 정의한다. 먼저 클래스의 이름이 나오고, 바로 옆에 꺾쇠괄호 안에 실제 타입 매개변수들을 나열한다. 예를 들어, List은 원소의 타입이 String인 리스트를 뜻하는 매개변수화 타입이다. 여기서 String은 정규 타입 매개변수 E에 해당하는 실제 타입 매개변수이다. 로 타입이란? 제네릭 타입을 하나 정의하면 그에 딸린 로 타입도 함께 정의된다. 로 타입이란 제네릭 타입에서 타입 매개변수를 전혀 사용하지 않을 때를 말한다. 예를 들어, List의 로 타입은 List이다. 로 타..
-
Java - 제네릭(Generic)의 제한 - extends, super, ?Language/Java 2022. 12. 28. 14:57
제네릭(Generic)의 제한 - extends, super, ? 개요 이전 게시글에서는 제네릭의 가장 일반적인 사용법과 특성에 대해서 알아보았다. 예를 들어, 타입을 T라고 하고 외부에서 Integer로 지정하면 T는 Integer가 되고, String으로 지정하면 T는 String이 된다. 만약, Student 클래스를 만들고 T를 Student를 지정한다면 T는 Student가 된다. 즉, 제네릭은 이 처럼 참조 타입 모두가 될 수 있다. 만약, 이러한 T를 특정 범위 내로 좁혀서 제한하고 싶다면 어떻게 해야 할까? 이때 필요한 것이 바로 extends, super, ?이다. extends와 super이라는 키워드는 많이 보았을 것이다. ?는 와일드카드라고 해서 쉽게 말해 알 수 없는 타입이라는 의..
-
Java - 제네릭(Generic)의 특성Language/Java 2022. 12. 28. 09:50
제네릭(Generic)의 특성 복수의 제네릭 사용 class EmployeeInfo { public int rank; EmployeeInfo(int rank) { this.rank = rank }; } class Person { public T info; public S id; Person (T info, S id) { this.info = info; this.id = id; } } public class GenericDemo { public static void main(String[] args) { Person p = new Person(new EmployeeInfo(1), 1); } } 클래스 내에서는 여러 개의 제네릭을 필요로 하는 경우가 있을 것이다. 위 코드는 이러한 경우의 예이다. 위 코드는..
-
Java - 제네릭(Generic)을 사용하는 이유Language/Java 2022. 12. 27. 17:26
제네릭(Generic)을 사용하는 이유 제네릭을 사용하지 않을 경우의 문제점 - 타입 안전성 class StudentInfo { public int grade; public StudentInfo(int grade) { this.grade = grade; } } class StudentPerson { public StudentInfo studentInfo; public StudentPerson(StudentInfo studentInfo) { this.studentInfo = studentInfo; } } class EmployeeInfo { public int rank; public EmployeeInfo(int rank) { this.rank = rank; } } class EmployeePerson {..