본문 바로가기

분류 전체보기

(59)
Java Annotation Java에서 @를 가진 식별자는 컴파일러가 애너테이션으로 해석한다. 애너테이션은 메서드, 생성자, 필드, 클래스 뿐만 아니라 매개변수, 예외처리 또는 흔하지는 않지만 코드 내 위치에 나타내게 된다.@Servicepublic class HttpService implements RemoteService { @NonNull private final Integer port; @Autowired public HttpService(@Qualifier("port") Integer port) {this.port = port;} @Override Response sendRequest(String req) throws @Critical NetworkException{}}위와 ..
Java native 키워드로 Rust코드와 연동하기 native 메서드는 자바가 아닌 C, C++, Rust와 같은 다른 언어들로 구현된 메서드를 뜻한다. 이 메서드를 사용하면 자바에서는 지원하지 않는 기능을 활용할 수 있고 성능상의 이유로 사용하지 못했던 코드를 사용할 수 있다.native 키워드 사용 방법메서드 선언부에 native 키워드를 사용하고, 메서드의 바디는 작성하지 않는다.일반적으로 JNI(Java Native Interface)를 통해 구현된다.public class NativeExample { // 네이티브 메서드 선언 public native int add(int num1, int num2); static { // 네이티브 라이브러리를 로드 System.loadLibrary("add"); ..
Java Modifier(제어자) 제어자란제어자는 클래스, 생성자, 메서드, 필드에 추가되는 키워드로 기능을 추가하며 타깃의 의미를 변경한다. 제어자는 일반적으로 접근제어자와 비접근 제어자 두 그룹으로 분리된다. 접근 제어자public, protected, private 잘 알려진 제어자로 이 키워드는 클래스, 생성자, 필드, 메서드 등에 적용될 수 있으며 적용되는 타깃에 대한 접근을 제어하는 역할을 한다.생성자 측면에서는 접근 제어자만 적용이 가능하며 제어자가 존재하지 않으면 package-private이 된다. 비접근 제어자비접근 제어자는 클래스, 메서드, 필드 기준 으로 나누어서 설명할 수 있다. 클래스 기준abstract - 클래스를 인스턴스화될 수 없는 클래스로 만드는 제어자 final - 클래스 구현을 마무리해 상속할 수 없게..
Java Reflection(3) Method - 클래의 메서드에 접근클래스의 모든 메서드들은 java.lang.reflect.Method타입의 객체로서 표현된다. Class.getDeclaredMethods()모든 메서드를 반환값으로 출력한다.Class.getMethod()super 클래스에서 상속된 메서드와 인터페이스를 포함한 모든 public 메서드를 출력한다.Method의 PropertiesMethod객체의 함수들 중 몇개만 알아보자. Method.getName(), Method.getSimpleName()클래스에 사용된 메서드의 이름을 문자열로 추출할 수 있다. (package 명 포함/ 미 포함) Method.getReturnType()특정 메서드의 반환 타입을 나타내는 클래스 객체를 알 수 있다. Method.getParam..
Java - unchecked casting Collection collection = (Collection) new HashMap();  위 코드를 그대로 작성하면 아래와 같은 경고 메시지를 띄울 뿐 컴파일 에러를 발생 시키지 않는다. Unchecked cast: 'java.util.HashMap' to 'java.util.Collection'  Collection과 HashMap은 서로 아무런 관계가 없는 객체임에도 명시적 형변환이 가능한 것 처럼 표시된다. 하지만 이러한 형변환은 런타임 환경에서 아래와 같은 에러를 발생시키게 된다.Exception in thread "main" java.lang.ClassCastException: class java.util.HashMap cannot be cast to class java.util.Colle..
왜 Rust일까 애플리케이션들은 공통적으로 다음과 같은 요구사항을 갖는다.안전하고 안정적이며 신뢰할 수 있어야 한다.리소스를 효율적으로 사용해야 한다.지연 시간을 최소화해야 한다.높은 동시성을 지원해야 한다.몇가지 요구사항을 더 추가하면시작 및 종료가 짧아야한다.유지보수 및 리팩터링이 쉬워야한다.개발자 생산성을 보장해야 한다.위 요구 사항들은 모두 개별 서비스 수준과 아키텍처 수준에서 처리될 수 있다는 점이 중요하다.러스트를 선택했을 때러스트를 사용해 애플리케이션 백엔드와 소프트웨어 인프라스트럭처 서비스를 구현할 때 얻을 수 있는 이점에 대해 알아보자. 위에서 언급했던 필요한 사항들을 어떻게 만족시키는지 알아볼 것이다. 1. 러스트는 안전하다.프로그램의 안전성에 대해 얘기를 할 때에는 타입 안전성, 메모리 안전성, 스레..
Java Reflection(2) Field - 필드 변수에 접근Java 클래스에서 필드는 클래스나 인터페이스 안에서 선언된 변수를 의미하며 이는 정적 상수나 객체 변수같이 클래스 내에서 선언된 변수가 될 수 있다.Field 클래스는 필드를 나타내며 필드의 이름과 타입 등 다양한 특성 정보를 가지고 있다. 이러한 Field 객체를 생성하는 것에는 Constructor를 생성하는 것처럼 Field 객체도 여러가지 방법이 존재한다.Class.getDeclaredFields()클래스에 선언된 접근 제어자에 상관없이 모든 필드를 배열로 반환한다. - 상속받은 필드는 제외한다. Class.getFields()public으로 선언된 모든 필드를 배열로 반환한다. - 상속받은 필드도 포함한다. Class.getDeclaredField(fieldNam..
Java Reflection(1) Java Reflection이란?Java Reflection은 언어이자 JVM의 기능이며, 앱이 실행하는 동안에 클래스와 객체 정보를 추출할 수 있다.Reflection API로 유연한 코드를 작성할 수 있으며, 프로그램 실행 단계에서 다양한 소프트웨어 컴포넌트를 연결하고 소스 코드를 수정하지 않고 새로운 프로그램 순서를 만들어 낼 수 있다. 또한 Reflection으로 다목적 알고리즘도 작성할 수 있다.  우리가 보통 작성하고 프로그램은 데이터를 넣고 분석해서 작업을 수행하고 출력값을 돌려준다. 반면에 Reflection으로 프로그램을 작성하면 데이터와 코드를 모두 입력값으로 인식하고 분석해 작업을 수행하고 출력값을 낸다. Reflection은 프로그램을 실행하면서 앱 객체와 클래스를 분석하고 앱 객체..