C #과 Java의 주요 차이점은 무엇입니까?


209

한 가지만 명확히하고 싶습니다. 이것은 어느 것이 더 나은지에 대한 질문이 아니며, 그 부분은 다른 사람에게 토론하기 위해 남겨 둡니다. 상관 없어요 면접에서이 질문을 받았으며 조금 더 배우는 것이 도움이 될 것이라고 생각했습니다.

이것들은 내가 생각해 낼 수있는 것들입니다.

  • Java는 "플랫폼 독립적"입니다. 요즘에는 모노 프로젝트 가 있다고 말할 수 있으므로 C #도 고려 될 수 있지만 약간 과장된 것 같습니다. 왜? 글쎄, Java의 새로운 릴리스가 완료되면 지원하는 모든 플랫폼에서 동시에 사용할 수 있습니다. 반면에 Mono 구현에서 아직 C # 3.0의 몇 가지 기능이 여전히 누락 되었습니까? 아니면 여기서 비교해야하는 것이 실제로 CLRJRE 입니까?
  • Java는 이벤트 및 대리자를 지원하지 않습니다. 내가 아는 한.
  • Java에서는 모든 메소드가 가상입니다
  • 개발 도구 : Visual Studio와 같은 도구는 아직 없다고 생각합니다. 특히 팀 에디션으로 작업 한 경우 내가 의미하는 바를 알게됩니다.

관련이 있다고 생각되는 다른 사람을 추가하십시오.

업데이트 : 방금 떠 올랐습니다 .Java에는 클래스, 메소드 등에 대한 사용자 정의 속성이 없습니다. 그렇지 않습니까?


1
언어는 라이브러리와는 다른 언어 구현과 다릅니다. 무엇을 비교하려고합니까?
미구엘 핑

1
C Sharp 및 Java 비교를 참조하십시오 .
gimel

2
I이 하나 발견 msdn.microsoft.com/en-us/library/ms836794.aspx 이것은 C # 및 자바 사이의 유사성 및 차이를 모두 포함한다.
Bipul

1
올바른 라이브러리를 사용하면 Java에 대해 아래에 언급 된 많은 것들을 얻을 수 있습니다. 유효한 Java 코드를 확인하십시오. new String [] { "james", "john", "john", "eddie"} .where (startsWith ( "j")). distinct (); lombok-pg라는 라이브러리를 사용합니다. github.com/nicholas22/jpropel에서 찾을 수 있습니다
NT_

답변:


329

Java 7과 C # 3 비교

(여기서는 Java 7의 일부 기능에 대해서는 언급하지 않았지만 usingJava 1-6에 비해 모든 버전의 C #의 장점은 제거되었습니다.)

모든 요약이 올바른 것은 아닙니다.

  • Java 메소드는 기본적으로 가상 이지만 최종 메소드로 만들 수 있습니다. C #에서는 기본적으로 봉인되어 있지만 가상으로 만들 수 있습니다.
  • 무료 (예 : Eclipse, Netbeans) 및 상업용 (예 : IntelliJ IDEA) 모두 Java 용 IDE가 많이 있습니다.

그 외에도 (그리고 이미 요약 된 내용) :

  • 제네릭은 둘 사이에서 완전히 다릅니다. Java 제네릭은 컴파일 타임 "트릭"(그러나 유용한 것)입니다. C에서 # 및 .NET 제네릭도 실행 시간 유지하고있다 값 유형뿐만 아니라 참조 타입 작업, 적절한 효율을 유지하는 (예를 들어 List<byte>A와 byte[]다소 박스형 바이트의 배열보다 배면으로).
  • C #에서 예외를 확인하지 않았습니다.
  • Java는 사용자 정의 값 유형을 만들 수 없습니다
  • Java에는 연산자 및 변환 오버로드가 없습니다.
  • Java에는 반복자를 간단히 구현하기위한 반복자 블록이 없습니다.
  • Java에는 LINQ와 같은 것이 없습니다.
  • 델리게이트가 없기 때문에 Java에는 익명 메소드 및 람다 식과 같은 것이 없습니다. 익명의 내부 클래스는 일반적으로 이러한 역할을 수행하지만 어수선합니다.
  • Java에는 표현식 트리가 없습니다.
  • C #에는 익명의 내부 클래스가 없습니다.
  • C #에는 Java의 내부 클래스가 전혀 없습니다. 실제로 C #의 모든 중첩 클래스는 Java의 정적 중첩 클래스와 같습니다.
  • 자바는 정적 클래스가없는 (없는 모든 인스턴스 생성자, 변수에 사용할 수없는 등의 매개 변수)
  • Java에는 C # 3.0 익명 유형과 동등한 것이 없습니다.
  • Java에는 암시 적으로 유형이 지정된 로컬 변수가 없습니다.
  • Java에는 확장 방법이 없습니다
  • Java에는 객체 및 컬렉션 이니셜 라이저 표현식이 없습니다.
  • 액세스 수정자는 다소 다릅니다. Java에는 현재 어셈블리와 직접적으로 동등한 요소가 없으므로 "내부"가시성에 대한 아이디어가 없습니다. C #에서는 네임 스페이스 (및 상속)를 고려한 Java의 "기본"가시성에 해당하지 않습니다.
  • Java와 C #의 초기화 순서는 미묘하게 다릅니다 (C #은 기본 형식의 생성자에 대한 체인 호출 전에 변수 이니셜 라이저를 실행합니다)
  • Java에는 언어의 일부로 속성이 없습니다. 그것들은 get / set / is 메소드의 규칙입니다.
  • Java에는 "안전하지 않은"코드와 동등한 것이 없습니다
  • Interop은 Java의 JNI보다 C # (및 일반적으로 .NET)에서 더 쉽습니다.
  • Java와 C #은 열거 형에 대한 아이디어가 약간 다릅니다. Java는 훨씬 객체 지향적입니다.
  • Java에는 전 처리기 지시문이 없습니다 (C #의 #define, #if 등).
  • 자바의 'C 번호의 상응 없다 refout참조 파라미터를 흘리는
  • Java에는 부분 유형과 동등한 것이 없습니다.
  • C # 인터페이스는 필드를 선언 할 수 없습니다
  • Java에는 부호없는 정수 유형이 없습니다.
  • Java는 10 진수 유형에 대한 언어 지원 이 없습니다 . (java.math.BigDecimal은 System.Decimal 과 같은 것을 제공 하지만 차이점은 있지만 언어 지원은 없습니다)
  • Java에는 널 입력 가능 값 유형과 동등한 것이 없습니다.
  • 자바에서 복싱은 미리 정의 된 (그러나 "정상적인") 참조 유형을 사용합니다. C # 및 .NET의 복싱은 CLR에서 모든 값 유형에 대한 복싱을 위해 참조 유형을 작성하여보다 투명합니다.

이것은 철저하지는 않지만 내가 생각할 수없는 모든 것을 다룹니다.


24
@Brian : Java 제네릭과 내부 클래스의 세부 사항은 단순성을 통해 Java의 우수성을 달성한다는 아이디어를 매우 빨리 think다고 생각합니다.)
Jon Skeet

8
@OrangeDog : 대부분 농담을하는 사람들, IMO. 명시적인 try / finally 블록을 강제로 작성하는 것이 using 문 IMO보다 오류가 덜 발생하는 방법을 알기가 어렵습니다. Java와 비교 한 대부분의 C #의 "추가"기능은 더 적은 코드를 작성하여 도망 갈 수 있으며 해당 코드를 더 읽기 쉽게 할 수 있음을 의미합니다.
Jon Skeet

17
@OrangeDog : 당신은 얼마나 공평하지 않습니까? 예, 저는 C # 애호가이지만 Java 경험이 상당히 풍부합니다. 결국 내 일입니다. Java를 효과적으로 사용하는 방법을 모르는 것은 아닙니다.
Jon Skeet

8
@OrangeDog : 처음에, 대부분의 개발자들은 내가 아는 한 "안전하지 않은"코드를 사용하지 않기 때문에 빨간 청어입니다. 또한 확률은 붉은 청어라고 생각합니다. 형식적인 확률은 인간 이 코드에 대해 추론 하는 것이 얼마나 쉬운가와 관련이 없다고 생각 합니다. 필자의 요점은 Java와 C #에서 모두 경험이 풍부한 사람으로서 C #이 생산성과 가독성 측면에서 훨씬 우수한 언어라는 것을 알았습니다. 반대되는 느낌이들 경우, 두 언어의 경험 수준을 명확히 할 수 있습니까? 나는 그것이 토론과 관련이 있다고 생각합니다.
Jon Skeet 2012 년

21
@OrangeDog : 또한, "더 많은 일을 할 수 있다는 것이 잘못 될 가능성이 높아진다"는 주장은 IMO의 오류이기도합니다. 언어를 사용하면 쉽게 할 수 있습니다. Java와 C #에서 수행해야하는 작업은 종종 동일하지만 기능이 없기 때문에 Java로 인해 해당 작업을 올바르게 수행하기가 더 어려워집니다. 작업을 단순화하면이 기능 잘못 될 가능성을 줄입니다.
Jon Skeet

24

다음은 C #과 Java의 차이점에 대한 Dare Obasanjo의 심층 참조입니다. 나는 항상이 기사를 언급 할 때이 기사를 언급하고있다.

http://www.25hoursaday.com/CsharpVsJava.html


2
@ Jon Skeet : 가장 활발한 C # 개발자입니다. C # 및 Java 버전의 차이를 유지하지 않는 이유는 무엇입니까? 나는 사람들이 그것을 읽는 것을 좋아할 것입니다.
발톱

1
@ claws : 원하는 모든 것을 할 시간이 없습니다.
Jon Skeet

19
@Winston : "Chuck Norris와 Jon Skeet의 차이점"목록이 필요합니다. 1) Chuck Norris는 항상 시간이 있습니다. Jon은 TimeDate항상 시간을 갖기 위해 클래스를 수정해야 하고 아직 시간이 없었습니다. (
RedFilter

11

C #에는 매우 편리한 자동 속성이 있으며 적어도 getter 및 setter에 사용자 지정 논리가없는 경우 코드를 더 깨끗하게 유지하는 데 도움이됩니다.


10

Java에없는 C #의 기능 • C #에는 더 많은 기본 유형과 산술 예외를 포착하는 기능이 포함되어 있습니다.

• 연산자 오버로딩 및 사용자 정의 캐스트와 같은 많은 것이 Java에 비해 많은 표기법 편의성을 포함하고 있으며, 이는 C ++ 프로그래머 커뮤니티에 이미 익숙합니다.

• 이벤트 처리는 "일등 시민"이며 언어 자체의 일부입니다.

• 클래스와 유사하지만 스택에 할당 될 수있는 "structs"의 정의를 허용합니다 (C # 및 Java의 클래스 인스턴스와 달리).

• C #은 언어 구문의 일부로 속성을 구현합니다.

• C #을 사용하면 스위치 문이 문자열에서 작동 할 수 있습니다.

• C #은 클로저 기능을 제공하는 익명의 메서드를 허용합니다.

• C #에서는 함수형 yield 키워드를 통해 코 루틴을 사용하는 반복자를 허용합니다.

• C #은 C ++ 및 SQL이 공유하는 기능인 여러 값의 반환을 지원하는 출력 매개 변수를 지원합니다.

• C #에는 네임 스페이스의 별칭을 지정할 수있는 기능이 있습니다.

• C #에는 클래스가 자체 클래스 메서드와 별도로 인터페이스의 메서드를 구체적으로 구현할 수있는 "명시 적 멤버 구현"이 있습니다. 이를 통해 동일한 이름의 메소드를 갖는 두 가지 다른 인터페이스를 구현할 수도 있습니다. 인터페이스의 메소드는 공용 일 필요는 없습니다. 해당 인터페이스를 통해서만 액세스 할 수 있습니다.

• C #은 COM과의 통합을 제공합니다.

• C 및 C ++의 예에 따라 C #에서는 기본 및 참조 유형에 대한 참조 별 호출을 허용합니다.

C #에없는 Java의 기능

• Java의 strictfp 키워드는 부동 소수점 연산의 결과가 플랫폼간에 동일하게 유지되도록합니다.

• Java는 오류 트래핑 및 처리를보다 효과적으로 시행하기 위해 검사 예외를 지원합니다.


9

또 다른 좋은 자료는 http://www.javacamp.org/javavscsharp/ 입니다 . 이 사이트에는이 두 프로그래밍 언어 간의 거의 모든 차이점을 설명하는 많은 예제가 열거되어 있습니다.

속성에 대해 Java에는 거의 동일한 방식으로 작동하는 주석이 있습니다.


5

제네릭 :

Java 제네릭을 사용하면 Java에서 제네릭 클래스를 컴파일 할 때 컴파일러가 type 매개 변수를 제거하고 Object를 모든 곳에서 대체하기 때문에 .NET에서 얻는 실행 효율성을 실제로 얻지 못합니다. 예를 들어 Foo<T>클래스 가있는 경우 Java 컴파일러는 마치 바이트 코드를 마치 바이트 코드처럼 생성합니다 Foo<Object>. 이것은 캐스팅과 박스 / 박스 해제가 "백그라운드"에서 수행되어야 함을 의미합니다.

나는 한동안 Java / C #을 가지고 놀았고, 내 의견으로는, 언어 수준의 주요 차이점은 당신이 지적한 것처럼 델리게이트입니다.


이것은 잘못입니다. 제네릭 지우기 또는 수정 (Java 및 C #)이 반드시 성능에 영향을 미치지는 않습니다.
미구엘 핑

오토 박싱과 캐스팅을 혼동하고 있습니다.
JesperE

3
아니요, Bruno는 성능 차이에 대해 맞습니다. Java에서 List <byte>에 해당하는 방법은 없습니다 (일반적으로). 권투 벌칙 (시간 및 메모리)이 발생할 수있는 List <Byte>가 있어야합니다.
Jon Skeet

(un) 복싱은 기본 유형 인 박스 유형에만 적용됩니다.
미구엘 핑

1

0

msdn.microsoft.com/en-us/library/ms836794.aspx에 제공된 링크를 참조하십시오. C #과 java의 유사점과 차이점을 모두 다룹니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.