C# vs Java 빠르게 비교 + WPF 기본 구조

주력언어가 Java인 사람이 빠르게 C#으로 프로젝트에 투입되어야하는 상황을 위해서 아래와 같이 

C#의 문법차이나 프레임워크 등을 빠르게 정리해보고자 한다.

 

# Java VS C#

기본 문법 ;, {}, 클래스 등 OOP 문법 동일 거의 동일, 다만 디테일 다름
프로그램 진입점 public static void main(String[] args) static void Main(string[] args)
패키지/네임스페이스 package com.example; namespace Example { }
클래스 접근제어자 public, private, protected, (default) public, private, protected, internal (네임스페이스 내에서 접근)
상속 extends 사용 : 사용 (class B : A)
인터페이스 구현 implements : (상속과 같은 문법)
메소드 오버라이드 @Override 어노테이션 필수 아님 override 키워드 필수
프로퍼티(속성) 보통 private 필드 + getter/setter 메소드 get; set; 프로퍼티 내장
이벤트/델리게이트 콜백 객체 직접 구현 (인터페이스 기반) delegate, event 키워드 지원 (함수 포인터처럼)
Null 처리 그냥 NPE 조심 ? 연산자 (string? name = null;)
컬렉션 List, Map, Set (java.util) List, Dictionary, HashSet (System.Collections.Generic)
람다 표현식 x -> x+1 x => x+1 (=> 사용)
GC JVM 내장 GC .NET CLR 내장 GC (유사)
코루틴/비동기 CompletableFuture, Executor 등 async/await 문법 매우 강력
GUI 프로그래밍 JavaFX, Swing (거의 폐기수순) WPF, WinForms (주류)
패키지 매니저 Maven, Gradle NuGet

 

# 인터페이스 및 상속

 - Java

public class MyClass implements Runnable {
    public void run() {
        // 구현
    }
}

 

- C#

public class MyClass : IRunnable
{
    public void Run()
    {
        // 구현
    }
}
public class MyPrinter : IPrintable, IScannable
{
    public void Print() { }
    public void Scan() { }
}

 

구분 Java C#
부모 클래스 상속 extends :
인터페이스 구현 implements :

 

# DB 연동 및 ORM

상황JavaC# (.NET)

ORM Hibernate (JPA 구현체) Entity Framework Core
SQL 매퍼 MyBatis Dapper
경량 성능 최적화용 MyBatis(직접 SQL) Dapper(직접 SQL)

 

Java DTO

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.Max;
import javax.validation.constraints.NotNull;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ChannelInfoDTO {

    @NotNull
    private String c_id; // 채널 id
    @NotNull
    private String c_title; // 채널명
    @NotNull
    private String c_desc; // 채널 소개
    @NotNull
    private String c_type; // 채널 타입 (open, private)

    private String c_password; // private 채널의 password
    @NotNull
    private String c_subject; // 채널 주제 (플레이게임)
    @NotNull
    @Max(value = 20, message = "채널 최대 인원은 20명을 초과할 수 없습니다.")
    private Integer c_maxUser; // 채널 최대 인원
    @NotNull
    private Integer c_heartCount; // 채널 인기지표
    @NotNull
    private boolean c_isAlive; // 채널 활성화 여부
    @NotNull
    private String c_master; // 채널주인
}

C# DTO

using System.ComponentModel.DataAnnotations;

namespace Example.HappyUsf.Biz.Channel.Domain
{
    public class ChannelInfoDTO
    {
        [Required]
        public string CId { get; set; } // 채널 id

        [Required]
        public string CTitle { get; set; } // 채널명

        [Required]
        public string CDesc { get; set; } // 채널 소개

        [Required]
        public string CType { get; set; } // 채널 타입 (open, private)

        public string? CPassword { get; set; } // private 채널의 password (nullable)

        [Required]
        public string CSubject { get; set; } // 채널 주제 (플레이게임)

        [Required]
        [Range(1, 20, ErrorMessage = "채널 최대 인원은 20명을 초과할 수 없습니다.")]
        public int CMaxUser { get; set; } // 채널 최대 인원

        [Required]
        public int CHeartCount { get; set; } // 채널 인기지표

        [Required]
        public bool CIsAlive { get; set; } // 채널 활성화 여부

        [Required]
        public string CMaster { get; set; } // 채널 주인
    }
}

C# 9.0 이상 record 키워드 사용 시

public record ChannelInfoDTO(
    string CId,
    string CTitle,
    string CDesc,
    string CType,
    string? CPassword,
    string CSubject,
    int CMaxUser,
    int CHeartCount,
    bool CIsAlive,
    string CMaster
);

✅ 정리

  • Java DTO = 롬복 + validation 어노테이션
  • C# DTO = [Required], [Range] 어노테이션 + get; set; 프로퍼티
  • C#은 기본 생성자 필요 없음 (필요하면 추가)
  • record 쓰면 더 깔끔하고 간결해짐

 

🖥 WPF 기본 구조 (Java 개발자 시각)

WPF는 "프론트(XAML) + 백엔드(C#)" 구조
JavaFXSpring MVC의 View-Controller 구조랑 조금 비슷하다고 볼 수 있다.

 

 

📚 WPF 기본 흐름

역할설명Java 대응 개념
XAML UI를 기술하는 XML 기반 언어 (레이아웃, 버튼 등) FXML (JavaFX), JSP(뷰)
Code-behind (C#) UI 이벤트 핸들링, 로직 처리 Controller 클래스
Data Binding XAML UI ↔︎ C# 데이터 객체 연결 JavaFX의 Binding, Spring의 ModelBinding 비슷
MVVM 패턴 Model-View-ViewModel 구조 권장 Spring MVC + JavaFX Binding의 혼합 느낌

 

 

📄 파일 구조 예시

 

MyApp/
├── MainWindow.xaml         ← 프론트(UI)
├── MainWindow.xaml.cs      ← 백엔드(C# 로직)
├── ViewModel/
│    └── MainViewModel.cs   ← 데이터, 로직 분리 (선택)
└── App.xaml                ← 전체 앱 설정

 

  • XAML 파일: UI 구성
  • XAML.cs (Code-behind) 파일: 버튼 클릭 같은 이벤트 처리
  • ViewModel: MVVM 패턴을 쓰면 여기서 상태, 로직 관리