C# & Java

C#과 Java는 둘 다 객체 지향 프로그래밍 언어로 많은 유사점을 가지고 있지만, 문법과 기능 면에서 몇 가지 중요한 차이점이 있습니다. 아래는 C#과 Java의 문법 차이를 정리한 내용입니다.


1. 기본 구조

  • 클래스와 파일 이름
  • Java: 클래스 이름과 파일 이름이 반드시 일치해야 합니다 (예: MyClass.javaMyClass 정의).
  • C#: 클래스 이름과 파일 이름이 일치할 필요가 없습니다.
  • 메인 메소드
  • Java: public static void main(String[] args)로 정의됩니다.
  • C#: static void Main(string[] args)로 정의되며, 대문자 M을 사용합니다.
  • 네임스페이스
  • Java: package 키워드로 패키지를 정의하고, import로 가져옵니다.
  • C#: namespace 키워드로 네임스페이스를 정의하고, using으로 가져옵니다.

2. 데이터 타입

  • 기본 타입
  • Java: int, double, boolean 등 제공.
  • C#: int, double, bool 등 유사하지만, decimal과 같은 추가 타입도 있습니다.
  • 문자열
  • Java: String (대문자 S).
  • C#: string (소문자, System.String의 별칭).
  • 열거형
  • Java: enum으로 정의하며, 메소드나 필드를 포함한 유연한 정의 가능.
  • C#: enum으로 정의하며, 기본적으로 int 타입 기반.

3. 변수 및 상수

  • 상수
  • Java: final 키워드로 상수를 정의.
  • C#: const (컴파일 타임 상수)와 readonly (런타임 상수)를 사용.
  • var 키워드
  • Java: JDK 10부터 로컬 변수에 한해 var로 타입 추론 가능.
  • C#: var로 변수 타입을 추론하며, 범위 제한 없이 사용 가능.

4. 연산자 및 제어문

  • 연산자
  • Java: instanceof로 타입 확인.
  • C#: is로 타입 확인, as로 타입 캐스팅.
  • 제어문
  • Java: for-each 루프 사용 (예: for (Type item : collection)).
  • C#: foreach 사용 (예: foreach (var item in collection)).
  • switch 문
  • Java: JDK 7부터 문자열 지원, goto 사용 불가.
  • C#: 문자열, 열거형 등 지원, goto로 제어 흐름 이동 가능.

5. 객체 지향 프로그래밍

  • 상속
  • Java: extends로 클래스 상속, implements로 인터페이스 구현.
  • C#: :로 클래스 상속과 인터페이스 구현 모두 처리.
  • 추상 클래스
  • Java: abstract 키워드 사용.
  • C#: abstract 사용, 추상 프로퍼티와 이벤트 정의 가능.
  • 인터페이스
  • Java: interface로 정의, JDK 8부터 기본 구현 가능.
  • C#: interface로 정의, C# 8.0부터 기본 구현 가능.
  • 다중 상속
  • 둘 다 클래스 다중 상속은 불가하지만, 인터페이스를 통해 다중 구현 가능.

6. 예외 처리

  • try-catch
  • Java: try, catch, finally 사용, checked 예외 강제.
  • C#: try, catch, finally 사용, 모든 예외가 unchecked.
  • 예외 던지기
  • 둘 다 throw 키워드 사용.

7. 컬렉션 및 제네릭

  • 컬렉션
  • Java: java.util 패키지의 List, Set, Map 등.
  • C#: System.Collections.GenericList<T>, Dictionary<K,V> 등.
  • 제네릭
  • Java: 런타임에 타입 소거(type erasure) 발생.
  • C#: 컴파일 타임에 타입 검사.

8. 델리게이트 및 람다

  • 델리게이트
  • Java: 함수형 인터페이스와 람다로 대체.
  • C#: delegate 키워드로 함수 포인터 기능 제공.
  • 람다 표현식
  • Java: JDK 8부터 지원 (예: x -> x * 2).
  • C#: 더 일찍 도입, 문법 유사 (예: x => x * 2).

9. 속성 및 인덱서

  • 속성
  • Java: getter와 setter 메소드를 수동으로 작성.
  • C#: getset으로 속성 정의 (예: public int MyProp { get; set; }).
  • 인덱서
  • Java: 직접 지원 안 함.
  • C#: 인덱서를 통해 객체를 배열처럼 사용 (예: this[int index]).

10. 비동기 프로그래밍

  • Java: CompletableFuture나 서드파티 라이브러리 사용.
  • C#: asyncawait 키워드로 비동기 프로그래밍 지원.

11. LINQ

  • Java: 스트림 API로 유사 기능 제공.
  • C#: LINQ(Language Integrated Query)로 SQL-like 쿼리 작성 가능.

12. 가비지 컬렉션

  • Java: JVM에서 자동 관리.
  • C#: .NET에서 관리, IDisposableusing으로 리소스 명시적 해제 가능.

13. 플랫폼 의존성

  • Java: JVM에서 실행, 플랫폼 독립적.
  • C#: .NET Framework 또는 .NET Core에서 실행 (.NET Core는 크로스 플랫폼 지원).

14. IDE 및 도구

  • Java: Eclipse, IntelliJ IDEA 등 사용.
  • C#: Visual Studio 주로 사용.

15. 기타

  • 연산자 오버로딩
  • Java: 지원하지 않음.
  • C#: 지원 (예: public static MyClass operator +(...)).
  • goto 문
  • Java: 지원하지 않음.
  • C#: 지원.
  • unsafe 코드
  • Java: 포인터 직접 사용 불가.
  • C#: unsafe 블록으로 포인터 사용 가능.

요약

C#과 Java는 객체 지향 언어로서 유사하지만, 세부 문법과 기능에서 차이가 있습니다. C#은 .NET 생태계에 최적화되어 비동기 프로그래밍(async/await), LINQ, 속성 등 강력한 기능을 제공합니다. 반면, Java는 플랫폼 독립성, checked 예외, 제네릭 타입 소거 등으로 차별화됩니다. 이 차이점을 이해하면 두 언어를 효과적으로 비교하고 활용할 수 있습니다.

Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다