자바(Java)와 닷넷(.NET)에서 enum(열거형) 사용법을 비교하면 다음과 같은 차이점이 있습니다.
1. 기본 선언 방식
Java
public enum Color {
RED, GREEN, BLUE
}
C# (.NET)
public enum Color
{
Red,
Green,
Blue
}
✅ 차이점
- Java에서는 enum 값이 UPPER_CASE로 쓰이는 것이 일반적이고, .NET에서는 PascalCase를 주로 사용합니다.
- Java에서는 ; 없이 나열 가능하지만, .NET에서는 각 요소 끝에 ,를 붙입니다.
2. Enum 값에 특정 값 할당
Java
public enum Color {
RED(1), GREEN(2), BLUE(3);
private final int value;
Color(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
C# (.NET)
public enum Color
{
Red = 1,
Green = 2,
Blue = 3
}
✅ 차이점
- Java에서는 생성자를 활용해 값을 저장해야 하지만, C#에서는 바로 값 할당이 가능합니다.
3. Enum 사용 예시
Java
Color myColor = Color.RED;
System.out.println(myColor); // RED
System.out.println(myColor.getValue()); // 1
C# (.NET)
Color myColor = Color.Red;
Console.WriteLine(myColor); // Red
Console.WriteLine((int)myColor); // 1
✅ 차이점
- C#에서는 (int)enum으로 캐스팅하면 바로 숫자로 변환됩니다.
- Java에서는 getValue() 같은 메서드를 만들어야 합니다.
4. 문자열 변환
Java
Color color = Color.valueOf("RED"); // 문자열을 Enum으로 변환
System.out.println(color); // RED
C# (.NET)
Color color = (Color)Enum.Parse(typeof(Color), "Red");
Console.WriteLine(color); // Red
✅ 차이점
- Java에서는 Enum.valueOf("NAME") 사용
- C#에서는 Enum.Parse(typeof(Color), "NAME") 사용
5. Enum 값 순회 (Iteration)
Java
for (Color c : Color.values()) {
System.out.println(c);
}
C# (.NET)
foreach (Color c in Enum.GetValues(typeof(Color))) {
Console.WriteLine(c);
}
✅ 차이점
- Java에서는 .values() 사용
- C#에서는 Enum.GetValues(typeof(EnumType)) 사용
6. Enum 확장 (메서드 추가)
Java
public enum Color {
RED(1), GREEN(2), BLUE(3);
private final int value;
Color(int value) { this.value = value; }
public int getValue() { return value; }
public static Color fromValue(int value) {
for (Color c : Color.values()) {
if (c.value == value) return c;
}
throw new IllegalArgumentException("Invalid value");
}
}
C# (.NET)
public static class ColorExtensions
{
public static string ToFriendlyString(this Color color)
{
return color switch
{
Color.Red => "Red Color",
Color.Green => "Green Color",
Color.Blue => "Blue Color",
_ => "Unknown"
};
}
}
✅ 차이점
- Java에서는 enum 내부에 메서드를 직접 추가할 수 있음.
- C#에서는 enum을 수정할 수 없기 때문에 **확장 메서드 (Extension Method)**를 사용.
7. JSON 직렬화 차이
Java (Jackson 라이브러리 사용)
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(Color.RED);
System.out.println(json); // "RED"
C# (System.Text.Json 사용)
string json = JsonSerializer.Serialize(Color.Red);
Console.WriteLine(json); // "Red"
✅ 차이점
- 기본적으로 JSON 변환 시 Java와 C# 모두 Enum 이름을 문자열로 변환
- Java에서 Enum 값을 숫자로 직렬화하려면 @JsonValue 사용해야 함.
8. Enum 플래그 (Bitwise Enum)
C#에서는 Flags 속성을 이용하여 비트 연산을 사용할 수 있음.
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Execute = 4
}
Permissions userPermissions = Permissions.Read | Permissions.Write;
Console.WriteLine(userPermissions); // Read, Write
Java에서는 직접 Bitwise OR 연산을 사용해야 함.
public class Permissions {
public static final int NONE = 0;
public static final int READ = 1;
public static final int WRITE = 2;
public static final int EXECUTE = 4;
}
int userPermissions = Permissions.READ | Permissions.WRITE;
System.out.println(userPermissions); // 3 (1 | 2)
✅ 차이점
- C#에서는 Flags 속성을 지원하여 다중 선택 가능.
- Java에서는 int 값을 직접 비트 연산해야 함.
9. Enum 비교 방법
Java
if (myColor == Color.RED) {
System.out.println("It's red!");
}
C#
if (myColor == Color.Red)
{
Console.WriteLine("It's red!");
}
✅ 차이점
- Java와 C# 모두 == 연산자로 비교 가능 (참조 비교 X, 값 비교 O)
결론 (정리)
기능 | Java | C# (.NET) |
기본 선언 | enum 클래스 내부에 값만 정의 | enum 직접 값 할당 가능 |
값 할당 | 생성자 사용 | 바로 숫자 지정 가능 |
값 가져오기 | getValue() 메서드 사용 | (int)enum 캐스팅 |
문자열 변환 | Enum.valueOf() | Enum.Parse(typeof(Enum), "NAME") |
반복문 | Color.values() | Enum.GetValues(typeof(Color)) |
메서드 추가 | 내부에 직접 추가 가능 | 확장 메서드 사용 |
JSON 직렬화 | @JsonValue 필요 | 기본적으로 문자열 변환 |
비트 연산 (Flags) | 직접 int 사용 | [Flags] 속성 사용 가능 |
비교 | == 연산자 사용 | == 연산자 사용 |
📌 Java는 객체 지향적인 방식 (생성자, 메서드 활용)
📌 C#은 보다 직관적인 방식 (int 캐스팅, Flags 지원)
C#이 좀 더 Enum을 단순하게 다룰 수 있도록 설계된 반면, Java는 더 객체지향적인 구조로 설계되어 있습니다.
'프로그래밍' 카테고리의 다른 글
자바와 닷넷 문자열 비교 (2) | 2025.03.02 |
---|---|
자바와 닷넷 리플렉션 비교 (0) | 2025.03.02 |
자바와 닷넷 날짜 함수 비교 (0) | 2025.03.02 |
자바와 닷넷의 상속 비교 (0) | 2025.03.02 |
자바와 닷넷의 내부 클래스 (0) | 2025.03.02 |