주력언어가 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#)" 구조
JavaFX나 Spring 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 패턴을 쓰면 여기서 상태, 로직 관리