Java - 특징과 변수

2019년 04월 23일

자바언어의 특징

자바 응용프로그램은 운영체제나 하드웨어가 아닌 JVM(Java Virtual Machine)과 통신하고, JVM이 자바 응용프로그램으로부터 전달받은 명령을 운영체제가 이해할 수 있도록 변환한다. 따라서 자바로 작성된 프로그램은 운영체제와 관계없이 실행 가능하다. (Write once, run anywhere)

단 JVM은 운영체제에 종속적이므로 해당 OS에서 실행가능한 JVM이 필요하다.

컴파일 언어(eg. C)와 인터프리터 언어(eg. JS)의 특징을 모두 가지고 있다. 컴파일 언어는 OS가 바로 명령을 수행하므로 OS 의존적일 수밖에 없으나 그만큼 빠르다는 장점이 있다. 반면 인터프리터 언어는 OS와 관계없이 인터프리터만 있으면 실행이 가능하다. 자바는 .java파일을 컴파일하여 .class파일로 바꾸고 이를 인터프리터가 해석하여 실행한다.

자바는 객체지향 프로그래밍언어로서 상속, 캡슐화, 다형성이 잘 적용되어 있다.

자바로 쓰인 프로그램이 실행되면 가비지컬렉터(garbage collector)가 자동적으로 메모리 관리를 해준다.

자바는 시스템과 관계없이 멀티쓰레드를 지원한다. 이 쓰레드에 대한 스케줄링은 자바 인터프리터가 담당한다.

동적 로딩(Dynamic Loading)을 지원하여 실행 시 모든 클래스가 로딩되지 않고 필요한 시점에 클래스를 로딩하여 사용할 수 있다는 장점이 있다. 또한 일부가 변경되었을 시 전체를 다시 컴파일하지 않아도 된다.

변수

변수란 단 하나의 값을 저장할 수 있는 메모리 공간이다. 자바는 변수 타입을 사전에 지정해야 한다.

변수명은 숫자로 시작해서는 안 되며, 특수문자는 _$만 허용한다. (eg. $harp 허용)

변수 타입에는 기본형(primitive)과 참조형(reference)이 있다. 기본형은 실제 값을 저장하는 반면 참조형은 주소를 값으로 갖는다. 기본형이 아닌 변수는 다 참조형이다.

  • 기본형(8개): 논리형(boolean), 문자형(char), 정수형(byte, short, int, long), 실수형(float, double)
  • 자바스크립트는 stirng이 primitive에 포함되는 반면, 자바에서는 클래스이다.
  • char

char은 문자 리터럴이며, 딱 한 글자만 할당할 수 있다. (”은 안된다. ’ ‘은 가능하다.)

Stirng이 문자 리터럴인 것과 구분된다. 또한 String은 double quote을, char은 single quote을 사용한다. String은 빈 문자열("")도 가능하다.

‘1’+ 1 = 50이다. char은 아스키코드를 사용한다. char ‘1’은 49를 의미한다. “1” + 1 = “11”이다. 1 + “1”도 마찬가지다.

자료형에 따른 크기

byte(1) < short(2) < int(4) < float(4) < long(8) < double(8)

  • 괄호 안은 byte, 같은 바이트여도 실수 형이 더 크다.
  • char은 2바이트인데, 양수값만 가지므로 byte, short와 비교할 수 없다.

자동형변환

만약에 b변수와 a변수를 더하는 연산을 하려고 하는데, 두 변수의 타입이 다르다면? 자바는 int보다 크기가 작은 자료형은 자동으로 int로 바꾼다.

char + int = int + int // int

만약 int보다 크기가 자료형은 크기가 큰 자료형으로 자동으로 변환한다.

float + double = double + double // double
float + int = float + float // float (둘 다 4바이트지만 실수형이 더 크다)

boolean은 형변환할 수 없다. (나머지 7개 기본형끼리는 가능)

강제형변환

크기가 큰 자료형으로의 변환은 자동으로 지원되지만, 크기가 작은 자료형으로 변환하고자 하는 경우에는 강제형변환이 필요하다. 기존 자료형 앞에 ()을 붙여서 한다.

또한 int로 나눗셈을 하는데 소수점까지 얻고 싶다면 하나를 float로 형변환을 하여야 한다.

int / (float)int -> int / float -> float / float (연산직전에는 자동형변환)
  • 형변환할 때 할 수 있는 실수(괄호의 범위)

    int month = (int)(Math.random() * 12) + 1;

    실수로 Math.random()까지만 괄호 치면 int가 적용되어 난수값은 무조건 0이다. 그러면 month값은 항상 1이 된다. 오류도 뜨지 않으니 조심…

상수와 리터럴

리터럴은 그 자체로 값을 의미하는 것. (문자 리터럴, 숫자 리터럴 등)

상수(constant)는 값을 한번만 저장할 수 있는 공간이다. 변경이 불가하므로 그런 의미에서 final을 앞에 붙인다. (=자바스크립트의 const) 상수는 전부 대문자로 쓰며 의미가 구분될 때는 언더스코어를 쓴다. 또한 상수는 선언과 동시에 초기화해야 한다.

final int MAX_VAL; // error
final int MAX_VAL = 1000; // ok