본문 바로가기

분류 전체보기

(61)
Java 런타임 데이터 영역 C/C++ 개발자는 메모리 관리 측면에서 보면 각 객체의 소유권과 라이프타임 모두 관리할 책임을 지기 때문에 잡다한 것들을 다 하는 노가다꾼이라고 할 수 있다.  반대로 자바 개발자는 가상 머신이 제공하는 가비지 컬렉터 덕분에 메모리 할당과 해제를 직접 하지 않아도 메모리 누수나 오버플로 문제를 거의 겪지 않는다. 하지만 통제권을 위임 했기에 문제가 생기면 가상머신의 메모리 관리 방식을 이해하지 못하는 한 해결하기가 상당히 어렵다.  런타임 데이터 영역자바 가상 머신은 런타임 환경에 필요한 메모리를 몇 개의 데이터 영역으로 나누어서 관리한다. 각 영역은 목적과 생성/삭제 시점이 존재한다. 어떤 영역은 가상 머신 프로세스의 시작과 동시에 만들어지며, 어떤 영역은 사용자 스레드의 시작/ 종료에 맞춰 생성/삭..
Rust 소유권과 Lifetime 러스트의 소유권을 알기 전에 러스트의 메모리 관리에 대해 알아보자.Rust의 메모리 관리Java, Go, Python, Javascript와 같은 언어들은 GC를 사용하고 C/C++과 같은 경우에는 수동으로 프로그래머가 메모리를 관리한다.이와는 다르게 Rust는 컴파일 시점에 메모리 관리 규칙을 검사한다. 컴파일 시점에 메모리 관리를 확인 하면서 생기는 여러가지 특징이 있다.소유권 규칙에 따라 컴파일 시점에 메모리 할당/해제를 관리한다.규칙에 어긋나면 컴파일되지 않는다.규칙을 잘 지키면 컴파일러가 알아서 잘 처리해준다.실행시간 손해가 없다.개발자가 실수할 여지가 없다.Rust의 메모리는 블록(scope)이 끝날 때 해제가 된다. 예를 들어fn main() { { let s = "hell..
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. 러스트는 안전하다.프로그램의 안전성에 대해 얘기를 할 때에는 타입 안전성, 메모리 안전성, 스레..