[JAVA]자바 스터디 2주차 정리

bbbbbhyun·2025년 1월 8일
0

String vs StringBuffer vs StringBuilder

특징StringStringBufferStringBuilder
선언String str = "Hello World!!";StringBuffer sb = new StringBuffer("Hello World!!");StringBuilder sb = new StringBuilder("Hello World!!");
클래스 종류불변(immutable)한 클래스가변(mutable)한 클래스가변(mutable)한 클래스
사용목적문자열 추가와 변경이 발생하지 않는 경우멀티쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우단일쓰레드 환경에서 문자열의 변수의 추가와 변경이 자주 발생하는 경우

Error vs Exception

특징 Error Exception
공통점 둘 다 Throwable 클래스의 서브클래스
모두 프로그램 실행 중 발생할 수 있는 비정상적인 상태
발생 원인 JVM 수준에서 발생하는 심각한 문제 애플리케이션 코드에서 복구 가능한 문제로
코드 또는 외부 자원 문제(잘못된 사용자 입력, 파일 접근 실패, 네트워크 문제)
복구 가능 여부 불가능 가능
처리 방식 일반적으로 처리하지 않음 try-catch로 처리 가능
종류 OutOfMemoryError 등등 SQLException, IOException, RuntimeException

Exception 종류 설명

  • Checked Exception
    컴파일 타임에 처리
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());
        }
    }
}
  • Unchecked Exception
    런타임에 발생하며 선택적으로 처리
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);
        }
    }
}

어노테이션

정의

소스 코드가 컴파일되거나 실행될 때 컴파일러 및 다른 프로그램에게 필요한 정보를 전달해 주는 문법 요소

주요 용도

  1. 컴파일러에 특정 동작을 수행하거나 경고를 무시하도록 지시
@Override
public String toString() {
    return "Example";
}

@SuppressWarnings("unchecked")
public void method() {
    List rawList = new ArrayList(); // 경고 무시
}
  1. 런타임에 어노테이션 정보를 읽고 동작을 제어하거나 코드 생성을 간소화
@Getter
@Setter
public class User {
    private String name;
    private int age;
}
  1. 테스트 프레임워크에서 자주 사용
public class ExampleTest {
    @Test
    public void testMethod() {
        assertEquals(1, 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. 런타임 비용 : 리플렉션 기반으로 동작하는 경우 성능에 영향을 줄 수 있음
  • 보일러플레이트 코드란 최소한의 변경으로 여러곳에서 재사용되며, 반복적으로 비슷한 형태를 띄는 코드
  • 리플렉션 이란 Java에서 클래스, 메서드, 필드 등의 메타데이터를 런타임에 동적으로 분석하고 조작할 수 있도록 제공하는 기능입니다. 이를 통해 프로그램은 런타임 시에 객체의 구조와 동작을 탐색하거나 수정할 수 있습니다.

리플렉션의 특징
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));
    }
}
  1. 클래스나 메서드에 선언된 어노테이션을 읽음
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

profile
BackEnd develope

0개의 댓글