본문 바로가기

Java/기초

(33)
[Java] 리플렉션 (Reflection) 리플렉션은 일반적으로 Java 가상 머신에서 실행되는 애플리케이션의 런타임 동작을 검사하거나 수정하는 기능이 필요한 프로그램에서 사용된다. 리플렉션은 강력하지만 무분별하게 사용해서는 안 된다. 리플렉션을 사용하지 않고 작업을 수행할 수 있다면 사용을 피하는 것이 좋다. 리플렉션을 통해 코드에 액세스할 때 다음 사항을 염두에 두어야 한다. 장점 확장성 디버거 및 테스트 도구 단점 성능 오버헤드 보안 제한 내부 노출 출처 : https://docs.oracle.com/javase/tutorial/reflect/index.html Trail: The Reflection API (The Java™ Tutorials) The Java Tutorials have been written for JDK 8. Examp..
[Java] 중첩클래스(Nested Classes) Java 프로그래밍 언어를 사용하면 클래스 내에 다른 클래스를 정의할 수 있다. 이러한 클래스를 중첩 클래스라고 한다. - 중첩 클래스를 사용하는 이유 한 곳에서만 사용되는 클래스를 논리적으로 그룹화 캡슐화 증가 더 읽기 쉽고 유지 관리하기 쉬운 코드로 이어짐 - 더 구체적인 상황에 맞게 사용하는 경우 Local Classes(로컬 클래스) 클래스의 인스턴스를 두 개 이상 생성하거나 생성자에 액세스하거나 이름이 지정된 새 유형을 도입해야 하는 경우 Anonymous Classes(익명 클래스) 필드나 추가 메소드를 선언해야 하는 경우 Lambda Expression(람다식) 다른 코드에 전달하려는 단일 동작 단위를 캡슐화하는 경우 기능 인터페이스의 간단한 인스턴스가 필요하고 앞의 기준이 적용되지 않는 경..
[Java] 익명클래스(Anonymous Classes) 익명 클래스를 사용하면 코드를 더 간결하게 만들 수 있다. 클래스를 선언하고 동시에 인스턴스화할 수 있다. 이름이 없다는 점을 제외하고는 로컬 클래스와 같다. 로컬 클래스를 한 번만 사용해야 하는 경우 사용하면 된다. - 익명 클래스의 구성 new 연산자 구현할 인터페이스, 확장할 클래스의 이름 생성자에 대한 인수를 포함하는 괄호 클래스 선언 본문 출처 : https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html Anonymous Classes (The Java™ Tutorials > Learning the Java Language > Classes and Objects) The Java Tutorials have been wri..
[Java] LocalDateTime JDK8에서는 기존 java.util.Data, java.util.Calendar 클래스보다 개선된 날짜와 시간 API가 제공된다. JDK의 기본 날짜 클래스의 문제점 1. 불변 객체가 아니다. set으로 변경이 가능하다는 점은 누군가 악의적으로 변경할 수 있기 때문에 get/set 메서드에서 직접 Date클래스를 사용하는 것이 위험하다. 2. 상수 필드 남용 calendar.add(Calendar.SECOND, 2); 3. 헷갈리는 월 지정 1월을 0으로 표현하는 문제 + Calendar.OCTOBER로 월을 지정하지만 실질적인 값은 9(!=10)인 문제 4. 일관성 없는 요일 상수 어디서는 일요일이 0, 어디서는 일요일이 1 5. Date와 Calendar 객체의 역할 분담 다소 치명적인데 년/월/일..
[Java] Optional java.util.Optional 클래스 Optional 클래스는 Integer나 Double 클래스처럼 'T'타입의 객체를 포장해 주는 래퍼 클래스(Wrapper class)이다, 따라서 Optional 인스턴스는 모든 타입의 참조 변수를 저장할 수 있다. 이러한 Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메소드로 간단히 회피할 수 있다. 즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있다. Optional 객체의 생성 of() 메소드나 ofNullable() 메소드를 사용하여 Optional 객체를 생성할 수 있다. of() 메소드는 null이 아닌 명시된 값을 가지는 Optional 객체를 반환한다. 만약 of..
[Java] 입력 뜯어보기(Scanner, InputStream, BufferdReader) Java 인코딩에 대해 알아야 아래의 내용이 이해된다. Java는 String을 처리할 때 내부(메모리 상에)에서는 UTF-16 BE 인코딩으로 문자열을 저장(인코딩 할때 널 문자가 나타나지 않기 위해서)하고, 송수신에서는 직렬화가 필요한 경우 UTF-8(modified UTF-8)을 사용하며 문자열을 입/출력할 때에만 사용자가 지정한 인코딩 값 또는 운영체제의 기본 인코딩 값으로 문자열을 인코딩 한다. 결과적으로 자바 메모리에 올라갈 때의 과정을 간단히 설명하자면 다음과 같다. 이클립스의 File encoding 이 UTF-8 이라면 입력(UTF-8) -> 송수신(modified UTF-8) -> 자바 메모리 (UTF-16) -> 송수신(modified UTF-8) -> 출력(UTF-8) 즉, 운영체제..
[Java] 스트림(Stream) 자바 8에서 추가된 스트림(Stream)은 람다를 활용할 수 있는 기술 중 하나이다. 자바 8이전에는 배열, 컬렉션 인스턴스를 다루는 방법은 for 또는 foreach 문을 돌면서 요소 하나씩 꺼내서 다루는 방법이였다. 이 방법식으로 작성된 코드는 너무 길고 알아보기 어렵다. 그리고 재사용성도 떨어진다. 이전 방식들의 문제를 해결하기 위해서 너무 길고 알아보기 어렵다. 그리고 재사용성도 떨어진다. 각 컬렉션 클래스에는 같은 기능의 메서드들이 중복되어 정의되어 있다. 스트림 특징 1. 스트림은 외부 반복을 통해 작업하는 컬렉션과는 달리 내부 반복(internal iteration)을 통해 작업을 수행합니다. 2. 스트림은 재사용이 가능한 컬렉션과는 달리 단 한 번만 사용할 수 있습니다. 3. 스트림은 원본..
[Java] 람다식(Lambda expression) 하나의 메서드만 포함하는 익명 클래스의 경우 구문이 다루기 어렵고 불문명해 보이는 문제가 있다. 이 문제를 해결하기 위해서 Lambda Expression을 사용하면 메서드 인수, 코드를 데이터로 처리할 수 있다. Lambda Expression을 사용하면 단일 메서드 클래스의 인스턴스를 보다 간결하게 표현할 수 있다. Lambda Expressions (The Java™ Tutorials > Learning the Java Language > Classes and Objects) The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvem..