목록프로그래밍 언어 (72)
나의 지식 보관소
기존에 입출력 스트림이나 소켓 등을 사용할 때 아래와 같이 close() 메서드를 호출해서 안전하게 리소스를 닫아 주어야 했다. finally 블록에서 다시 try-catch를 사용하므로 꽤나 복잡하게 생겼다. FileInputStream stream = null; try { stream = new FileInputStream("file.txt"); } catch(Exception e) { ... } finally { try { stream.close(); } catch(Exception e) { ... } } 하지만 자바 7에서 추가된 try-with-resources를 사용하면 다음과 같이 간단하게 사용할 수 있다. 단 사용하기 위해서 조건이 있는데 리소스 객체가 java.lang.AutoClosea..
로컬 클래스의 객체는 힙 메모리에 존재하기 때문에 메서드 실행이 끝나도 사라지지 않지만, 매개 변수나 로컬 변수는 스택 메모리에 존재하기 때문에 메서드 실행이 끝나면 사라져버려서 이들을 계속 로컬 객체에서 사용할수 없다. 자바는 이러한 문제를 해결하기 위하여 로컬 클래스에서 사용하는 매개 변수나 로컬 변수들의 값을 로컬 클래스 내부에 복사하여 둔다. 그리고 이후 매개 변수나 로컬 변수의 값이 변경되면 로컬 클래스에 복사하여둔 값과 달라져버리기 때문에 매개 변수나 로컬 변수를 final로 선언해서 수정을 하지 못하게 한다. 자바 7 이전에는 final로 선언 되지 않은 매개 변수나 로컬 변수를 로컬 클래스에서 사용하면 컴파일 에러가 발생했지만, 자바 8 이후 부터는 컴파일 에러가 발생하는 대신, final..
인터페이스의 구현 객체를 만드는 것이 재사용할 수 있기 때문에 편리하지만, 한 번만 사용할 일회성 구현 객체를 만들기 위해 소스 파일을 만들고 클래스를 선언하는 건 비효율적이기 때문에 단 한 번만 사용할 목적으로 만드는 구현 객체인 익명 구현 객체를 사용하게 된다. 인터페이스명 변수명 = new 인터페이스명() { //인터페이스에 선언된 "모든" 추상메서드의 실체 메서드 선언 }; 익명 구현 객체인 이유는 아마도 이름이 없는 구현 객체이기 때문에 붙여진 이름일 듯 하다. 익명 구현 객체를 선언할 때 주의해야 할 점은 익명 구현 객체의 생성은 결국 하나의 실행문이므로 중괄호의 끝에 세미콜론을 붙여 주어야 한다. 그리고 인터페이스에 선언되어있는 모든 추상 메서드의 구현 객체를 선언해야 하고, 필드와 메서드를..
클래스끼리 형 변환을 할 때 자식 타입을 부모 타입으로 형 변환하는 경우에는 자동 형 변환이 이루어지지만 부모 타입을 자식 타입으로 형 변환하기 위해서는 강제 형 변환(casting)이 사용된다. 만일 부모 타입의 변수가 자식 객체를 참조하고 있다면 형 변환이 문제없이 이루어지지만, 부모 객체를 자식 타입으로 형 변환하거나, 아무 객체나 갖다가 형 변환을 시키면 문제가 발생할 수 있다. 이러한 문제를 해결하기 위해서 어떤 객체가 어떤 클래스의 인스턴스인지 확인하기 위해 instanceof 연산자를 사용한다. instanceof 의 좌항에는 객체가 오고, 우항에는 타입이 온다. 만일 좌항의 객체가 우항의 인스턴스가 맞다면 true를 반환하고 아니라면 false를 반환한다.
어노테이션은 컴파일러에게 코드 문법 에러를 체크하고, 소프트웨어 개발 툴이 빌드나 배치 시 코드를 자동으로 생성하고, 런타임 시 특정 기능을 실행하도록 정보를 제공한다. 어노테이션 타입을 정의하는 것은 인터페이스를 정의하는 것과 유사하다. 어노테이션 타입을 정의하기 위해서는 다음과 같이 @interface를 사용하여 정의하고, 다음과 같이 사용한다. public @interface AnnotationName{ //어노테이션 정의 } @AnnotationName //어노테이션 사용 모든 어노테이션은 멤버로 엘리먼트를 가지며, 엘리먼트는 타입과 이름으로 구성되고, 디폴트 값을 가질 수 있다. 엘리먼트의 타입은 int나 double 같은 기본적인 데이터 타입과 열거 타입, Class타입, 그리고 배열도 올 수..
final 필드는 한번 초기값이 저장되면 그 값을 프로그램 실행도중에 변경할수 없다. final 필드에게 초기값을 주는 방법에는 두가지가 있는데, 하나는 필드 선언시에 주는것이고, 다른 하나는 생성자에게 주는 것이다. 단순값이라면 선언시에 주는것이 제일 간단하고, 복잡한 코드가 필요하거나 외부데이터로 초기화해야 한다면 생성자에서 초기값을 지정해야한다. final과은 언뜻 상수처럼 보이지만 final을 상수라고 부르지는 않는다. 상수는 불변의 값이고 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띤다. 즉 상수는 static이면서 final이다
정적 필드는 보통 선언과 동시에 초기화를 해주지만, 계산이 필요한 초기화 작업일 경우에 생성자에서 초기화를 해주어야 한다. 하지만 보통의 인스턴스 생성 시에 호출되는 생성자의 경우 객체 생성 시에만 실행되기 때문에 객체 생성 없이도 사용해야 하는 정적 필드의 초기화에 알맞지 않다. 그래서 자바는 정적 블록( static block )을 제공한다. static { //초기화코드 } 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행되며, 클래스 내부에 여러 개가 선언될 시에는 선언된 순서대로 실행된다. 정적 블록의 사용시에 주의할 것은 정적 블록 내에서 인스턴스 필드나 인스턴스 메서드 그리고 this 키워드를 사용할 수 없다. 이는 정적 블록이 객체 없이도 실행할 수 있기 때문이다. 이러한 점은 정적 ..