특징 | String | StringBuffer | StringBuilder |
---|---|---|---|
선언 | String str = "Hello World!!"; | StringBuffer sb = new StringBuffer("Hello World!!"); | StringBuilder sb = new StringBuilder("Hello World!!"); |
클래스 종류 | 불변(immutable)한 클래스 | 가변(mutable)한 클래스 | 가변(mutable)한 클래스 |
사용목적 | 문자열 추가와 변경이 발생하지 않는 경우 | 멀티쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 | 단일쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우 |
특징 | Error | Exception |
공통점 | 둘 다 Throwable 클래스의 서브클래스 모두 프로그램 실행 중 발생할 수 있는 비정상적인 상태 |
|
발생 원인 | JVM 수준에서 발생하는 심각한 문제 | 애플리케이션 코드에서 복구 가능한 문제로 코드 또는 외부 자원 문제(잘못된 사용자 입력, 파일 접근 실패, 네트워크 문제) |
복구 가능 여부 | 불가능 | 가능 |
처리 방식 | 일반적으로 처리하지 않음 | try-catch로 처리 가능 |
종류 | OutOfMemoryError 등등 | SQLException, IOException, RuntimeException |
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
throw new Exception("Checked Exception");
} catch (Exception e) {
System.out.println("Caught Exception: " + e.getMessage());
}
}
}
public class UncheckedExceptionExample {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
try {
System.out.println(arr[5]); // IndexOutOfBoundsException 발생
} catch (Exception e) {
System.out.println("Caught Exception: " + e);
}
}
}
소스 코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해 주는 문법 요소
@Override
public String toString() {
return "Example";
}
@SuppressWarnings("unchecked")
public void method() {
List rawList = new ArrayList(); // 경고 무시
}
@Getter
@Setter
public class User {
private String name;
private int age;
}
public class ExampleTest {
@Test
public void testMethod() {
assertEquals(1, 1);
}
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue
private Long id;
@Column(nullable = false)
private String name;
}
장점 | 단점 |
1. 가독성 : XML이나 복잡한 코드 대신 어노테이션으로 직관적으로 설정 정보를 표현 가능 2. 반복 코드 감소 : 메타데이터를 통해 코드 생성을 자동화하여 보일러플레이트 코드를 줄임 3. 유지보수 용이 : 설정 정보가 코드와 함께 있기 때문에 관리가 쉬움 4. 런타임 정보 제공 : 리플렉션을 통해 런타임에 메타데이터를 기반으로 동작을 변경 가능 |
1. 과도한 사용 : 어노테이션을 남용하면 코드가 어노테이션으로 뒤덮여 가독성이 떨어질 수 있음 2. 유연성 부족 : XML에 비해 동적으로 변경하기 어렵고, 코드에 하드코딩된 형태로 남음 3. 런타임 비용 : 리플렉션 기반으로 동작하는 경우 성능에 영향을 줄 수 있음 |
리플렉션의 특징
1. 동적 탐색: 런타임에 클래스, 메서드, 필드 등의 정보 획득
2. 동적 호출: 컴파일 타임에 정의되지 않은 메서드나 필드를 런타임에 호출하거나 수정 가능
3. 주로 java.lang.reflect 패키지 사용: 주요 클래스: Class, Method, Field, Constructor
리플렉션 사용 예시
1. Class 객체를 통해 클래스 정보 획득
public class ReflectionExample {
public static void main(String[] args) throws ClassNotFoundException {
// 클래스의 Class 객체 가져오기
Class<?> clazz = Class.forName("java.util.ArrayList");
// 클래스 이름 출력
System.out.println("Class Name: " + clazz.getName());
}
}
2.클래스의 메서드 목록을 확인
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws ClassNotFoundException {
Class<?> clazz = Class.forName("java.util.ArrayList");
// 클래스의 모든 메서드 가져오기
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
System.out.println("Method: " + method.getName());
}
}
}
3.리플렉션으로 객체를 생성하고 메서드를 호출
import java.lang.reflect.Method;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 클래스 로드
Class<?> clazz = Class.forName("java.lang.String");
// 객체 생성
String str = (String) clazz.getDeclaredConstructor(String.class).newInstance("Hello");
// 메서드 호출
Method method = clazz.getMethod("toUpperCase");
String result = (String) method.invoke(str);
System.out.println("Result: " + result); // HELLO
}
}
4.리플렉션을 사용해 필드 값을 수정
import java.lang.reflect.Field;
public class ReflectionExample {
public static void main(String[] args) throws Exception {
// 클래스 정의
class Person {
private String name = "John";
}
// 객체 생성
Person person = new Person();
// 필드 접근
Field field = person.getClass().getDeclaredField("name");
field.setAccessible(true); // private 필드에 접근 허용
field.set(person, "Alice"); // 값 변경
// 변경된 값 출력
System.out.println("Updated Name: " + field.get(person));
}
}
import java.lang.annotation.*;
import java.lang.reflect.*;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@interface TestAnnotation {
String value();
}
public class AnnotationExample {
@TestAnnotation("Hello, Annotation!")
public void testMethod() {}
public static void main(String[] args) throws Exception {
Method method = AnnotationExample.class.getMethod("testMethod");
TestAnnotation annotation = method.getAnnotation(TestAnnotation.class);
System.out.println("Annotation Value: " + annotation.value());
}
}
https://adjh54.tistory.com/129
https://velog.io/@jipark09/Java-Error%EC%99%80-Exception-%EC%B0%A8%EC%9D%B4!
https://charlezz.medium.com/%EB%B3%B4%EC%9D%BC%EB%9F%AC%ED%94%8C%EB%A0%88%EC%9D%B4%ED%8A%B8-%EC%BD%94%EB%93%9C%EB%9E%80-boilerplate-code-83009a8d3297
https://ittrue.tistory.com/156
https://developingman.tistory.com/41
https://velog.io/@yeon/Reflection%EC%9D%B4%EB%9E%80
https://curiousjinan.tistory.com/entry/java-reflection-explain