[JAVA] 이것이 자바다.1-2

    JDK = JRE + 컴파일러 등 개발도구

    JRE = JVM + 기본 클래스 라이브러리

     

    환경변수 PATH 설정 이유 : 어디에서든 java폴더 안에 있는 명령어를 찾아 실행시키기 위함. PATH에  jdk/bin 위치를 지정해 놓으면 명령어를 찾을 때, bin 폴더 안에서 찾을 수 있다.

     

    주석

    단일 행 주석(행 주석) //

    여러 행 주석(범위 주석)  /* ~ */

    주석에 들어갈 내용 : 작성자, 작성일과 시간, 프록램의 버전과 변경 이력, 주요 코드에 대한 설명

     

    이클립스 각 폴더에 대한 설명

    .metadata : 사용자가 지정해둔 개발 환경에 대한 속성을 저장. 이클립스 재시작 할 때, 이전 상태 복원할 목적

    .bin : 바이트 코드파일을 저장한다. (.class)(이클립스는 소스코드를 작성하고 저장하는 것만으로도 자동으로 컴파일한다)

    .src : 소스코드가 저장되는 폴더이다. (.java)

     

    JAVA프로그램 개발 순서

    자바 소스 파일 작성(.java) -> 컴파일(javac.exe) -> 바이트코드 파일(.class) -> 실행(java.exe) -> JVM위에서 구동

     

    JVM이란? (write once, run anywhere)

    JVM이란 Java Virtual Machine의 약자로 운영체제에 독립적으로 자바로 작성된 프로그램을 실행시키도록 해주는 가상의 기계, 운영체제의 역할을 수행하여 자바 프로그램을 JVM위에서 구동한다. 따라서 자바로 작성된 프로그램은 컴퓨터의 운영체제에 독립적이 된다. 다만, JVM은 각 운영체제가 이해할 수 있는 기계어로 바꿔줘야하기 때문에 운영체제에 종속적이다.

     

    데이터 타입

    기본 타입 : 정수형(byte char shor int long), 실수형(float, double), 논리(boolean)

    클래스 타입 : 문자열 (String)

    String 변수는 참조변수로 참조변수의 경우

     

    자바에서 정수 타입의 변수를 저장할 때, 최소값부터 시작해서 최대값을 넘으면 다시 최소서값부터 시작하게 된다.

    예를 들어 byte형(-128 ~ 127)에 정수를 저장 시, -128부터 시작해서 127을 넘으면 다시 -128부터 시작하게 된다.

     

    char 타입이 2byte인 이유

    자바는 모든 문자를 유니코드로 처리한다. 그리고 유니코드는 0~65535 범위의 2byte 크기를 가진 정수값이다. 

    char는 하나의 유니코드를 저장하기 위한 데이터 타입이기 때문에 유니코드의 범위와 같은 2byte로 설계되었다.

    따라서 char 데이터 타입에는 음수값을 저장할 수 없다. (2의 16승은 65536이다.)

     

    묵시적 형변환 : 작은 범위의 타입을 큰 범위의 타입으로 변환 시킬 때(대입할 경우)

    명시적 형변환 : 반대로 큰 범위 타입의 값을 작은 범위의 타입에 대입하기 위해선, 명시적 형변환이 필요하다.

    ex) (byte) intValue

     

    Java는 정수의 연산을 기본, int형으로 처리한다. 따라서 byte 타입끼리의 덧셈 계산도 각각 int형으로 변환되어 계산되므로, 그 결과값은 int형이 된다. 하지만, 연산식에 조금 더 넓은 범위의 타입이 하나라도 들어가게 되면, 해당 데이터 타입으로 변환하여 계산한다. 이것은 자바 가상 기계의 특징으로 JVM이 기본적으로 32비트 단위로 계산하기 때문이다.

    int v1 = 10;
    int v2 = 4;
    int result1 = v1 / v2;
    double result2 = v1 / v2;

    위와 같은 경우 result1과 result2는 어떻게 변할까. 세번째 라인에 result1은 예상대로 2가 나온다. 물론 10/4는 2.5가 되는 것을 우리 모두는 알지만, result1의 데이터타입이 int 형이기 때문에 소수점 아래부분을 버린 2가 된다. 네 번째 라인에 result2는 어떻게 될까. double 형이기 때문에 result2에는 2.5가 저장될 것처럼 보인다. 하지만, 실제로 출력해보면 결과는 2.0이 나온다. 왜 그럴까? 그 이유는 대입연산자를 기준으로 오른쪽에 오는 연산식에 피연산자들이 모두 int형이기 때문이다. int 형 끼리 연산결과는 int가 된다. 따라서 오른쪽의 연산결과는 2가 되고, int형인 2가 double 형인 result2에 대입될 때, 묵시적 캐스팅이 일어난다. 따라서 result2은 2.0이 된다. 이러한 결과를 막기 위해선, 연산식에 피연산자들 중 적어도 하나를 실수형으로 변환해주면 된다.

     

     

    short에 char 값을 대입한다면?

    short와 char는 모두 2byte 크기로 정수 데이터를 저장한다. 그렇다면 short에 byte값을 대입할 때, 혹은 그 반대의 경우 형변환이 일어나지 않을까? 정답은 아니다. 같은 2byte 크기로 데이터를 저장한다고 해도, char 데이터타입의 경우 0~65535, short는 -32768 ~ 32767의 범위를 저장한다. char 데이터 타입이 양수범위에서 2배 더 많은 표현을 가지므로 묵시적 형변환이 불가능하고, char를 short로 안정적으로 변환하기 위해서는 수의 범위를 확인하고 명시적 형변환을 해줘야 한다.

     

    float를 초기화 시키는 방법

    float floatValue = 10;   float floatValue = 10.0;

    두 개의 비슷한 초기화 문장이 있다. 얼핏보면 두 개 모두 가능하거나 불가능하다고 생각된다. 

    사실은 첫번째 식은 가능하고 두번째 식은 불가능한데. 그 이유를 알아보자.

    첫번째 식의 경우 float형의 데이터 타입에 int 리터럴이 들어간다. 이 경우 묵시적 형변환이 일어나면서 아무런 이상없이 값이 저장된다. 반면, 두번째 식의 경우 float 데이터 타입에 double 리터럴이 들어간다. 따라서 이 경우에는 묵시적 형변환이 일어나지 못하고 컴파일에러가 뜨게된다. 해결법은 10.0 대신 10.0f 또는 10.0F를 사용해, 뒤에 리터럴이 float형임을 알려주는 것이다.

     

     

    댓글