Java 1.4.2 이후 놓친 부분을 파악하도록 도와주세요.


14

소프트웨어 개발자로서의 첫 직업 경력을 시작하려고하는데 많은 Java 코드를 작성하게 될 것입니다. 나는 내가 구체적으로 무엇을 쓸 것인지에 대해 많이 알지 못하며, 어쨌든 코드와 관련하여 상당히 광범위한 관심을 가지고 있습니다.

논의 할 가치가없는 이유로, 마지막 인턴쉽은 Java 1.3 및 1.4 SDK만을 코딩하는 것이 었습니다. 또한 대학 교육은 주로 언어 기능이나 라이브러리가 아닌 알고리즘, 데이터 구조 및 기타 이론에 중점을 두었습니다.

따라서 위의 사항을 염두에두고 현재 Java 버전 (어떤 숫자입니까?)에서 어떤 기능, 클래스 등을 읽을 시간이 있습니까? 1.4.2 이후 프로그래머로서의 삶을 편하게 해줄 수있는 것이 무엇입니까?

특정 패키지 또는 이와 같은 패키지를 발견하여 사용하는 방법에 대한 예제와 이야기도 훌륭합니다.


4
논의 할 가치가없는 이유는 무엇입니까? 우리 중 많은 사람들이 흥미를 느끼고 있습니다.
5arx

@ 5arx 글쎄, 나는 어떤 이유로 플랫폼이 지원했기 때문에 Robotics Programming을 위해 1.4 버전의 java로 작업했습니다.
Daniel Gratzer 2016 년

답변:


15

내가 가장 중요하게 생각하는 변경 사항은 다음과 같습니다.

  • 제네릭 (예 : Set과 같은 형식화 된 컬렉션)

  • 개선 된 for 루프 (for (String s : set) {...})

  • 오토 박싱 / 언 박싱 (Integer와 같은 유형을 int로 또는 그 반대로 자동으로 변환)

  • Typesafe 열거 형 (enum은 이제 키워드이며, 열거 형에서 유형을 만들 수 있음)

  • Varargs (printf () 함수의 경우 가변 개수의 인수 허용)

  • 정적 가져 오기 (이제 java.lang.Math와 같은 클래스의 정적 메소드를 가져올 수 있음)

  • 주석

  • java.util.concurrent (자바 동시성 설명)

또한 어떤 Java를 목표로 삼고 있습니까?를 읽어보십시오 . , 세 가지 버전 각각에 대해 더 잘 이해합니다.


1
++ 향상된 for 루프, 오토 박싱 / 언 박싱, varargs, 정적 임포트는 간단합니다
Michael Wiles

Java 프로그래머가 for-each 루프를 "향상된 for루프 "라고 부르는 이유는 무엇 입니까?
Maxpm

2
@Maxpm Java 언어 사양에서 호출되는 방식입니다. JLS에 따라 기본 for 루프와 향상된 for 루프가 있습니다. 나는 그들이 왜 그렇게하기로 결정했는지 잘 모르겠습니다. 구문에서 특수 키워드와 일반 루프와의 혼합을 사용하지 않기 때문일 수 있습니다.
Malcolm

10

일상적인 프로그래밍 생활에서 가장 중요한 단일 변경 사항은 작성해야 할 모든 새로운 모듈에서 사용될 가능성이 높은 제네릭 을 도입 하는 것이며 혼란스러운 새로운 구문입니다.

제네릭은 예 List를 들어 알몸 객체 대신 문자열을 포함 할 수있는 메커니즘입니다 . 여기서 컴파일러는 목록에 넣을 항목이 문자열임을 강요하고 목록에서 항목을 가져올 때 문자열임을 알고 있습니다. .

이렇게하면 대상 유형으로의 명시적인 런타임 캐스트 (오류가 발생하는 경우 빈번한 오류의 원인 임)를 피할 수 있으므로 더 나은 프로그램을 만들 수 있습니다. 그것은 단지 객체 목록 일 때였습니다.

Joshua Bloch는 Generics에 대한 좋은 소개를 작성했으며, http://java.sun.com/docs/books/effective/ 의 샘플 장으로 제공됩니다.


그루비 사람들에게 말하지 마십시오! "대상 유형으로의 런타임 캐스트를 피함으로써 더 나은 프로그램을 만들 수 있습니다." def whatever....
Dan Rosenstark

@Yar,보다 명확하게 편집되었습니다. 나는 것 사랑 은 "데프"또는 "VAR"속성을. 내 인생을 좀 더 쉽게 만들 것입니다.

예, 최근에 Objective-C를 사용하여 이것을 생각하고 있었지만 id어느 것이 def또는 var....하지만 다시 100 % 정적 타이핑의 안전성은 정말 놀랍습니다.
Dan Rosenstark

@Yar : 당신은 Ada를 사랑합니다 :)
mattnz

@mattnz 왜, 특히? 그리고 우리가 여기있는 동안 JVM에서 실행됩니까?
Dan Rosenstark

6

오토 박싱 은 Java 5에 도입 된 멋진 기능입니다. C #에서와 마찬가지로 컴파일러는 이제 기본 (기본) 유형과 해당 객체 래퍼 클래스 (정수와 같은 정수) 사이를 자동으로 변환하고 다시 변환합니다. 따라서 Java Collections로 작업하는 것이 훨씬 덜 어려워집니다.

For-each 루핑은 Java 5에서도 처음 등장했습니다. 인덱스 변수 또는 이터레이터의 설정 및 관리와 관련된 일반적인 혼란을 없애기 때문에 배열 (및 컬렉션)을 쉽게 반복 할 수 있습니다. 예를 들면 다음과 같습니다.

void myMethod(Collection<myObjectType> c) {
    for (myObjectType o : c)
        o.foo();
}

6

Enums- 최종 정적 및 상수를 대체하고 문자열 및 매직 넘버에 대한 참조를 제거하는 데 도움이됩니다. 태양 / 오라클 의 훌륭한 사람들로부터 얻은 예 :

public enum Planet {
    MERCURY (3.303e+23, 2.4397e6),
    VENUS   (4.869e+24, 6.0518e6),
    EARTH   (5.976e+24, 6.37814e6),
    MARS    (6.421e+23, 3.3972e6),
    JUPITER (1.9e+27,   7.1492e7),
    SATURN  (5.688e+26, 6.0268e7),
    URANUS  (8.686e+25, 2.5559e7),
    NEPTUNE (1.024e+26, 2.4746e7),
    PLUTO   (1.27e+22,  1.137e6);

    private final double mass;   // in kilograms
    private final double radius; // in meters
    Planet(double mass, double radius) {
        this.mass = mass;
        this.radius = radius;
    }
    public double mass()   { return mass; }
    public double radius() { return radius; }

    // universal gravitational constant  (m3 kg-1 s-2)
    public static final double G = 6.67300E-11;

    public double surfaceGravity() {
        return G * mass / (radius * radius);
    }
    public double surfaceWeight(double otherMass) {
        return otherMass * surfaceGravity();
    }
}

public static void main(String[] args) {
        double earthWeight = Double.parseDouble(args[0]);
        double mass = earthWeight/EARTH.surfaceGravity();
        for (Planet p : Planet.values())
           System.out.printf("Your weight on %s is %f%n",
                             p, p.surfaceWeight(mass));
    }

6

java.util.concurrent 는 1.5에서 도입되었습니다. 그것을 배우기위한 가장 좋은 자료는 Java Concurrency in Practice 책일 것입니다. IMHO 동시성은 다른 어떤 것에 비해 Java의 가장 중요한 경쟁 우위이므로 잘 알고 있어야합니다.


1
+1 동시 패키지에 대한 언급으로, 많은 개발자들이 여전히 Threads, wait () / notify () 및 동기화와 같은 동시성 기본 요소를 사용한다는 것은 슬픈 일입니다.
Oliver Weiler

과연. java.util.concurrent동시성 프리미티브는 자동 메모리 관리에서 수동 메모리 관리와 같습니다. 후자를 사용하는 것은 디버깅에 더 많은 시간을 소비하는 방법 일 뿐이며 이점이 없습니다.
Joonas Pulakka

구조 대원들! Java 6에서 더 우수

내가 할 수 있다면 +1000 – 그 책은 놀랍습니다
Gary Rowe

4

음, StringBuilder내 프로그램을 빠르게 도와주었습니다. StringBuffer나사산 이 없는 안전 장치 와 동일합니다 .


네. 효과적인 Java는 StringBuffer가 더 이상 사용되지 않으며 StringBuilder로 대체되어야한다고 말합니다.
Gary Rowe

1
+문자열 연결 은 소스 레벨 1.5 이상의 경우 StringBuffer 대신 자동으로 StringBuilder를 사용합니다.

4

@ykombinator의 유용한 답변을 분류하여 도와 드리겠습니다. 그의 목록은 "일반적인"Java 개발을 수행하는 동안 매일 사용할 요소 목록입니다.

낮은 충격과 낮은 난이도 :

  • 개선 된 for 루프 (for (String s : set) {...})
  • 오토 박싱 / 언 박싱 (Integer와 같은 유형을 int로 또는 그 반대로 자동으로 변환)
  • Varargs (printf () 함수의 경우 가변 개수의 인수 허용)
  • 정적 가져 오기 (이제 java.lang.Math와 같은 클래스의 정적 메소드를 가져올 수 있음)

높은 충격과 중간 정도의 난이도 :

  • Typesafe 열거 형 (enum은 이제 키워드이며, 열거 형에서 유형을 만들 수 있음)

높은 충격과 높은 난이도 :

  • 주석
  • 제네릭

낮은 충격과 높은 난이도 (고급 스레딩을하지 않는 한 사용)

  • java.util.concurrent (자바 동시성 설명)

따라서 저 충격 저조도 조각에 대한 문서 / 도움말을 읽어 보는 것이 좋습니다. 주석 및 제네릭에 적절한 시간을 보냅니다. 주석은 매우 유용하며 제네릭은 다소 복잡해질 수 있습니다.

스레딩을 수행해야하는 경우 새 동시성 콘텐츠 만 확인하십시오.


4

50 세 미만이므로 댓글을 달 수 없으므로 답변을 드리겠습니다. 이미 언급되었지만 다시 반복하겠습니다. 주석! 이런 종류의 메타 데이터는 저의 Java 경험에서 가장 중요한 것이되었습니다. 일부 프레임 워크와 마찬가지로 잘 사용되어 코드를 훨씬 간결하고 깨끗하게 만듭니다. 예를 들어 주석은 다음을 수행 할 수 있습니다.

  • 객체를 엔티티 @Entity 로 변환
  • 메소드를 REST 서비스 @GET 으로 변환
  • 메소드는 null @nonnull을 반환하지 않을 것이라고 설명
  • 의존성 주입 @inject에 대한 객체를 필드로 설정

물론 고유 한 주석을 작성하고 리플렉션을 사용하여 메서드, 클래스 또는 필드에 주석을 달 수 있는지 알 수 있습니다.


2
정확한 주석이 되려면 메타 정보를 코드에 넣는 것만으로 이러한 작업을 수행 할 수 없습니다. 다른 코드 (종종 특수 클래스 로더)가 조치를 취할 수 있습니다. 주석은 많은 문제에 대한 매우 일반적인 해결책이라고 생각합니다.

3

모범으로 배우는 것이 저에게 효과적입니다

다음은 관용적 Java 6의 간단한 예입니다.

public class Main {
  public static void main(String[] args) {
    // Shows a list forced to be Strings only
    // The Arrays helper uses generics to identify the return type
    // and takes varargs (...) to allow arbitary number of arguments
    List<String> genericisedList = Arrays.asList("A","B","C");

    // Demonstrates a for:each loop (read as for each item in genericisedList)
    for (String item: genericisedList) {
      System.out.printf("Using print formatting: %s%n",item);
    }

    // Note that the object is initialised directly with a primitive (autoboxing)
    Integer autoboxedInteger = 1;
    System.out.println(autoboxedInteger);

  }
}

Java5에는 신경 쓰지 말고 Java6에서는 더 이상 사용되지 않습니다.

다음 단계는 주석입니다. 이것들은 주석 독자가 상용구 구성을 채울 수 있도록 코드 측면을 정의합니다. JAX-RS 스펙을 사용하는 간단한 웹 서비스 (RESTful URI 이해)를 고려하십시오. 모든 불쾌한 WSDL을 수행하고 Axis2 등을 다루는 것을 원하지 않으면 빠른 결과를 원합니다. 그렇습니다.

// Response to URIs that start with /Service (after the application context name)
@Path("/Service")
public class WebService {

  // Respond to GET requests within the /Service selection
  @GET
  // Specify a path matcher that takes anything and assigns it to rawPathParams
  @Path("/{rawPathParams:.*}")
  public Response service(@Context HttpServletRequest request, @PathParam("rawPathParams") String rawPathParams) {
    // Do some stuff with the raw path parameters 

    // Return a 200_OK
    return Response.status(200).build();
  }
}

쾅. web.xml에 약간의 구성 마법이 뿌려져 있습니다. Maven으로 빌드하고 Jetty 플러그인을 구성한 경우 프로젝트에 JBoss 또는 Tomcat을 다루지 않고 자체 웹 서버가 있으며 위 코드는 URI의 URI에 응답합니다. 형태:

GET http://localhost:8080/contextName/Service/the/raw/path/params

작업이 완료되었습니다.


3

와아, 그것은 과거로부터의 폭발이었다! 나는 4 년 동안 Java를 사용하지 않았으며, 그 당시에는 전혀 변화가 없었다!

거기의 버전에 의한 기능의 목록은 , 그러나 여기 (물론 표절) 중요한 비트입니다 ...

J2SE 5.0 (2004 년 9 월 30 일)

  • 제네릭 : 컬렉션에 컴파일 타임 (정적) 형식 안전성을 제공하고 대부분의 형식 캐스팅 (유형 변환)이 필요 없습니다.
  • 메타 데이터 : 주석이라고도합니다. 클래스 및 메소드와 같은 언어 구성에 추가 데이터로 태그를 추가 한 다음 메타 데이터 인식 유틸리티로 처리 할 수 ​​있습니다.
  • 오토 박싱 / 언 박싱 : 기본 유형 (예 : int)과 기본 래퍼 클래스 (예 : 정수) 간의 자동 변환.
  • 열거 형 : enum 키워드는 형식이 안전한 정렬 된 값 목록 (예 : Day.MONDAY, Day.TUESDAY 등)을 만듭니다. 이전에는 형식이 안전하지 않은 상수 정수 또는 수동으로 생성 된 클래스 (유형 안전 열거 형 패턴) 만 사용할 수있었습니다.
  • 스윙 (Swing) : 신스 (synth)라고 불리는 새로운 스킨 가능 모양과 느낌
  • Varargs : 메소드의 마지막 매개 변수는 유형 이름 뒤에 3 개의 점 (예 : void drawtext (String ... lines))을 사용하여 선언 할 수 있습니다. 호출 코드에서 해당 유형의 매개 변수를 여러 개 사용할 수 있으며 메소드에 전달할 배열에 배치하거나 호출 코드가 해당 유형의 배열을 전달할 수 있습니다.
  • 각 루프에 대해 향상 : for 루프 구문은 다음 형식의 구성을 사용하여 표준 Collection 클래스와 같은 배열 또는 Iterable의 각 멤버를 반복하기위한 특수 구문으로 확장됩니다.

Java SE 6 (2006 년 12 월 11 일)

  • 이전 Win9x 버전에 대한 지원이 중단되었습니다. 비공식적으로 Java 6 Update 7은 이러한 Windows 버전에서 작동하는 것으로 표시된 마지막 Java 릴리스입니다. 이것은 업데이트 10의 주요 변경 사항으로 인한 것으로 생각됩니다.
  • 스크립팅 언어 지원 : 스크립팅 언어와의 긴밀한 통합 및 내장 Mozilla JavaScript Rhino 통합을위한 일반 API
  • 핵심 플랫폼 및 Swing의 성능이 크게 향상되었습니다.
  • JAX-WS를 통한 향상된 웹 서비스 지원
  • JDBC 4.0 지원
  • Java Compiler API Java 프로그램이 프로그래밍 방식으로 Java Compiler를 선택하고 호출 할 수 있도록하는 API입니다.
  • JAXB를 버전 2.0으로 업그레이드 : StAX 파서 통합 포함
  • 플러그 가능 주석 지원
  • API에서 SwingWorker 통합, 테이블 정렬 및 필터링, 진정한 Swing 이중 버퍼링 (회색 영역 효과 제거)과 같은 많은 GUI 개선.
  • JVM 개선 사항에는 동기화 및 컴파일러 성능 최적화, 새로운 알고리즘 및 기존 가비지 수집 알고리즘으로의 업그레이드 및 응용 프로그램 시작 성능이 포함됩니다.

그게 다야. Java SE 7.0이 더 재미있어 보이지만 아직 릴리스되지 않았습니다.

지난 4 년 동안 C #에 몇 가지 새로운 언어 기능과 API가 추가되었는지를 고려하면 놀랍습니다. Sun / Oracle에서 무슨 일이 있었나요?


Sun은 오픈 소스 Java를 결정했습니다. 이다 오라클이해야 할 결정에 관계없이 우리가 여전히 리눅스 박스에 오픈 JDK를 실행할 수 있음을 보장하고있다 것. 그것은 단지 18-24 개월을 지연시켰다 ...

@ Thorbjørn-설명 할 수 있습니다. 이번 인수로 얼마나 큰 혼란을 겪었는지는 부끄러운 일입니다. 나는 C #이 비교 안정성을 즐긴다 고 생각한다. 우리는 2006 년부터 람다를 가지고 있었다. 그들은 2012 년까지 자바에 들어 가지 않는 것처럼 보인다.
sheikhjabootie
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.