본문 바로가기

java

[Java] Java Interface feature 변화의 history - 번역 History of Java interface feature changes 원문 : https://www.vojtechruzicka.com/java-interface-history/ 지나가며 글을 읽다가 빠른 번역(잘못된 번역이 많을 수 있습니다)을 해보았습니다. Original interfaces java 1.0의 interface는 두개의 type만 포함한다. constants와 public abstract methods. Constant fields Inteface는 field를 포함하고, 보통의 class와는 몇가지 차이점이 있다. - Fields는 value가 할당되어야 한다.(Fields must be assigned a value) - Fields는 public static final로 간주..
[Java] Java Iterator를 Java Stream 으로 변환하기 원문 Java Iterator to Java 8 Stream 을 가볍게 번역한 글입니다. list 대신 Iterator 객체를 반환하는 다른 라이브러리를 써야할 때가 있는데, 라이브러리의 관점에서는 문제가 없지만 반환된 iterator에서 Java 8 stream을 사용하려는 경우 문제가 될 수 있다.Iterator를 Iterable로 변환한 다음 쉽게 stream 쓸 수 있는 방법이 있다. Iterator iterator = elements.iterator(); Iterable valueIterable = () -> iterator; List StreamSupport.stream(valueIterable.spliterator(), false) .map(element -> element.asString(..
throw new UnsupportedOperationException() 자동생성되는 메소드에 throw new UnsupportedOperationException()넣기 이클립스에서 제공해주는 코드 템플릿을 이용하여, 인터페이스를 만들고 그 구현체를 퀵픽스를 통해 메소드를 자동생성했을 때 리턴값이 있을 경우 컴파일에러가 일시적으로 나지 않게 해주기 위해서 return null; 이나 return 0; 이나 임시땜빵으로 이런작업을 해주는데 이게 귀찮을 때 throw new UnsupportedOperationException()을 코드 템플릿을 이용하여 넣어주는 방법 이클립스라면 Preference – Java – Code Style – Code Templates 안에 Code/Method Body에 이를 추가해주면 된다. 자꾸 까먹어서, 링크 해 둡니다.
[Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. [Effective Java] 23. 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자. 제네릭을 사용하면 각 컬렉션에 어떤 타입의 객체를 허용할 것인지 컴파일러에게 알려주게 되며, 캐스트 코드를 컴파일러가 자동으로 만들어준다. 또한 잘못된 타입의 객체를 추가하려고 하면 컴파일 시에 알려준다. 하나 이상의 타입 매개변수(type parameter)를 선언하고 있는 클래스나 인터페이스를 제네릭 클래스, 또는 제네릭 인터페이스라고 한다. 자바 1.5를 기준으로 List 인터페이스에는 하나의 타입 매개변수로 E가 있는데, 여기서 E는 List에 저장되는 요소의 타입을 나타낸다. 각 제네릭 타입에서는 원천(raw) 타입을 정의하는데 원천 타입이란 실 타입 매개변수가 없이 사용되는 제네릭 타입의 이름을..
[Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. [Effective Java] 19. 타입을 정의할 때만 인터페이스를 사용하자. // Constant interface antipattern - do not use! public interface PhysicalConstants { // Avogadro's number (1/mol) static final double AVOGADROS_NUMBER = 6.02214199e23; // Boltzmann constant (J/K) static final double BOLTZMANN_CONSTANT = 1.3806503e-23; // Mass of the electron (kg) static final double ELECTRON_MASS = 9.10938188e-31; } 상수 인터페이스 패턴은 인터페이스..
[Effective Java] 15. 가변성을 최소화하자. [Effective Java] 15. 가변성을 최소화하자. 불변(immutable) 클래스는 자신의 인스턴스가 갖는 값을 변경할 수 없는 클래스이다. 각 인스턴스가 갖는 모든 정보는 그것이 생성될 때 제공되며 객체로 살아있는동안 변경되지 않는다. 자바의 불변 클래스는 String, 박스화 기본형(boxed primitive) 클래스, BigInteger, BigDecimal 등등이 있다. 불변 클래스는 가변 클래스에 비해 설계와 구현 및 사용이 더 쉽다. 또한 에러 발생이 적으며 보안이나 사용 측변에서 더 안전하다. 불변 클래스 만들때 다섯 가지 규칙 1) 객체의 상태를 변경하는 그 어떤 메소드(변경자라고 하는)도 제공하지 않는다. 2) 상속을 할 수 없도록 하자. 일반적으로는 클래스를 final로 지정..
[Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. [Effective Java] 11. clone 메소드는 신중하게 오버라이드 하자. Cloneable 인터페이스는 복제를 허용하는 객체라는 것을 알리는 목적으로 사용하는 믹스인 인터페이스(mixin interface) 아무런 method도 없는 Cloneable 인터페이스는 어디에 쓰이는 것일까? 이 인터페이스는 Object 클래스의 protected 메소드인 clone의 행동 방식을 규정한다. 만약, clone 메소드가 호출된 객체가 Cloneable 타입이라면, Object.clone 메소드는 이 객체의 모든 필드를 그대로 복사한 복제본을 리턴한다. 하지만 Cloneable 타입이 아니라면 CloneNotSupportedException을 던진다. java.lang.Object.clone의 명세(Sp..
[Effective Java] 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. 9. equals 메소드를 오버라이드 할 땐 hashCode 메소드도 항상 오버라이드 하자. Java API Object.hashCode 메소드 spec에 명시 - 애플리케이션 실행 중에 같은 객체에 대해 한 번 이상 호출되더라도 hashCode 메소드는 같은 정수를 일관성있게 반환해야 한다. - equals(Object) 메소드 호출 결과 두 객체가 동일하다면, 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 같은 정수 값이 나와야 한다. - equals(Object) 메소드 호출 결과 두 객체가 다르다고 해서 두 객체 각각에 대해 hashCode 메소드를 호출했을 때 반드시 다른 정수 값이 나올 필요는 없다. 그러나 같지 않은 객체들에 대해 hashCode 메소드에서 서로 다른 정수 값을 ..
[Effective Java] 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. 8. equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자. equals메소드를 오버라이드 하지 않고 써야할때 - 클래스의 각 인스턴스가 본래부터 유일한 경우 - 두 인스턴스가 논리적으로 같은지 검사하지 않아도 되는 클래스의 경우 - 수퍼 클래스에서 equals를 이미 오버라이딩 했고, 그 메소드를 그대로 사용해도 좋은 경우 - private나 패키지 전용 클래스라서 이 클래스의 equals 메소드가 절대 호출되지 않아야 할 경우 그럼 언제 해야하나? 객체 참조만으로 인스턴스의 동일 여부를 판단하는 것이 아니라, 인스턴스가 갖는 값을 비교하여 논리적으로 같은지 판단할 필요가 있는 클래스로써, 자신의 수퍼클래스에서 equals 메소드를 오버라이드하지 않았을 때다. 일반적으로 값(value) 클래스..
[Effective Java] 5. 불필요한 객체 생성을 피하자 5. 불필요한 객체 생성을 피하자 불변(immutable) 객체는 항상 재사용가능하다. String s = new String("buri"); 이렇게 쓰지 말고 String s = "buri"; 이렇게 쓰자는거 실행될 때마다 새로운 인스턴스를 생성하지 않고 하나의 String 인스턴스를 사용하며 같은 JVM에서 실행되는 어떤 코드에서도 동일한 문자열 리터럴(literal)을 갖도록 재사용될 것이다. 불변 클래스의 불필요한 객체 생성을 막으려면 생성자보다는 static 팩토리 메소드를 사용하는 것이 좋다. 생성자인 Boolean(String)보다는 static 팩토리 메소드인 Boolean.valueOf(String)을 사용하는 것이 더 좋다. 생성자는 호출될 때마다 새 객체를 만드는 반면, static ..
[Effective Java] 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자 4. private 생성자를 사용해서 인스턴스 생성을 못하게 하자 static 메소드나 static 필드만을 모아 놓은 클래스를 만들필요가 있는 유틸리티성 클래스는 인스턴스 생성이 무의미하다. 그러나 그런 클래스라도 명시적으로 지정한 생성자가 없을때 컴파일러가 디폴트 생성자 (public 이며 매개변수가 없는)를 만들어주기 때문에 javadoc 프로그램으로 생성하는 API 문서에도 나타나기 때문에 인스턴스 생성이 가능한 클래스로 오인될 수 있다. 생성자 호출을 통한 인스턴스 생성을 방지하고 API 문서에도 나타나지 않도록 하려면? private 생성자를 정의하면 인스턴스 생성이 불가능한 클래스를 만들 수 있다. public class UtilityClass { //이 클래스는 인스턴스 생성이 불가능하다라..
Eclipse Galileo에 어떤 프로젝트가 있을까? Eclipse Galileo가 릴리즈 된지 좀 되었다. 릴리즈가 되어 업데이트 할 때마다 어떤 프로젝트가 들어있는지 관심있게 살펴보지 않았는데, 이렇게 다양한 프로젝트들이 있구나.. dW에 있는 아티클을 보고 한번 알고 가는게 좋을 듯 하다. Eclipse Galileo 살펴보기최신 버전의 오픈 소스 다목적 IDE 및 애플리케이션 플랫폼의 새로운 기능 표 1. Galileo 릴리스 트레인 프로젝트 프로젝트 개요 웹 사이트 ACTF(Accessibility Tools Framework) 장애가 있는 사용자를 위한 애플리케이션 및 컨텐츠 개발 http://www.eclipse.org/actf/ BIRT(Business Intelligence and Reporting Tools) 보고서 생성 http://ww..
[Effective Java] 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. 3. private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자. 싱글톤(singleton)은 정확히 하나의 인스턴스만 생성되는 클래스. 싱글톤은 본질적으로 유일한 시스템 컴포넌트를 나타낸다. 예를 들면, 윈도우 매니저나 파일 시스템 등 자바 1.5 이후 싱글톤 구현하는 가장 좋은 방법 //열거형( Enum) 싱글톤 public enum Elvis { INSTANCE; public void leaveTheBuilding() { ... } } 복잡한 직렬화나 리플렉션 상황에서도 직렬화가 자동으로 지원되고, 인스턴스가 여러 개 생기지 않도록 확실하게 보장해준다.
[Effective Java] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자. Static 팩토리 메소드와 생성자의 공통적인 제약은 선택 가능한 매개변수가 많아질 경우 신축성 있게 처리하지 못한다는 것인데, 흔히 나도 그러한데 텔리스코핑 생성자(telescoping constructor)패턴을 사용한다. 필수 매개변수들만 갖는 생성자, 필수 매개변수들과 선택 매개변수 하나를 갖는 생성자, 선택 매개변수 두개를 갖는 생성자 등등의 형태로 오버로딩을 통해 여러개의 생성자를 겹겹이 만드는 것이다. public class User{ private String id; private String pw; private String address; // .......15 more field public User(String id, String pw){ this(id, pw, null); } pu..
[dW] Ajax와 자바 개발을 간단하게 시리즈~ dW에서 3주동안 시리즈로 올라오는 글 중 웹개발에 도움되는 글이 있군요. Ajax와 자바 개발을 간단하게, Part 1 JSP 태그 파일로 자바스크립트 코드 동적으로 생성하기 내용인데 HTML과 URL 인코딩 함수 - 유틸리티 함수가 유용하군요~ Ajax와 자바 개발을 간단하게, Part 2 JSTL과 JSP 태그 파일을 사용하여 커스터마이징이 가능한 웹 컴포넌트를 만들기 Ajax와 자바 개발을 간단하게, Part 3 자바스크립트와 JSP 태그 파일을 사용하여 사용자 친화적이고 웹 폼에 안전한 검증 기능을 구현하기 사용자가 웹 브라우저에 입력한 값을 자바스크립트로 검사하는 valid 같은 특정 기능에 얽매이지 않고 더 일반적인 함수를 만들 수 있는 코드가 있군요. 저같이 수련이 많이 필요한 사람에겐~ ..
[dW] REST 서비스 작성하기 REST 서비스 작성하기 이 글은 REST(Representation State Transfer)와 Atom Publishing Protocol(APP)에 관한 개념이 잘 나와있습니다. 그리고 REST/APP 기반의 서비스 구현 방법도 예로 나와있지요~ 본문 내용중에, REST 원칙은 URI(Uniform Resource Identifiers)를 사용하여 주어진 자원 표현의 위치를 알아내고 접근한다. 표현 상태(representational state)라 알려진 자원 표현은 만들어질 수도, 찾아올 수도, 수정될 수도, 삭제될 수도 있다. 예를 들어 REST를 적용하여 문서를 발행해 독자들이 이 문서를 읽을 수 있게 할 수 있다. 언제든 문서를 발행할 때는 웹 URL을 보여줘야 한다. 그래야 독자들이 그 ..
[dW] Practically Groovy: Reduce code noise with Groovy 요즘 Groovy에 대해 조금 공부하고 있는데 dW에 찾아보니 Groovy에 특성이 나타나 있는 글을 발견했는데 자바에서의 noise와 복잡성을 Groovy를 사용해서 제거하는 방법이 주로 나타나있습니다. 자바에서 JavaBean을 썼을때와 Groovy에서 Bean을 생성했을때의 코드차이. Groovy에서도 Junit을 이용해 테스트 코드를 작성하는 법, polymorphism, Spring framework를 사용하는 방법들이 소개되어 있습니다. Groovy에 대해 직접적인 언급보다는 기존 자바코드와 비교해서 또는 자바와 함께 쓸때의 장점등이 나타나있군요. 이래서 Groovy를 쓰면 편하겠다~ 라는 글.. ^^ Practically Groovy: Reduce code noise with Groovy
[dW] XStream으로 자바 객체를 XML로 직렬화하기 자바객체를 직렬화하려면 흔히 어떻게 하는 방법이 있을까요? 오픈 소스 라이브러리를 써주는 센스!를 발휘하려면 어떤 라이브러리가 있는지 알아야겠지요. 전 dW에 번역글이 올라와서 알게 된 XStream이 있는데 정말 몇줄로 자바객체를 XML로 직렬화 시켜주는 군요. [dW] XStream으로 자바 객체를 XML로 직렬화하기 이곳을 참조하면, 이클립스 프로젝트에서 클래스를 생성해서 단 몇줄로 자바객체를 XML로 직렬화하는 방법이 나와있습니다. 친절하게 이클립스의 스크린샷까지.. XStream 사이트에 가보면 제일 첫 화면에 보이는 "XStream" is a simple library to serialize objects to XML and back again. 정말 심플한 라이브러리일까? 한번 소스를 봐보면..
[dW] 동적인 언어를 동적으로 호출하기, Part 1: 자바 스크립팅 API (한글) Java SE 6에 추가된 패키지중에 자바 코드에서 스크립팅 언어를 런타임 시에 호출하도록 도와주는 javax.script 패키지가 있다. 그렇구나! 동적인 언어를 동적으로 호출하기, Part 1: 자바 스크립팅 API (한글) 이 문서에서 코드를 다운로드 받아서 실행해보면 쉽게 이해가 된다. 내부는 잘은..모르겠지만, 이 패키지는 다른 스크립트 언어로 작성된 것을 공통 API를 사용하여 호출될 수 있도록 하는 class와 interface를 제공하기에 인터페이스를 통해 JVM안에서 스크립팅 코드를 작성할 수 있고 실행할 수 있다. 스크립팅 패키지를 사용할 수 있는 경우는 완벽한 규칙 엔진에 의존하지 않고, 자바 언어보다 단순한 언어로 비즈니스 규칙을 작성한다. 플러그인 아키텍처를 생성하여 사용자들이 즉..
[dW] 클래스 로딩 문제 분석하기 클래스 로딩 문제 분석하기에 좋은 글이 있어서 올립니다 원문이 나온지는 좀 되었지만, 한번 읽어보기에 좋은 것 같습니다. 아래 내용은 저혼자 공부하면서 내용을 잠깐 정리해 본 것입니다. Part 4로 이루어져 있기에 정리한 내용보다 더 방대한 내용이 담겨져 있습니다. ^^ 클래스 로딩 문제 분석하기, Part 1: 클래스 로딩과 디버깅 툴 소개 (한글) 클래스 로딩 문제 분석하기, Part 2: 기본적인 클래스 로딩 예외(Exception) (한글) 클래스 로딩 문제 분석하기, Part 3: 특이한 클래스 로딩 문제 해결 (한글) 클래스 로딩 문제 분석하기, Part 4: 교착 상태와 제약 조건 (한글) 원문 시리즈 http://www.ibm.com/developerworks/views/java/libr..