Java를 배우려는 C # 개발자의 경우 두 언어 사이에 지적해야 할 큰 차이점이 있습니까?
어떤 사람들은 사물이 똑같다고 생각할 수 있지만 간과해서는 안되는 수입 측면이 있습니까? (또는 당신은 정말로 망칠 수 있습니다!)
OOP 구성, GC 작동 방식, 참조, 배포 관련 등의 측면에서 볼 수 있습니다.
Java를 배우려는 C # 개발자의 경우 두 언어 사이에 지적해야 할 큰 차이점이 있습니까?
어떤 사람들은 사물이 똑같다고 생각할 수 있지만 간과해서는 안되는 수입 측면이 있습니까? (또는 당신은 정말로 망칠 수 있습니다!)
OOP 구성, GC 작동 방식, 참조, 배포 관련 등의 측면에서 볼 수 있습니다.
답변:
내 머리 꼭대기에서 몇 가지 문제가 있습니다.
byte Java로 로그인되어 있습니다 (불행히도).static포함하는 클래스의 인스턴스에 대한 암시 적 참조를 갖게됩니다.다음은 두 언어를 매우 포괄적으로 비교 한 것입니다.
http://www.25hoursaday.com/CsharpVsJava.html
추가됨 : http://en.wikipedia.org/wiki/Comparison_of_Java_and_C_Sharp
아무도 속성에 대해 언급하지 않았다는 사실에 놀랐습니다. C #에서는 매우 근본적이지만 Java에는 없습니다. C # 3 이상에서는 속성도 자동으로 구현되었습니다. Java에서는 GetX / SetX 유형 메소드를 사용해야합니다.
또 다른 명백한 차이점은 Java에는없는 C # 3의 LINQ 및 람다 식입니다.
축어 문자열 (@ ""), 연산자 오버로딩, 수율을 사용하는 반복기 및 사전 프로세서와 같이 Java에서 누락 된 몇 가지 간단하지만 유용한 것들이 Java에서도 누락되었습니다.
C #에서 개인적으로 가장 좋아하는 것 중 하나는 네임 스페이스 이름이 실제 디렉터리 구조를 따를 필요가 없다는 것입니다. 이 유연성이 정말 마음에 듭니다.
많은 차이점이 있지만 다음과 같은 점이 생각납니다.
.equals당신이 사용해야하는 것입니다.
.NET은 제네릭을 수정했습니다. Java는 제네릭을 지 웠습니다.
차이점은 다음과 같습니다. ArrayList<String>객체 가있는 경우 .NET에서는 객체에 type이 있음을 (런타임에) 알 수있는 ArrayList<String>반면, Java에서는 런타임에 객체가 유형입니다 ArrayList. String부분은 손실됩니다. 비 String객체를에 넣는 경우 ArrayList시스템은이를 적용 할 수 없으며 항목을 추출하려고 시도한 후에 만 알 수 있으며 캐스트가 실패합니다.
String 확인되지 않은 캐스트를 만들지 않고는 해당 목록 에 비 객체를 넣을 수 없다는 점을 추가 할 가치가 있지만 컴파일러는 해당 시점에서 컴파일러가 더 이상 제네릭 경계를 확인할 수 없다고 올바르게 경고합니다. 목록이 항상 의 변수에 저장되어있는 한 문자열이 아닌 객체를 삽입하려는 시도는 컴파일되지 않습니다. List<String>
add메서드를 호출한다고 가정 해 보겠습니다 (다시 리플렉션을 통해). 시스템은 비 String객체를 즉시 거부 get합니까? 아니면 결과를 캐스팅 할 때만 거부 합니까?
List. List, like ArrayList및의 내림차순 유형의 객체를 가질 수 있습니다 LinkedList. (사용하는 것이 중요합니다List 대신 ArrayList주변을 통과 할 때, 그러나 당신이 말할 수 없다는 사실을 변경하지 않습니다 new List().)
Java의 C #에서 내가 놓친 한 가지는 확인 된 예외를 강제로 처리하는 것입니다. C #에서는 메서드가 던질 수있는 예외를 인식하지 못하고 문서화 또는 테스트를 통해이를 발견하는 것이 일반적입니다. 확인 된 예외가있는 Java에서는 그렇지 않습니다.
Java는 값 유형이 아닌 기본 요소에 대한 자동 박싱 기능을 제공하므로 System.Int32[]C #의 값 배열 이지만 객체 Integer[]에 대한 참조 배열이므로 Integer고성능 계산에 적합하지 않습니다.
Java에 내장 된 날짜 / 달력 기능은 System.DateTime에 비해 끔찍합니다. 여기에 많은 정보가 있습니다. Java Date & Time API의 문제점은 무엇입니까?
이 중 일부는 C # 개발자에게 문제가 될 수 있습니다.
또한 Java에는 GAC 및 강력한 이름의 어셈블리가 제공하는 것과 동일한 기능이 모두 포함되어 있지 않습니다. Jar Hell 은 외부 라이브러리를 링크 / 참조 할 때 잘못 될 수있는 용어입니다.
패키징 / 배포에 관한 한 :
내 인터뷰 목록에있는 b / c에서 튀어 나온 한 가지는 Java에 메소드 숨김을위한 "새로운"키워드 아날로그가 없으며 "여기에 새로 넣어야합니다"라는 컴파일러 경고가 없다는 것입니다. 재정의하려는 경우 실수로 메서드를 숨기면 버그가 발생합니다.
(예를 들어 편집) 예, B는 A에서 파생됩니다 (C # 구문을 사용하면 Java는 마지막으로 확인한 것과 동일한 방식으로 작동하지만 컴파일러 경고를 표시하지 않습니다). A의 foo 또는 B의 foo가 호출됩니까? (A가 호출됩니다. B를 구현 한 개발자를 놀라게 할 것입니다.)
class A
{
public void foo() {code}
}
class B:A
{
public void foo() {code}
}
void SomeMethod()
{
A a = new B(); // variable's type is declared as A, but assigned to an object of B.
a.foo();
}
new의도적으로 숨기는 재정의 또는 방법이 없습니다 -또는 최종적이지 않기 때문에 숨겨지기보다는 재정의됩니다.
C #에서 오는 Java로 작업 할 때 지금까지 겪은 한 가지 문제는 예외와 오류가 다릅니다.
예를 들어 catch (Exception e)를 사용하여 메모리 부족 오류를 포착 할 수 없습니다.
자세한 내용은 다음을 참조하십시오.
Java를 사용한 지 너무 오래되었지만 응용 프로그램 개발에서 즉시 눈에 띄는 것은 C # 이벤트 모델, C # 드래그 앤 드롭 vs Swing에서 레이아웃 관리자 사용 (앱 개발을 수행하는 경우) 및 예외 처리였습니다. Java는 예외를 포착하고 C #이 필요하지 않은지 확인합니다.
제목에 대한 직접적인 질문에 대한 답변 :
"Java를 배우는 C # 개발자, 간과 할 수있는 가장 큰 차이점은 무엇입니까?"
A : Java가 Windows에서 상당히 느리다는 사실.