목록프로그래밍 언어/자바 (16)
나의 지식 보관소
자바에서 클래스에 public 접근제한자를 추가하기 위해서는 그 클래스의 이름이 파일명과 동일해야한다. ( 파일명과 일치하는 클래스 내부에서 다른 클래스를 포함하는 경우는 public이 가능하다. ) 이러한 제한이 있는 이유는 가독성에 도움을 주기 위함인데, 하나의 자바파일에 여러 개의 클래스를 작성하는 경우 대표클래스를 지정하고 파일명과 동일하게 하는 것이 가독성에 도움이 된다.
테스트 주도 개발에 대한 책을 보던 중 이상한 코드를 발견했다 추상클래스의 추상메서드를 하위 클래스에서 오버라이딩하는데 리턴타입이 다른데도 컴파일이 정상적으로 됐다. 분명 상속관계에서 메소드 오버라이딩은 리턴타입, 메소드 이름, 매개변수가 완전히 동일해야 이루어진다고 배웠었는데.. 하고 검색해보니 자바한정으로 ( 사실 다른언어도 되는진 잘 모르겠는데 C#에서는 안되는걸 확인했다. ) 다음 두가지 조건을 만족하면 리턴타입이 달라도 오버라이딩이 허용된다. - 반환형이 원시타입이 아닌경우 - 상위 클래스의 메서드의 반환형으로 오버라이드된 메서드의 반환형이 자동 형변환이 가능한 경우 class Base { public Object display(String obj) { System.out.println("Bas..
junit을 통한 테스트를 위한 코드와 소스코드를 분리하기 위해서 폴더를 구분하니 두 코드를 동일한 패키지에 둘 수가 없어서 곤란하던 차에 maven을 이용해봤다. maven을 통해 프로젝트를 생성하면 아래 사진처럼 경로 전체가 패키지명이 아니라 끝부분만 패키지명으로 사용하고 있는 것을 볼 수 있다. maven 없이 저렇게 패키지를 사용하기 위해서는 우선 자바 프로젝트 생성시 기본으로 생성되는 src가 Java Source Path로 지정되어있는 것을 풀고 다음과 같이 폴더를 만들어주면 된다. 나는 com.practice.tdd를 패키지명으로 사용할 생각이기 때문에 src\main\java와 src\test\java 폴더를 Java Source Path로 지정해주면 된다. 이렇게 하면 아래 사진처럼 경로..
멀티스레드 프로그램에서 스레드들이 객체를 공유해서 작업하는 경우에 하나의 데이터에 여러 스레드들이 동시에 접근하면 의도치 않은 결과를 만들어 낼 수 있다. 때문에 스레드가 사용 중인 데이터를 다른 스레드가 변경할 수 없도록 잠금을 걸어야 한다. 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역을 임계 영역(critical section)이라 부른다. 자바는 이러한 임계 영역을 지정하기 위해 동기화 메서드와 동기화 블록을 제공한다. 스레드가 객체 내부의 동기화 메서드 또는 블록에 들어가면 즉시 객체에 잠금을 걸어 다른 스레드가 임계 영역을 실행하지 못하도록 막는다. 동기화 메서드를 만드는 방법은 선언에 synchronized 키워드를 붙이면 된다. public synchronized ..
정규표현식 정리 표 아래 표들은 자바API 페이지를 번역한것을 기반으로 번역하면서 개인적으로 알아본 내용을 덧붙여서 만들어졌습니다. 다소 어색하거나, 틀린 문구가 있을 수도 있으니. 오류 발견시 댓글로 알려주시면 수정하겠습니다. 사용설명에 관한 내용은 여기에서 볼수 있습니다. 자바에 적힌것보다 문법이 양이 적은데 아마 자바에서 추가된 문법인것 같네요(아마도). 문자 기호 설명 x 문자 x \\ 백슬래시 문자 \0n 8진수 값을 가진 문자 0n (0
메서드 내부에서 예외 발생 가능성이 있는 코드를 작성할때 try-catch를 통해 예외처리를 하는것이 기본이지만, 메서드를 호출한 곳으로 예외를 떠넘길 수 도있다. 이때 throws 키워드를 통해 아래와 같이 선언한다. 리턴타입 메서드명(매개변수, ...) throws 예외클래스, ... { } 일반적으로 throws뒤에 발생할수있는 예외를 다적어주거나 Exception 하나만으로 간단히 처리할수도 있다. throws 키워드가 붙은 메서드는 반드시 try블록 안에서 호출되어야 한다. 그리고 예외를 떠맡은 메서드가 또 다시 자신을 호출한 곳에 예외를 떠넘기는것도 가능하다.
기존에 입출력 스트림이나 소켓 등을 사용할 때 아래와 같이 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..