C#과 Java언어 비교(4) - Enums, Foreach문
C# and JAVA 2007. 5. 29. 10:52http://genamics.com/developer/csharp_comparative_part5.htm
6. 열거형(Enums)
여러분이 C 언어를 모를 경우를 생각해서 설명하는 거지만 Enums는 여러분이 객체의 집합을 지정할 수 있도록 해주는데, 예를 들어:
선언:
public enum Direction {North, East, West, South};
사용법:
Direction wall = Direction.North;
열거자는 꽤 쓸만한 구성요소(construct)이므로 혹시나 여러분은 왜 C#에 그것들을 포함하기로 결정하지 않았는지에 대한 의문이 들지도 모르겠지만 왜 그럼 Java는 그것들을 생략하기로 결정했을까? Java의 경우, 여러분은 다음과 같이 해야만 한다.
선언:
public class Direction {
public final static int NORTH = 1;
public final static int EAST = 2;
public final static int WEST = 3;
public final static int SOUTH = 4;
}
사용법:
int wall = Direction.NORTH;
Java 버전이 좀 더 많은 것들을 표현해 주는 것처럼 보이는 것이 사실임에도 불구하고 그것은 조금 형 안정적(type-safe)이지 못한데, 왜냐하면 여러분이 뜻하지 않게 컴파일러가 잡아내지도 않게 하면서 wall을 아무 정수값에 할당할 수 있도록 해주기 때문이다. 정확하게 하기 위해서 Java에 대한 필자의 경험으로는 몇 가지 추가적인 토큰을 작성하고 여기에서 나타나 있는 형-안전성이 결핍되어 나타나는 오류를 찾아내는 데 그렇게 많은 시간이 들지는 않았었음에도 불구하고 열거자가 있는 것이 좋다. C#의 한 가지 이점은 여러분이 디버깅하기가 놀랄만큼 좋다는 것인데, 만약 여러분이 열거형들이 결합되어 있는 것을 가진 열거형(enumeration)에 중단점(break point)를 걸 경우 C#은 여러분이 해독해야만 하는 숫자 대신 자동적으로 direction을 해독하여 사람이 판독할 수 있는 출력결과를 여러분에게 보여준다:
선언:
public enum Direction {North=1, East=2, West=4, South=8};
사용:
Direction direction = Direction.North | Direction.West;
if ((direction & Direction.North) != 0)
....
만약 여러분이 if 문에 중단점을 걸게 되면 여러분은 숫자 5가 아닌 사람이 읽을 수 있는 버전의 direction을 보게 될 것이다.
Java에서 열거형이 없는 가장 그럴듯한 이유는 여러분이 열거형 대신 클래스를 이용하여 그럭저럭 해낼 수 있기 때문이다. 이전 섹션에서 필자가 언급했던 것처럼 단독적인 클래스를 갖고서는 세상의 특징을 표현하는 것은 물론이거니와 또 다른 구성요소와 함께 할 수 있는 것 역시 불가능하다. “클래스로 할 수 있는 것이면 새로운 구성요소를 도입하지 마라”라는 Java의 철학이 가져다 주는 이점은 뭘까? 단순성(simplicity)이 아마도 가장 큰 이점으로 보여지는데, 이는 짧은 학습곡선과 프로그래머로 하여금 어떤 일들을 하는 데 있어 여러가지 방식으로 생각해야만 하는 것을 방지해 준다. 사실 Java 언어는 포인터와 헤더 파일을 제거하고, 단일한 객체 상속(single-rooted object hierarchy)과 같은 단순함을 목적으로 여러가지 면에서 C++을 개선하여 만들어졌다. 그러나 이러한 모든 간소화(simplifications)의 공통적인 측면은 Java가 실질적으로 코드 작성을 더욱 단순하게 만들어준다는 점이다. 다른 구성요소들을 제외하고 우리는 지금까지 열거자, 프로퍼티, 그리고 이벤트에 대해 살펴보았는데, 이것들은 여러분의 코딩을 좀 더 복잡하게 만든다.
7. 컬렉션과 Foreach문
C#은 for 반복문의 짧은 형태를 제공하는데, 이것도 역시 컬렉션 클래스에 대한 일관성을 증가시키도록 도와준다.
Java나 C++의 경우:
1. while (! collection.isEmpty()) {
Object o = collection.get();
collection.next();
...
2. for (int i = 0; i < array.length; i++)...
C#에서는:
1. foreach (object o in collection)...
2. foreach (int i in array)...
C#의 for 반복문은 컬렉션 객체(컬렉션을 구현하는 배열)에서만 효과가 있을 것이다. 컬렉션 객체는 열거형 객체(Enumerator object)를 리턴하는 GetEnumerator() 메소드를 갖고 있다. 열거형 객체는 MoveNext 메소드와 Current 프로퍼티를 갖는다.
// 내용이 꽤 됐네요... Java에서는 열거형과 enhanced for loop라고 해서 C#의 foreach 반복문과 같은 역할을 하는 문법이 1.5부터 추가되었죠.