The More Things Change The More They Stay The Same

참조 : A COMPARISON OF MICROSOFT’S C# PROGRAMMING LANGUAGE TO SUN MICROSYSTEMS’ JAVA PROGRAMMING LANGUAGE

1. We Are All Objects

– java.lang.Object와 비슷한 클래스 System.Object
– 모든 클래스들의 슈퍼 클래스.
– 메소드 이름이 대문자로 시작하는 군.
– object 키워드 == System.Object

2. Keyword Jumble

– 자바에는 없는 키워드가 C#에는 많이 있군.
자바 -> C#
extends, implements -> :
boolean -> bool
final -> sealed
protected -> internal (C#의 protected는 다른 의미인듯..)

3. Of Virtual Machines and Language Runtimes

– 자바 소스 코드 -> 바이트 코드 -> Run in JVM
– C# 소스 코드 -> IL(Intermediated Language) -> Run in CLR(Common Language Runtime)

4. Heap Based Classes and Garbage Collection

– 자바는 new 키워드를 사용해서 모든 객체를 힙 영역에 생성.
– C#도 new 키워드를 사용해서 일부 클레스의 객체를 힙 영역에 생성.
– JVM 처럼 CLR도  Mark and Compact garbage collection algorithm 사용해서 Gabage Collection을 수행한다.
– value 타입은 stack에 생성할 수도 있나보다.

5. Arrays Can Be Jagged

– C나 C++의 다차원 배열에서 배열은 꼭 같은 길이의 배열을 가져야 했다.
– C#과 Java는 배열이 다른 길이의 배열을 가지고 있어도 된다.
int [][]myArray = new int[2][];
myArray[0] = new int[3];
myArray[1] = new int[9];

6. No Global Methods

– C++ 에서는 메소드가 클래스 밖에 있어도 됐나보다.
– C#은 자바처럼 메소드가 클래스의 멤버나 Static Method여야 한다.

7. Interfaces, Yes. Multiple Inheritance, No

– Java처럼 인터페이스는 다중 상속(구현)을 허용.
– Java처럼 상속은 다중 상속을 허용하지 않음.

8. Strings Are Immutable

– C#의 System.String은 Java의 java.lang.String과 비슷. 변하지 않는다.
– C#의 System.Text.StringBuilder는 Java의 java.lang.StringBuffer과 비슷.(동기화 시켜놓은 것도 비슷하려나;; 안했으면 StringBuilder랑 비슷한건데..)
– string 또는 String으로 표기할 수도 있다.

9. Unextendable Classes

– 자바에서 final 키워드를 class 앞에 붙이면 더이상 상속하지 못하는 클래스가 된다.
– C#에서는 sealed 키워드를 class 앞에 붙이면 된다.

10. Throwing and Catching Exceptions

– 자바와 동일하게 예외 클래스들의 최상위에 Exception 클래스를 제공한다.
– 예외를 감싸서 다시 던질 수 있다.

11. Member Initialization at Definition and Static Constructors

– 만약 멤버 변수가 인스턴스 변수이면, 생성자가 호출되기 전에 초기화 한다.
– Static 멤버들은 해당 멤버를 사용하기 전이나, 멤버가 속해있는 클래스의 객체를 만들기 조금 전에 초기화 한다.
– 인스턴스 변수를 생성하거나 Static 메소드를 호출하기 전에 특정 블럭을 실행하도록 하는 것도 가능하다.
– 자바에서는 이런 코드 블럭을 static 초기화 블럭이라고 한다.
– C#에서는 static 생성자라고 한다.(실제 모양도 생성자 모양.)

using System;

class StaticInitTest{

    string instMember = InitInstance();

    string staMember = InitStatic();
   

    StaticInitTest(){
    Console.WriteLine(“In instance constructor”);
    }

    static StaticInitTest(){
    Console.WriteLine(“In static constructor”);
    }

    static String InitInstance(){
    Console.WriteLine(“Initializing instance variable”);
    return “instance”;
    }

     static String InitStatic(){
    Console.WriteLine(“Initializing static variable”);
    return “static”;
    }

    static void DoStuff(){
    Console.WriteLine(“Invoking static DoStuff() method”);
    }

   
    public static void Main(string[] args){

    Console.WriteLine(“Beginning main()”);

    StaticInitTest.DoStuff();
   
    StaticInitTest sti = new StaticInitTest();

    Console.WriteLine(“Completed main()”);

    }

}

In static constructor
Beginning main()
Invoking static DoStuff() method
Initializing instance variable
Initializing static variable
In instance constructor
Completed main()

이런 코드가 나온이유.

main() 메소드 실행하기 전에, static 생성자가 호출 된다.

In static constructor

그 다음 static 메소드를 호출할 때는 이미 static 생성자가 호출 됐기 때문에 그냥 메소드 호출.

Invoking static DoStuff() method

생성자가 호출되기 전에 인스턴스 변수들을 초기화 하기 때문에, new StaticInitTest(); 하는 순간 필드들을 초기화 하려고 하겠지.. 그래서..

Initializing instance variable
Initializing static variable

12. Boxing

– .Net은 boxing, unboxing 그냥 된다.
– Java도 5 부터는 된다.
– C#에서도 Collection에는 객체만 들어갈 수 있군.

Eclipse에서 Static Import 편하게 쓰려면

Java 5에 추가된 static import 기능을 사용할 때 보통 .* 로 모든 Static Method들을 클레스 이름을 붙이지 않고도 사용할 수 있습니다. .* 대신에 사용할 메소드를 import 해도 되지만… import문이 여러개로 늘어나는데다가, 무엇보다 자동완성이 지원되지 않아서 불편합니다. 특히 JUnit4로 테스트를 작성할 때 그렇쵸.

문제는

import static org.junit.Assert.*;

이렇게 한 줄 추가(이것 마저도 퀵픽스Ctrl + 1를 사용하면 외우지 않아도 됩니다.)한 뒤 코딩을 하다가 버릇처럼 Ctrl + Shift + O를 한 번씩 눌러주면, 다음과 같이 바뀐다는 것입니다.

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

이 다음 부터는 이제 자동완성도 안 되고, 그러면 assertTr 까지만 입력해도 되는 걸 assertTrue(1 == result); 이렇게 전부 입력한 다음에 퀵픽스로 임포트 문을 또 추가해줘야 합니다. 귀찮죠..

그래서 Ctrl + Shift + O 를 입력할 때, .*로 전부 묶을 수 있습니다.

사용자 삽입 이미지
위와 같이 Number of static import needed for .* 을 99에서 1로 수정해주시면 Ctrl + Shift + O 로 import문을 정리할 때 .* 만 남기고 그 이하는 모두 제거합니다.

사용자 삽입 이미지
그럼 이제 ‘import문 정리하기’를 한 뒤에도 자동완성으로 다른 static 메소드들을 사용할 수 있습니다.