Java 설계자는 C++의 복잡성을 싫어하므로 Java는 매우 간결하며, GC는 메모리 관리도 매우 편리하게 만듭니다. C#은 Java의 GC 및 가상 머신 기술에 관심이 있으며 여러 주요 Microsoft 언어를 .NET에 통합하기를 희망합니다. . 따라서 C#은 언어적으로 단순하지도, 복잡하지도 않습니다.
두 언어의 디자인 아이디어도 다릅니다. Java는 컴파일되고 해석되는 언어인 반면 C#은 컴파일된 후 컴파일되고 실행되는 언어입니다. Java에는 대리자가 없고 C#에는 대리자가 있습니다. Java에서는 위임 기능을 구현하기 위해 인터페이스를 사용하는 경향이 있지만 C#에서는 추상 클래스가 인터페이스보다 더 큰 역할을 합니다.
Java는 Camel 명명 규칙을 따르고 C#은 Pascal 명명 규칙을 따릅니다. 그러나 이제 점점 더 많은 Java 사람들이 C#을 사용하기 시작하고 동시에 낙타 명명 규칙을 C#으로 가져오고 있으며 이로 인해 C# 코드를 읽기가 점점 더 어려워질 수 있습니다. 처음에 C#이 Camel을 따르지 않은 이유는 무엇입니까? 낙타 명명 규칙에 대해 나쁜 점은 없습니다.
1. 클래스 이름.this 및 내부 클래스
Java에서는 클래스 이름과 유사한 사용법을 자주 볼 수 있습니다. 이것은 현재 객체 인스턴스입니다. 클래스 이름이 앞에 나타나는 이유는 무엇입니까? C# 프로그래머는 이로 인해 혼란스러울 것입니다.
자바에서는 내부 클래스가 여러 곳에서 사용되는데, 외부 클래스의 멤버는 내부 클래스에서도 접근이 가능하다. 이때 이것을 내부 클래스에서 사용하게 되면 이것이 누구인지, 무엇인지에 대한 의문이 생긴다. 내부 클래스의 현재 객체 인스턴스입니까, 아니면 외부 클래스의 현재 객체 인스턴스입니까?
Java에서는 이 앞에 외부 클래스의 클래스 이름을 추가한다는 것은 외부 클래스의 현재 객체 인스턴스가 내부 클래스에서 사용된다는 의미입니다.
아래 예를 살펴보겠습니다.
//외부 클래스 정의
공개 클래스 OuterClass {
//내부 클래스 정의
개인 클래스 InnerClass
{
// 내부 클래스에는 정의된 id 멤버가 없습니다. 여기서는 외부 클래스의 멤버에 액세스합니다.
공개 int getId(){ Return OuterClass.this.id }
공개 무효 setId(int id) { OuterClass.this.id = id;}
// 멤버라는 이름은 내부 클래스에 정의되어 있으며, 기본적으로 현재 클래스의 멤버에 액세스합니다.
개인 문자열 이름;
공개 문자열 getName() { return this.name;}
// 이 앞에 내부 클래스 이름을 추가할 수 있습니다.
공개 무효 setName(문자열 이름) { InnerClass.this.name = 이름;}
// 내부 클래스는 외부 클래스의 동일한 이름을 가진 멤버에도 접근할 수 있으며, 외부 클래스의 이름을 추가해야 합니다.
공개 문자열 getOuterName() { return OuterClass.this.name;}
공개 무효 setOuterName(문자열 이름) { OuterClass.this.name = 이름;}
@보수
공개 문자열 toString()
{
return "Id: " + this.getId() + ", 내부 이름: " + this.getName() + ", 외부 이름: " + this.getOuterName();
}
}
//외부 클래스에 정의된 멤버 ID와 이름
개인 정수 ID;
개인 문자열 이름;
개인 InnerClass innerInstance;
공개 외부클래스()
{
this.innerInstance = new InnerClass();
this.innerInstance.setId(20);
this.innerInstance.setName("톰");
this.innerInstance.setOuterName("앨리스");
}
공개 문자열 toString()
{
this.innerInstance.toString()을 반환합니다.
}
}
C#에서는 클래스를 중첩 클래스와 비중첩 클래스로 구분합니다. 전자는 다른 데이터 형식 내에 선언된 클래스입니다. 후자는 특정 네임스페이스에 직접 정의된 클래스입니다. C#에서는 중첩 클래스가 거의 정의되지 않습니다.
포함되지 않은 클래스는 공개 및 내부 액세스 제어의 사용만 허용하는 반면, 내장 클래스는 개인, 보호, 내부 보호, 공개 및 내부의 5개 액세스 제어 문자를 모두 사용할 수 있습니다. 내부 클래스는 인스턴스 메서드와 전용 메서드를 포함하여 외부 클래스의 모든 메서드에 액세스할 수도 있지만 외부 클래스의 인스턴스를 명시적으로 전달해야 합니다.
C#의 내부 클래스는 외부 클래스에서 정의한 형식과 정적 메서드를 사용할 수 있지만 외부 클래스의 인스턴스 메서드를 직접 사용할 수는 없습니다.
C#에서 외부 클래스는 내부 클래스의 네임스페이스처럼 작동합니다. 액세스 제어가 허용되는 한 다음 메서드를 사용하여 내부 클래스 개체의 인스턴스를 만들 수 있습니다.
OuterClass.InnerClass obj = new OuterClass.InnerClass(); 이 인스턴스는 외부 클래스의 인스턴스와 직접적인 관계가 없습니다. Java의 정적 내부 클래스와 유사합니다.
2. 클래스명.클래스 및 유형
Java에서는 클래스 이름.class의 사용법을 자주 볼 수 있습니다. 이 사용법은 유형의 유형 객체 인스턴스 참조를 얻는 데 사용되는 C#의 typeof(클래스 이름)와 동일합니다.
Java에서는 각 클래스에 해당 Class 객체가 있습니다. 클래스가 작성되고 컴파일되면 생성된 .class 파일에 Class 객체가 생성되어 클래스의 유형 정보를 나타냅니다. 클래스 인스턴스를 얻는 세 가지 방법:
객체 인스턴스의 getClass() 메서드를 호출하여 객체의 Class 인스턴스를 얻습니다.
클래스 이름을 사용하여 Class 인스턴스를 얻으려면 Class의 정적 메서드 forName()을 사용합니다. Class.forName(xxx.xx.xx)은 클래스를 반환합니다. 해당 기능은 JVM에 지정된 클래스를 찾아 로드하도록 요청하는 것입니다. 이는 JVM이 클래스의 정적 코드 세그먼트를 실행함을 의미합니다.
클래스 이름 .calss를 사용하여 클래스 인스턴스를 가져옵니다. 기본 데이터 유형의 캡슐화 클래스의 경우 .TYPE을 사용하여 해당 기본 데이터 유형의 클래스 인스턴스를 가져올 수도 있습니다.
C#에서 형식 개체의 인스턴스를 가져오는 방법은 더 간단하고 명확합니다.
데이터 인스턴스의 GetType() 메서드를 호출하여 가져옵니다. 이 메서드는 Object에서 상속되므로 C#의 모든 개체에는 GetType() 메서드 x.GetType()이 있습니다. 여기서 x는 변수 이름입니다.
typeof(x)의 x는 특정 클래스 이름, 유형 이름 등이어야 하며, 변수 이름이 될 수 없습니다.
System.Type의 정적 메서드 System.Type.GetType()을 통해.
3. 익명 클래스
Java에서는 익명 클래스도 더 자주 사용됩니다. 예를 들어 Android에서는 버튼 모니터링을 구현할 때 이와 같은 코드를 자주 볼 수 있습니다.
@보수
공개 무효 onClick(인수 보기) {
의도 의도 = 새로운 의도( MainActivity.this, ActivityFrameLayout.class);
setTitle("FrameLayout");
startActivity(의도);
}
};
여기서 OnClickListenter는 실제로 인터페이스를 사용하여 객체 인스턴스를 생성할 수 있나요? 물론 그렇지 않습니다.
따라서 Java는 여기서 인터페이스를 구현하는 익명 클래스를 자동으로 생성합니다. 실제로 우리가 생성하는 것은 이 익명 클래스의 객체 인스턴스입니다.
이것의 장점은 한 번만 사용되는 클래스를 정의한 후 이 클래스를 통해 객체 인스턴스를 생성할 필요가 없어 프로그램 개발이 단순화된다는 것입니다.
예를 들어 다음과 같은 인터페이스가 있습니다.
인스턴스.onClick(); C#에서는 이 형식을 전혀 사용하지 않습니다. 위임을 통해 동일한 기능을 매우 간단하게 구현할 수 있습니다.
Java에는 대리자가 없습니다.
이 인스턴스의 유형을 인쇄하면 이 익명 클래스의 실제 유형을 볼 수 있습니다.
속성의 개념은 모든 사람에게 친숙해야 합니다. 클래스 멤버 함수는 이 클래스의 모든 속성 멤버에 자유롭게 액세스할 수 있습니다. 그러나 한 클래스에서 다른 클래스의 속성에 액세스하는 것이 더 번거롭기 때문에 Getxxx 및 Setxxx 메서드를 사용하는 경우가 많습니다. 예를 들어 Java 또는 C++에서는 코드가 다음과 같습니다.
그러나 C#에서는 이러한 메서드가 "속성"됩니다. C#에서는 동일한 코드가 다음과 같습니다.
foo.size++;
label.font.bold = true;
보시다시피 C#은 확실히 읽고 이해하기가 더 쉽습니다. 이 "속성 메서드"의 서브루틴 코드에서도 비슷한 상황을 볼 수 있습니다.
자바/C++:
기음#:
이러한 종류의 속성 지정 메서드를 클래스의 속성 멤버와 구별하기 위해 C#에서는 속성 멤버를 "필드"라고 하며, "속성"은 이 "속성 메서드"의 특수 명사가 됩니다. 그런데 실제로 이런 종류의 속성 메소드는 VB와 DELPHI에서 자주 발견됩니다. VB에서는 이를 속성이라고도 합니다. 또한 C#에서는 Get과 Set이 쌍으로 나타나야 합니다. 속성은 Set 없이 Get만 가질 수 있습니다(Java 및 C++에서는 Get 또는 Set만 가질 수 있음). 유지하려면 특정 속성을 수정할 때 Get 및 Set 메서드에 동시에 주의를 기울이고 동시에 수정해야 합니다.
5. 객체 인덱싱 메커니즘(인덱서)
개체 인덱싱 메커니즘은 C#에 도입되었습니다. 더 명확하게 말하면 객체 인덱스는 실제로 객체의 배열입니다. 이전 섹션의 속성과 관련하여 설명하겠습니다. 속성은 Get 및 Set 메서드를 숨겨야 하지만 인덱스 메커니즘에서는 각 개체의 Get 또는 Set 메서드가 노출됩니다. 예를 들어, 다음 예에서는 이 점을 더 명확하게 보여줍니다. 위 내용은 C#과 Java의 차이점을 소개합니다.
스토리 [색인] = 가치;
}
}
}
...
}
이상에서는 C#과 JAVA의 차이점을 소개합니다. C#과 JAVA를 이해하는 데 도움이 되길 바랍니다.