C#과 Java언어 비교(4) - Enums, Foreach문

C# and JAVA 2007. 5. 29. 10:52

http://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부터 추가되었죠.

: