250x250
Notice
Recent Posts
Recent Comments
Link
반응형
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- scanner
- CSS
- Java
- 리소스모니터링
- NIO
- date
- string
- GC로그수집
- 스택
- List
- sql
- deque
- Union-find
- 스프링부트
- Properties
- javascript
- alter
- math
- union_find
- set
- spring boot
- BFS
- JPA
- Calendar
- 힙덤프
- 큐
- dfs
- map
- html
- priority_queue
Archives
- Today
- Total
매일 조금씩
Java 개념 정리 (2) - 문자열, 예외, 제네릭, 람다, 스트림, 어노테이션, 리플렉션 본문
728x90
반응형
문자열, 예외, 제네릭
- String literal과 new String(””)의 차이는?
- String literal은 JVM의 String Constant Pool에 저장되며, 동일한 값을 가진 문자열은 메모리를 절약하기 위해 공유됩니다. 반면, new String("")은 힙메모리에 새로운 객체를 생성합니다. 따라서 String literal은 메모리 사용 측면에서 효율적이고, new String("")은 동일한 문자열이라도 매번 새로운 객체를 생성하기 때문에 메모리 사용히 비효율적일 수 있습니다.
- String, StringBuilder, StringBuffer의 차이는?
- String은 불변 객체로, 문자열을 변경하면 새로운 객체를 생성합니다. StringBuilder와 StringBuffer는 가변 객체로, 문자열을 직접 변경할 수 있습니다. StringBuilder는 Thread-safe하지 않지만, StringBuffer는 Thread-safe하여 멀티스레드 환경에서 안전하게 사용할 수 있습니다.
- Exception과 Error의 차이는?
- Exception은 애플리케이션에서 발생할 수 있는 예외 상황을 나타내며, 프로그램 코드에서 처리 가능한 오류입니다. Error는 JVM에서 발생하는 심각한 문제로, 애플리케이션에서 처리할 수 없는 오류입니다.
- Exception 클래스의 예시는?
- Checked Exception과 Unchecked Exception이 있습니다. Checked Exception은 IOException이나 SQLException이 있고, Unchecked Exception에는 NullPointerException이나 ArrayIndexOutOfBoundsException과 같은 런타임 예외가 있습니다.
- Checked Exception과 Unchecked Exception의 차이는?
- Checked Exception은 컴파일 시점에 예외 처리 여부를 검사하며, 반드시 try-catch로 처리하거나 throws로 선언해야 합니다. 예를 들어, IOException은 파일 작업 중에 발생할 수 있는 예외로, 이를 처리하지 않으면 컴파일 오류가 발생합니다. 반면, Unchecked Exception은 런타임에 발생하며, 예외 처리가 강제되지 않습니다. 예를 들어, NullPointerException은 프로그램 실행 중에 발생하는 예외로, 이를 처리하지 않아도 컴파일에는 성공합니다.
- throw와 throws의 차이는?
- throw는 예외를 발생시키는 데 사용하는 키워드로, 예를 들어 throw new IllegalArgumentException();과 같이 특정 조건에서 예외를 명시적으로 발생시킬 때 사용됩니다. 반면, throws는 메서드 선언부에 사용되며, 해당 메서드가 특정 예외를 던질 수 있음을 알리는 키워드입니다. 예를 들어, public void readFile() throws IOException은 이 메서드가 호출될 때 IOException이 발생할 가능성이 있음을 나타냅니다.
- try~catch~finally 구문에서 finally은 어떠한 역할일까?
- finally는 try 블록에서 예외가 발생하든 안 하든 항상 실행되는 블록입니다. 주로 리소스 해제 작업에 사용되며, 예를 들어 데이터베이스 연결을 닫거나 파일 스트림을 종료하는 데 사용됩니다. finally는 예외가 발생하더라도 반드시 실행되므로, 프로그램의 안정성을 높이는 데 중요한 역할을 합니다.
- Throwable과 Exception의 차이는?
- Throwable은 하위 클래스로 Error와 Exception을 갖는 모든 오류와 예외의 슈퍼 클래스입니다. Exception은 에러를 제외한 예외의 슈퍼 클래스입니다.
- 제네릭이란 무엇이고, 왜 사용할까?
- 제네릭은 클래스나 메서드에서 사용할 데이터 타입을 매개변수화할 수 있는 Java의 기능입니다. 제네릭을 사용하면 컴파일타임 타입 안정성을 확보하고, 캐스팅의 필요성을 줄이며, 코드 재사용성을 높일 수 있습니다. 예를 들어, List<String>은 리스트에 문자열만 허용하도록 강제하여 런타임 타입 에러를 방지합니다.
- 제네릭을 사용한 경험은?
- 제네릭은 주로 컬렉션 프레임워크를 사용할 때 자주 활용했습니다. 예를 들어, 사용자 ID와 정보를 매핑하기 위해 Map<Integer, User>를 사용했습니다. 이를 통해 키와 값의 타입이 컴파일타임에 명확히 정의되었고, 잘못된 타입의 데이터를 저장하는 실수를 방지할 수 있었습니다. 또한, 제네릭을 사용한 커스텀 유틸리티 메서드를 작성하여 다양한 타입의 데이터를 처리한 경험이 있습니다.
람다, 스트림, 어노테이션, 리플렉션
- 람다란 무엇일까?
- 람다식은 메소드를 하나의 식으로 표현한 것을 말합니다. 그리고 람다식은 함수의 이름이 없기 때문에 익명 함수라고 부르며, 메소드의 매개 변수로 전달되거나 메소드의 결과로 반환될 수 있는 특징이 있어서 함수를 변수로 다룰 수 있다는 장점이 있습니다.
- 스트림이란 무엇일까?
- 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해 주는 내부 반복자를 말합니다. 외부 반복자는 개발자가 컬렉션을 조작하면서 처리 흐름을 제어하지만, 내부 반복자는 컬렉션 내부에서 흐름이 진행됩니다.
- 람다와 스트림은 왜 생겨났을까?
- 함수형 프로그래밍의 장점 때문에 탄생했다고 생각합니다. 함수형 프로그래밍은 how가 아닌 what에 집중하므로 코드의 가독성이 높아지고, 함수를 변수에 할당할 수 있으므로 함수의 재사용이 용이합니다. 또한 함수들이 순수 함수로 구성되어 있으므로 외부의 값이 변경되는 등의 사이드 이펙트가 발생하지 않습니다. 순수 함수는 함수에 동일한 인자가 주어졌을 때, 항상 같은 값을 리턴하는 함수입니다. 이로 인해 외부의 상태를 변경하지 않습니다.
- 자바에서 어노테이션이란 무엇일까?
- 어노테이션은 인터페이스를 기반으로 한 문법으로 주석처럼 코드에 달아 클래스에 특별한 의미를 부여하거나 기능을 주입할 수 있습니다.
- 어노테이션을 왜 사용할까?
- Java 리플렉션을 통해 어노테이션을 런타임 중에 조회할 수 있고, 이 어노테이션의 메타 데이터를 사용하여 런타임 중에 특별한 로직을 작성할 수 있게 됩니다.
- 어노테이션은 리플렉션으로 동작한다고 하는데.. 리플렉션은 무엇일까?
- 힙 영역에 로드된 클래스 타입의 객체를 통해, 원하는 클래스의 인스턴스를 생성할 수 있게 지원하고, 인스턴스의 필드와 메소드를 접근 제어자와 상관 없이 사용할 수 있도록 지원하는 자바 API입니다.
- 그러면 리플렉션을 활용해서 어노테이션의 메타 데이터를 가져오는 등의 로직을 실제로 구현해 본 경험은?
- 제 애플리케이션에서 Bot이라는 개념이 있었고, Bot의 Name을 검증하기 위해 커스텀 어노테이션을 사용한 적이 있습니다. 이 어노테이션이 붙은 필드를 리플렉션으로 가져와서 Name의 길이 등을 검사하였습니다.
심화
- System.out.println 클래스는 성능이 좋지 않다고 하는데 그 이유는?
- println 메서드는 블로킹 IO이므로 해당 메서드를 호출하는 스레드는 그 작업이 끝날 때까지 다른 작업을 수행하지 못하고 기다려야 합니다. 또한, println 메서드 내부에 synchronized block이 있어서 여러 스레드가 동시에 System.out 객체의 println 메서드를 호출할 수 없습니다. 이는 thread-safe하다는 점은 있지만 락 베이스로 동작하므로 성능이 떨어집니다. 즉, 싱글 스레드일 경우 블로킹 IO로 인한 성능 이슈가 있고 멀티 스레드일 경우 한 스레드 외의 다른 스레드는 블로킹 된다는 성능 이슈가 존재합니다.
728x90
반응형
'Java' 카테고리의 다른 글
Java 개념 정리 (1) - Java 기본, 객체 지향 (0) | 2025.01.09 |
---|---|
Servlet 이란? Spring 에선 어떻게 사용하고 구현되는지? (0) | 2024.11.03 |
Java EE 란? Spring framework 와 경쟁? 상호 보완? (1) | 2024.11.03 |
유틸리티 클래스 사용 시 주의 사항 "Add a private constructor to hide the implicit public one" (0) | 2024.10.26 |
익명 클래스와 람다식의 차이 (0) | 2022.02.14 |