[C++ to Java] 0. Orientation
어쩌다 java를 해야 하는 사람들을 위해 2021-12-15

C++ to Java

안녕하세요! JustKode 입니다. 살다 보면, 아니 한국에서 개발자로 살다보면 생각 보다, Java를 해야 할 일이 많습니다. Android, Spring, Hadoop, Spark 등, 여러 곳에서 자바는 사용 됩니다.

대부분의 컴퓨터공학과 학생들은 학교 프로그래밍 기초 시간에, C/C++을 많이 배우게 됩니다. 저 같은 경우에도 1학년 때 C++로 프로그래밍을 시작 했습니다.

C++Java는 닮은 구석이 많습니다.

  • 객체지향 프로그래밍에 용이한 구조를 가지고 있다.
  • 코드 구조가 상당히 유사하다.

사실 이 두 가지가 많은 것들을 함축하고 있습니다. 코드 구조가 유사하다는 것은, 우리가 C++ 에서 배운 개념들을 유사하게 Java에서 이용할 수 있다는 것을 의미 합니다.

그래서, 저는 유사한 부분과, 다른 부분을 비교 및 대조 해 보며, **C++**을 배운 학생들이 쉽게 Java를 배울 수 있도록 글을 써보려고 합니다.

해당 시리즈는, **C++**의 상속, virtual Class 및 function, STL 까지, 다 알고 있다는 가정 하에 진행 합니다. 오늘은 Java를 하기 전에 알아야 할 것들에 대해서 작성 해 보려고 합니다.

Java에 대해서 간단한 언급

Java는 순수하게 객체지향 프로그래밍을 실천하기 위해 만들어진 언어 면서, **C++**의 단점인 종속성 문제를 해결 하기 위해 등장하였습니다. **C++**은 한 번 컴파일 되면 해당 운영체제 혹은 플랫폼에 종속되는 문제를 가지고 있지만, JavaJVM을 이용하여, Java 실행 환경을 지원 하는 어느 운영체제에서도 실행 될 수 있도록 합니다. 이를 통해, Java는 전 세계에서 가장 많은 사람이 사용 하는 언어로 자리 매김 할 수 있었습니다.

JVM 구조, 출처: https://medium.com/@ahn428/java-jvm-java-virtual-machine-jre-java-runtime-environment-jdk-java-developement-kit-fed91def1d6f

Java가 C++ 보다, 좋고 나쁜 점

Java가 **C++**에 비한 장단점은 다음과 같습니다.

장점

  • 운영체제 종속성이 덜 함.
  • 가비지 컬렉터가 존재, 메모리 관리 코드를 넣지 않아도 됨.
  • 많은 사람들이 사용 하는 만큼, 자료가 많음.

단점

  • 느림.
  • 코드가 너무 김.
  • 예외 처리가 까다로움.

JRE, JDK

  • JRE: Java Runtime Environment로, JVM, Java Class Library, Java Command 등 자바 프로그램을 실행 하기 위해 필요한 패키지, 실행 환경 입니다.
  • JDK: Java Development Kit으로, 자바 코드를 컴파일 하는 데 사용하는, javac를 포함하고 있습니다. 물론, JRE와 함께 말입니다.

우리는 JDK 내에 있는 javac를 사용 하여, java 코드를 .class 파일로 컴파일 하고, java를 이용 하여 .class 파일을 실행 합니다.

Test.class 파일이 만들어 진 것은 생략 하였습니다.

File Name

파일 명은, public class 이름과 완전히 일치 해야 합니다. 또한, public class파일 내에 하나만 존재 하여야 합니다.

Main.java

public class Main {
    ...
}

class Sub {
    ...
}

만약 public class가 없다면, 아무 클래스의 이름과 일치 하여도 됩니다.

A.java or B.java

class A {
    ...
}

class B {
    ...
}

public class가 존재 하는가? 이는 그저 가독성 때문 입니다. 만약 제가 Pig 라는 클래스를 import 하였는데, Cat이 나오면 당황스러울 것이기 때문입니다.

Variable Type

Java에서 기본 적으로 제공하는 변수는 다음과 같습니다. 대부분 C++ 에서 사용 하던 파일 타입을 사용 하나, **C++**과 다르게 unsigned를 적용 할 수 없습니다.

  • 정수: byte, short, int, long
  • 실수: float, double
  • 문자: char
  • 참과 거짓: boolean

public static void main(String args[])

public static void main(String args[])public class 내에 존재하여, **C++**에서 int main() 역할을 합니다. 이 함수를 public class 내에 넣어 주면 해당 코드를 실행 합니다. args에 들어가는 데이터들은 java 명령어로 .class 파일을 실행 할 때 argument로 들어 가는 값들 입니다.

  • Code

Main.java

public class Main {
    public static void main(String[] args) {
        for (int i = 0; i < args.length; i++) {
            System.out.print(args[i] + ", ");
        }
        System.out.print('\n');
    }
}
  • Terminal
$ java Main 123 456 789
123, 456, 789, 

new operator

new는 새로운 배열의 혹은 새로운 객체를 heap 영역에 할당 할 때 사용 합니다.

int[] int_array = new int[5];
// int형 배열 참조변수 int_array에
// 새롭게 heap 영역에 할당 된 int_array 배열의 주소를 저장함.

Cat cat;
// 메모리에 참조 변수 cat을 위한 공간이 마련됨.
// 아직 인스턴스가 생성 되지 않음.

cat = new Cat();
// 참조 변수 cat에 새롭게 heap 영역에
// 할당 된 Cat 객체의 주소를 저장함.

마치며

다음 시간에는 본격적으로 콘솔 입출력, 배열 복사, os 정보 열람 기능을 담당하는 System 객체에 대해서 알아 보겠습니다.