-
[2024_동계_모각코] 2회차(01/12)[CNU] Mogakco 2024. 2. 18. 22:57
2회차 목표
Reflection
Static class와 Static method 비교
Java Exception
1. Reflection 리플렉션
프로그램 실행 중에 클래스의 구조를 분석하고, 클래스의 멤버 변수, 메서드, 생성자 등을 동적으로 조사, 검색하고 호출할 수 있는 기능
쉽게 말하면, 리플렉션은 프로그램이 자기 자신을 조사하고 수정하는 능력을 제공하는 기술이다.
이런 기능을 어디에 주로 사용하나?
- 동적 클래스 로딩: 실행 중에 동적으로 클래스를 로딩하여 객체를 생성할 수 있기 때문에,
- 런타임에 어떤 것을 사용할지 결정되는 클래스나 패키지를 사용할 수 있게 해준다.
- 객체의 메타데이터 접근: 클래스의 이름, 필드, 메서드, 상위 클래스, 인터페이스 등과 같은 메타데이터에 접근하여 클래스에 대한 정보를 얻을 수 있으며.
- 프레임워크 개발: 리플렉션은 자바 프레임워크와 라이브러리의 구현에서 많이 사용된다고 한다.
- 예를 들어, Spring 프레임워크는 리플렉션을 이용하여 클래스를 검색하고, 의존성 주입(DI)을 처리하며, 다양한 설정 정보를 분석한다고 함.
참고) 리플렉션을 사용하려면 java.lang.reflect 패키지에 있는 Class, Field, Method 등의 클래스를 활용. 이러한 클래스들을 사용해서 클래스의 구조를 조사하고, 필드 값을 가져오거나 설정하며, 메서드를 호출할 수 있음.
보안상의 이슈가 발생하는 이유
- 리플렉션을 사용하면 일반적인 접근 제어자(private, protected)를 우회하여 private 멤버에 접근하거나, protected 멤버를 하위 클래스가 아닌 다른 클래스에서 접근하는 것이 가능해진다.
- 이로 인해 객체의 상태를 예기치 않게 변경하거나, 보안 취약점이 발생할 수 있음.
- 자바의 보안 기능 중 일부는 리플렉션을 통해 우회될 수 있다.
- 예를 들어, 클래스 로딩 시 보안 검사를 우회하여 안전하지 않은 클래스를 로드하는 것이 가능하다.
- 리플렉션을 사용하여 클래스의 메타데이터에 접근하면, 민감한 정보(예: 비밀번호, 암호화 키 등)가 노출될 수 있다.
방지하는 방법
- 아예 사용을 막거나 권한을 주거나:
- 보안 상 중요한 클래스나 메서드에 대해서는 리플렉션을 사용하지 못하도록 하거나, 특정 권한이 있는 사용자만 리플렉션을 사용할 수 있도록 제한할 수 있다.
- 추가 보안 검사 SecurityManager 사용:
- SecurityManager를 이용하여 보안 검사를 추가로 수행하면 리플렉션 기능의 사용을 제한할 수 있다고 함.
- 재검증:
- 리플렉션으로 동적으로 클래스를 로딩하기 전에, 클래스를 검증하여 신뢰할 수 있는지 확인.
2. Static class, Static method 비교
- Static Class:
static class는 중첩 클래스(inner class)의 한 종류.static class는 외부 클래스의 인스턴스와 상관없이 존재할 수 있으며, 주로 외부 클래스와 강하게 연관된 로직을 구현할 때 사용한다.static inner class는 외부 클래스의 static 멤버에 접근할 수 있지만, 외부 클래스의 instance 에는 직접 접근할 수 없음.// 외부 클래스의 인스턴스 없이 static inner class 인스턴스 생성 OuterClass.StaticInnerClass innerObj = new OuterClass.StaticInnerClass();
- 따라서 static inner class의 인스턴스를 생성하려면 외부 클래스의 인스턴스 없이 아래와 같이 생성한다.
- public class OuterClass { // static inner class public static class StaticInnerClass { // ... } // 인스턴스 멤버 변수와 메서드 private int x; // ... }
- Inner class는 다른 클래스 내부에 정의되는 클래스로, 해당 외부 클래스의 멤버와 메서드에 쉽게 접근할 수 있음.
- Static Method:
static method는 클래스의 인스턴스 생성 없이 클래스 이름을 통해 직접 호출할 수 있는 메서드이다.그 이유는 static method는 특정 인스턴스와 연관되지 않고 클래스 레벨에서 독립적으로 동작해야 하기 때문. - public class MyClass { private static int staticVariable; private int instanceVariable; public static void staticMethod() { // static method에서는 instanceVariable에 접근할 수 없음 // this.instanceVariable; // 오류 발생 System.out.println("This is a static method."); } public void instanceMethod() { // 인스턴스 메서드에서는 staticVariable에 접근할 수 있음 System.out.println("스터디 준비 시간 너무 오래걸림: " + staticVariable); System.out.println("하하하: " + this.instanceVariable); } }
- 일반적인 메서드와는 달리, static method에서는 인스턴스 멤버(변수, 메서드)에 직접 접근할 수 없다.
요약하면, static class는 다른 클래스 내에 중첩된 클래스로, 인스턴스 생성 없이도 사용할 수 있으며 주로 외부 클래스와 강하게 연관된 구조를 표현할 때 사용.
반면에 static method는 클래스 레벨에서 독립적으로 동작해야 하는 기능을 구현할 때 사용되며, static class와 마찬가지로 클래스 인스턴스 생성 없이 클래스 이름으로 직접 호출할 수 있음.
키워드 사용 시 장점
클래스 레벨에서 접근 가능: 해당 클래스의 인스턴스 생성 없이도 클래스 이름을 통해 직접 접근할 수 있기 때문에 클래스 레벨에서 독립적인 기능을 제공할 수 있음.
메모리 공간 절약: static 멤버는 프로그램이 실행될 때 메모리에 한 번만 할당되며, 클래스의 인스턴스마다 중복되어 생성되지 않음.
유틸리티 메서드 구현: 수학 연산 등과 같이 특정 인스턴스와 관련되지 않고 독립적으로 동작해야 하는 유틸리티 메서드를 구현할 때 유용하다고 함.
주의해야 할 제약점과 단점
- 상태 공유 문제:
- static 멤버는 클래스의 모든 인스턴스에서 공유되기 때문에 여러 곳에서 수정하는 경우, 의도치 않은 상태 변경이 발생해서 디버깅 지옥에 빠질 수 있음.
- Thread Safety 문제:
- static 멤버에 여러 스레드가 동시에 접근하는 경우 sync(동기화) 문제가 발생할 수 있음.
- 상속 안됨:
- static 멤버는 상속에 영향을 주지 않고, 서브클래스에서 static 메서드를 오버라이딩할 수 없음.
3. Java Exception
프로그램 실행 중에 발생하는 예기치 않은 상황을 나타내는 객체.
이러한 상황은 프로그램이 올바르게 처리되지 않거나 예상치 못한 동작(프로그램 중단 등)을 수행할 수 있다.
자바에서 예외는 두 가지 주요 유형 으로 나뉨.
- Checked Exception (확인된 예외):
컴파일러에 의해 확인되고 처리되어야 하는 예외.개발자가 이러한 예외들을 처리하는 코드를 작성해야만 컴파일이 가능. - Exception 클래스의 하위 클래스로 나타나며, 주로 외부 리소스 접근이나 파일 입출력(IOException) 같은 작업에서 발생할 수 있음.
- Unchecked Exception (미확인 예외 또는 런타임 예외):
컴파일러가 확인하지 않으며, 개발자가 명시적으로 처리를 요구하지 않는 상황.대표적으로 NullPointerException, ArithmeticException 등. - RuntimeException 클래스의 하위 클래스로 분류되며, 배열의 범위를 초과하는 경우(IndexOutOfRange), 0으로 나누는 경우와 같이 프로그래머의 실수로 인해 발생할 수 있는 예외들.
예외가 발생하면 자바는 해당 예외를 처리하는 코드를 찾아가며 예외 발생 지점에서부터 호출된 메서드들을 거슬러 올라가면서 catch 블록에 해당하는 예외 처리 코드를 찾는다.
만약 catch 블록이 없으면 예외는 프로그램을 종료시키는데, 이 때 예외 정보와 함께 오류 메시지가 출력됨.
1. try-catch 블록 사용.
try 블록에는 예외가 발생할 수 있는 코드를 작성하고, catch 블록에는 예외를 처리하는 코드를 작성.
finally 블록은 선택적으로 사용할 수 있으며, 예외가 발생하든 아니든 반드시 실행되어야 하는 코드를 작성.
ex)
public class ExceptionExample { public static void main(String[] args) { try { int result = divide(10, 0); System.out.println("리절트: " + result); } catch (ArithmeticException e) { System.out.println("에러: Cannot divide by zero."); } finally { System.out.println("항상 실행되는 블록"); } } public static int divide(int num1, int num2) { return num1 / num2; } }
이 예시 에서는 0으로 나누는 경우에 ArithmeticException이 발생할 수 있다.
catch 블록에서 이를 처리했고, finally 블록은 항상 실행.
2. throws 키워드 사용.
throws 키워드는 메서드 선언부에 사용되며, 메서드에서 예외를 직접 처리하지 않고 해당 예외를 메서드를 호출한 곳으로 던진다.던져진 예외는 해당 메서드를 호출한 상위 메서드에서 처리해야 함.
ex)
public void someMethod() throws SomeException { // 여기에 예외가 발생할 수 있는 코드 // 발생하면 직접 처리하지 않고 SomeException 으로 던짐. } // 메서드를 호출한 곳에서 예외를 처리해야 함 try { someMethod(); } catch (SomeException e) { // 던져진 예외 처리 }
3. Custom Exception (사용자 정의 예외)
기본적으로 제공되는 예외 외에도 개발자가 자신만의 예외 클래스를 만들어서 사용할 수 있음.사용자 정의 예외를 만들 때는 Exception 또는 RuntimeException 클래스를 상속받아 새로운 예외 클래스를 정의하면 된다.
ex)
public class MyCustomException extends Exception { // custom exception 정의 } if (someCondition) { // custom exception 으로 예외 던짐 throw new MyCustomException("새롭게 정의된 예외처리 클래스로 던져"); } try { // 예외가 발생할 수 있는 코드 } catch (MyCustomException e) { // MyCustomException 예외를 처리하는 코드 }
예외 처리 성능을 개선하는 방법
- Checked Exception 사용 최소화:성능에 민감한 비즈니스 로직에서는 Checked Exception의 사용을 최소화하고, 대신 Unchecked Exception을 사용하는 것을 고려할 수 있음
- → (예외처리가 필요하지 않은데 하라고 하는 경우 또는 다른 방법으로 오류를 처리하는게 좋은 경우)
- Checked Exception은 예외를 처리하는 것이 강제되기 때문에 성능에 영향을 줄 수 있다.
- 반복적인 예외를 처리해야 하는 상황이 있다면, 예외를 캐싱하여 재사용하는 방법 고려.
- 예외 처리 위치 최적화:예를 들어, 반복문 안에서 발생하는 예외는 반복문 밖으로 이동시키는 등의 최적화를 고려.
- 예외 처리 코드를 적절한 위치에 두어 성능을 개선할 수 있다.
2회차 회고록
2회차는 리플렉션, static 클래스와 메서드, 그리고 Java 예외 처리에 초점을 맞췄다. 리플렉션에 대해 배우면서 프로그램이 자기 자신을 어떻게 조사하고 수정할 수 있는지에 대한 것을 배울 수 있었다. 이것이 실제로 프레임워크 개발에 어떻게 활용되는지 이해할 수 있어서 좋았다. 리플렉션의 보안상 이슈에 대해서도 배웠기 때문에, 이 기술을 사용할 때는 항상 조심해야 한다는 점을 깨달았다. Java가 갖고 있는 다양한 기능을 배우며 각 기능의 장단점을 이해하는 것이 중요하다는 생각이 들었다.
'[CNU] Mogakco' 카테고리의 다른 글
[2024_동계_모각코] 4회차(01/24) (0) 2024.02.18 [2024_동계_모각코] 3회차(01/17) (0) 2024.02.18 [2024_동계_모각코] 1회차(01/03) (0) 2024.01.03 [2024_동계_모각코] 목표 및 활동계획 (0) 2023.12.26 [2022_하계_모각코] 6회차(08/15) (0) 2022.08.19