본문 바로가기

Language

(11)
[Java] Collection 과 Collections Java에서 Collection과 Collections는 매우 유사한 이름을 가지고 있어 헷갈리기 쉽다. 하지만 두 개념은 서로 다른 역할을 하며, 이를 정확히 이해하는 것이 중요하다. 이번 글에서 Collection과 Collections의 차이를 살펴보자.Collection이란?Collection은 Java 컬렉션 프레임워크의 최상위 인터페이스로, 여러 개의 객체를 담을 수 있는 컨테이너 역할을 한다. Collection 인터페이스를 직접 구현하는 경우는 거의 없으며, 주로 이를 상속한 하위 인터페이스(List, Set, Queue 등)를 사용한다.Collection 인터페이스의 주요 메서드public interface Collection extends Iterable { int size(); ..
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..