본문 바로가기

WEB개발

[Java] 참고 (try-catch-finally, try-with-resources, final컴파일, wrapper, stringbuilder/stringbuffer / 인터페이스 (interface)) / 동적로딩 (reflection)

 

try catch finally 순서

try {
	// 프로그램 실행 로직
} catch(Exception e) {
	// 예외발생 시의 로직
} finally {
}



1. 기본 실행 순서:

- try문에서 예외가 발생하지 않았으면 catch문은 생략되어 try문이 실행된 이후에 finally문이 실행되고, (try > finally)

 

-try문에서 예외가 발생했으면 try문, catch문 순서로 실행된 이후에 finally문이 실행된다. (try > catch > finally)

- try문이나 catch문 안에 return문 또는 throw문이 있다면, 그 return문 또는 throw문 전까지 로직이 실행된 후 finally문이 실행되고 나서 그 return문 또는 throw문이 실행된다  

(try or catch > return or throw직전 > finally  >  return or throw )



2. catch문과 finally문 안에 throw문이 있는 경우:   (try > finally)


try문에서 예외가 발생했으면, finally문 안에 있는 throw문이 먼저 실행되기 때문에 catch문 안에 있는 throw문은 실행되지 않는다.

public class ExceptionTest {
    public static void main(String[] args) {
        try {
            System.out.println("try 실행");
            int result = 10 / 0; // 예외 발생 (ArithmeticException)
        } catch (ArithmeticException e) {
            System.out.println("catch 실행");
            throw new RuntimeException("catch에서 throw"); // (1)
        } finally {
            System.out.println("finally 실행");
            throw new RuntimeException("finally에서 throw"); // (2)
        }
    }
}

try-with-resources

try-with-resources는 자원이 자동으로 닫히도록 보장하는 try 문입니다.

  • 기본 try-catch-finally 패턴을 사용하면, 자원을 닫기 위해 finally 블록에서 close()를 호출해야 합니다.
  • 하지만 try-with-resources를 사용하면 자원이 자동으로 닫히기 때문에 finally 블록이 필요 없습니다.
try (
    BufferedReader br = new BufferedReader(new FileReader("test.txt"));
    FileReader fr = new FileReader("test.txt")
) {
    System.out.println(br.readLine());
} catch (IOException e) {
    e.printStackTrace();
}

final

 

- final 예약어

  • final 변수 : 값이 변경될 수 없는 상수
  • final 메서드 : 하위 클래스에서 재정의 할 수 없는 메서드
  • final 클래스 : 상속할 수 없는 클래스

 

 

- 상수 수정 문제


자바 파일은 컴파일 할 때 참조하는 상수를 바로 값으로 교체합니다.

따라서 참조된 상수를 변경해줘도 해당 상수를 참조하는 자바파일은 이미 이전 값으로 컴파일 되어있기 때문에
수정이 되질 않는다.

따라서 상수가 선언되어있는 자바 파일뿐 아니라 참조하는 자바 파일도 컴파일하여 변경해야 한다.

 


 

Wrapper Class의 new

 

Java 9부터 Double, Integer, Long 등과 같은 래퍼 클래스에 대한 new 연산자의 사용이 권장되지 않습니다.

대신에 해당 클래스들은 래퍼 클래스의 정적 팩토리 메서드를 사용하여 생성해야 합니다. 이 방식은 Java 9에서 소개된 래퍼 클래스의 팩토리 메서드를 활용합니다. 이러한 팩토리 메서드는 더욱 명확하고, 편리하며, 형 안전성을 제공합니다.

 

따라서 new Double() 대신에 Double.valueOf() 또는 Double.parseDouble()를 사용할 수 있습니다. 이는 값의 문자열 표현을 이용하여 Double 객체를 생성합니다.

 

// 값을 직접 전달하여 Double 객체 생성 
Double d1 = Double.valueOf(3.14); 
// 문자열을 파싱하여 Double 객체 생성 
Double d2 = Double.parseDouble("3.14");

 

 

따라서 Java 17에서도 이러한 방법을 사용하여 Double 객체를 생성할 수 있습니다. 만약 코드가 new Double()로 이루어져 있다면 이를 valueOf()나 parseDouble() 메서드를 사용하도록 수정해야 합니다.

 
 

 


인터페이스 & 다형성

  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 클라이언트 프로그램은 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있음
  • 어떤 객체가 하나의 인터페이스 타입이라는 것은 그 인터페이스가 제공하는 모든 메서드를 구현했다는 의미임
  • 인터페이스를 구현한 다양한 객체를 사용함 - 다형성
  • 예) JDBC 인터페이스

다형성(polymorphism)이란?

 

다형성(polymorphism)이란 하나의 객체가 여러 가지 타입을 가질 수 있는 것을 의미합니다.

자바에서는 이러한 다형성을 부모 클래스 타입의 참조 변수로 자식 클래스 타입의 인스턴스를 참조할 수 있도록 하여 구현하고 있습니다.

다형성은 상속, 추상화와 더불어 객체 지향 프로그래밍을 구성하는 중요한 특징 중 하나입니다.

 

인터페이스의 상속

  • 인터페이스 사이에도 상속을 사용할 수 있음
  • extends 키워드를 사용
  • 인터페이스는 다중 상속이 가능하고 구현 코드의 상속이 아니므로 타입 상속 이라고 함

 

 


동적로딩

  • Class.forName("클래스 이름") 메서드로 클래스를 동적으로 로드 함
Class c = Class.forName("java.lang.String");
  • 클래스 이름으로 직접 Class 클래스 가져오기 => 컴파일 타임에 클래스 정보를 가져옴
Class c = String.class;
  • 생성된 인스턴스에서 Class 클래스 가져오기
String s = new String();
Class c = s.getClass();  //Object 메서드

 

 

  • 컴파일 시에 데이터 타입이 binding 되는 것이 아닌, 실행(runtime) 중에 데이터 타입을 binding 하는 방법
  • 컴파일 시에 타입이 정해지지 않으므로 동적 로딩시 오류가 발생하면 프로그램의 심각한 장애가 발생가능
  • reflection 프로그래밍 : Class 클래스를 사용하여 클래스의 정보(생성자, 변수, 메서드)등을 알 수 있고 인스턴스를 생성하고, 메서드를 호출하는 방식의 프로그래밍
  • 로컬 메모리에 객체 없는 경우, 원격 프로그래밍, 객체의 타입을 알 수 없는 경우에 사용
  • java.lang.reflect 패키지에 있는 클래스를 활용하여 프로그래밍

 

 


 

StringBuilder, StringBuffer

 

public class StringBuilderExample {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("Hello");
        sb.append(" World");  // 문자열 추가
        sb.insert(6, "Java ");  // 특정 위치에 문자열 삽입
        sb.replace(6, 10, "Python"); // 문자열 변경
        sb.delete(6, 12); // 특정 부분 삭제
        System.out.println(sb.toString());  // 최종 문자열 출력
    }
}

 

public class StringBufferExample {
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("Hello");
        sb.append(" World");
        sb.insert(6, "Java ");
        sb.replace(6, 10, "Python");
        sb.delete(6, 12);
        System.out.println(sb.toString());
    }
}

 


https://soohyeon317.tistory.com/entry/trycatchfinally-실행-순서
 

try-catch-finally 실행 순서

참고: http://inpiringblog.blogspot.com/2015/07/try-catch-finally.html try {// 프로그램 실행 로직 } catch(Exception e) {// 예외발생 시의 로직 } finally {/* 1. 기본 실행 순서:try문에서 예외가 발생하지 않았으면 catch문

soohyeon317.tistory.com