단항 연산자

증감 연산자 (++, --)

피연산자에 저장된 값을 1 증가 또는 감소시킨다.

정수와 실수는 가능하지만, 상수는 불가능하다.

타입 설명 사용 예시
전위형 (prefix) 값이 참조되기 전에 증감시킨다. j = ++i;
후위형 (postfix) 값이 참조된 후에 증감시킨다. j = i++;

부호 연산자 (+, -)

부호 연산자 '-'는 피연산자의 부호를 반대로 변경한 결과를 반환한다.

boolean형과 char형을 제외한 기본형에만 사용 할 수 있다.

산술 연산자

산술 연산자에는 사칙연산자(+, -, *, /)와 나머지 연산자(%)가 있다.

사칙연산자 (+, _, *, /)

덧셈과 뺄셈보다 곱셈과 나눗셈의 우선순위가 높다.

나누기 연산

피연산자가 정수형인 경우, 나누는 수로 0을 사용 할 수 없다.

나누기 연산자의 피연산자가 모두 int 타입인 경우, 연산결과 역시 int 타입이 되며, 소수점 이하는 반올림 되지 않고 버려진다.

피연산자 중 어느 한쪽을 실수형으로 형변환 하게 되면 나머지 한 쪽도 실수형으로 자동 형변환이 되어 실수형의 값을 결과로 얻을 수 있다.

피연산자가 정수인 경우, 나누는 수로 0을 사용 할 수 없다. 하지만, 피연산자 중 한쪽이라도 실수형으로 바꾸게 되면, 결과는 Infinity가 된다.

자동 형변환

int형보다 작은 크기의 type으로 + 연산을 수행하게 되면 자료형을 자동으로 int로 변환 후 연산을 수행한다.

따라서 byte형 + byte형 연산의 수행 결과는 int형이 된다. byte 타입의 변수에 byte형 + byte형 의 연산결과를 저장하려 한다면, 에러가 발생한다.

또한, byte형 + byte형 연산의 수행 결과가 byte형의 표현 범위를 넘어서는 경우, 데이터 손실이 발생하게 된다.

마찬가지로 int형 * int형 연산 수행 결과는 int형이므로 int형의 표현 범위를 넘어서는 경우 long으로 형변환이 되었다 하더라도 데이터 손실이 발생한다.

문자형(char)의 연산

문자(char)형 변수는 부호없는 정수인 유니코드로 저장되므로, 연산이 가능하다.

char c2 = c1 + 1; // '+'연산의 결과는 int형이므로 char형 변수에 담을 수 없다.
char c2 = 'a' + 1; // 변수가 아닌 리터럴 간의 연산은 컴파일시 컴파일러가 미리 계산하여 오류가 없다.

리터럴 간 연산은 컴파일시 컴파일러가 미리 알 수 있는 값이기 때문에 컴파일 후 변환되게 된다.

ex. 60 * 60 → 360, 'a' + 1 → 'b'

하지만 변수가 포함된 연산은 컴파일시 계산 할 수 없으므로 런타임에 형변환이 발생하여 오류가 발생하게 된다.

런타임에 연산이 되지 않음으로 360을 60 * 60과 같이 표기하였다 하여 런타임 성능에 영향을 주지도 않는다.

나머지 연산자 (%)

왼쪽 피연산자를 오른쪽 피연산자로 나누고 난 나머지.

오른쪽 피연산자로 0을 사용 할 수 없다.

나누는 수로 음수도 허용하지만, 부호는 무시된다. 결과는 음수의 절대값으로 나눈 나머지와 결과가 같다.

실행결과는 왼쪽 피연산자의 부호를 따른다.

비교 연산자

두 피연산자를 비교하는 데 사용된다. 연산결과는 오직 true와 false 둘 중 하나.

비교하는 피연산자의 타입이 서로 다른 경우, 자동 형변환이 발생한다.

대소비교 연산자 (<, >, <=, >=)

두 피연산자의 값의 크기를 비교하는 연산자.

기본형 변수 중에서는 boolean을 제외한 모든 자료형에 사용 할 수 있다.

참조형 변수에는 사용 할 수 없다.

등가비교 연산자 (==, !=)

두 피연산자가 같은지, 다른지 비교하는 연산자.

모든 변수형에 사용 할 수 있다. 기본형의 경우 변수에 저장된 값을 비교 할 수 있고, 참조형의 경우 객체의 주소값을 비교한다.

서로 다른 기본형에 사용될 경우, 형변환이 수행된다.

ex.

10.0 == 10.0f true
0.1==0.1f false // 0.1f는 0.10000000149011612, 0.1은 0.10000000000000001으로 저장된다.

double과 float타입을 비교하기 위해서는 double 타입을 float으로 형변환 한 후 비교해야 한다.

문자열의 비교

문자열은 equals() 메소드로 비교한다. '==' 연산자로 비교할때는 같은 객체인지 비교하게 된다.

String str1 = "abc";
String str2 = new String("abc");
String str3 = "abc";
System.out.printf("str1 == str2 ? %b%n", str1 == str2); // false
System.out.printf("str1 == str3 ? %b%n", str1 == str3); // true
System.out.printf("str1.equals(\"abc\") ? %b%n", str1.equals("abc")); // true
System.out.printf("str2.equals(\"abc\") ? %b%n", str2.equals("abc")); // true
System.out.printf("str2.equals(\"ABC\") ? %b%n", str2.equals("ABC")); // false
System.out.printf("str2.equalsIgnoreCase(\"ABC\") ? %b%n", str2.equalsIgnoreCase("abc")); // true

대소문자를 구분하고 싶지 않다면 equalsIgnoreCase() 메서드를 사용한다.

논리 연산자

둘 이상의 조건을 그리고(AND)나 또는(OR)로 연결하여 하나의 식으로 표현 할 때 사용한다.

논리 연산자 (&&, ||, !)

'&&': 그리고(AND)

'||': 또는(OR)

1) x는 10보다 크고 20보다 작다.

x > 10 && x < 20

2) i는 2의 배수 또는 3의 배수다.

i % 2 == 0 || i % 3 == 0

3) i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.

(i % 2 == 0 || i % 3 == 0) && (i % 6 != 0) // '&&'연산은 '||' 연산보다 우선순위가 높다.

4) 문자 ch는 숫자 '0'~'9'이다.

'0' <= ch && ch <= '9' // 유니코드에서 문자 '0'(48)~'9'(57)가 연속적이므로 가능하다.

5) 문자 ch는 대문자 알파벳 또는 소문자 알파벳이다.

('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z') // 유니코드에서 알파벳이 연속적으로 배열되므로 가능하다.

효율적인 연산

연산 OR(||)의 경우, 피연산자 중 어느 한쪽만 true여도 연산결과가 true가 되므로 좌측 피연산자가 true인 경우 우측 피연산자의 값은 평가하지 않는다.

AND(&&)연산도 마찬가지고 좌측 피연산자가 false인 경우 우측 피연산자의 값을 평가하지 않는다.

그래서 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있다.

논리 부정 연산자 (!)

피연산자가 true이면 false를, false이면 true를 반환한다.

// ch는 소문자가 아니다.
(ch < 'a' || ch > 'z')
!('a' <= ch && ch <= 'z') // 이해하기 쉽다.

비트 연산자

비트 연산자 (& | ^ ~ << >>)

비트단위의 논리 연산. 피연산자를 이진수로 표현했을 때의 연산. 피연산자로 실수는 허용하지 않는다. 정수(문자 포함)만 허용.

|(OR) 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.

&(AND) 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.

^(XOR) 피연산자의 값이 서로 다를때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

'|'연산자는 특정 비트의 값을 변경할 때, '&'연산자는 특정 비트의 값을 뽑아낼 때 사용한다.

'^'연산자는 간단한 암호화에 사용된다.

비트 연산에도 피연산자의 타입을 일치시키는 '산술 변환'이 일어날 수 있다.

비트 전환 연산자 (~)

피연산자를 2진수로 표현했을 때, 0은 1로, 1은 0으로 바꾼다.

피연산자의 '1의 보수'를 얻을 수 있다. 1의 보수에 1을 더하면 음수가 된다.

비트 전환 연산자의 피연산자의 타입이 int보다 작으면 int로 자동 형변환이 된 값을 얻는다.

쉬프트 연산자 (<< >>)

피연산자를 2진수로 표현했을 때 각 자리를 오른쪽 또는 왼쪽으로 이동한다.

저장범위를 벗어난 값들은 버려지고, 빈자리는 0으로 채워진다.

'>>'연산자는 부호있는 정수는 부호를 유지하기 위해 왼쪽 피연산자가 음수인경우 빈자리를 1로 채운다.

쉬프트 연산자의 좌측 피연산자는 산술변환이 적용되어 int보다 작은 타입은 int타입으로 자동 변환되고 연산결과 역시 int타입이 된다. 우측 피연산자의 경우 산술변환이 적용되지 않는다.

2진수 n자리를 왼쪽으로 이동하면 피연산자에 2ⁿ을 곱한 결과를, 오른쪽으로 이동하면 2ⁿ을 나눈 결과를 얻는다. 2진수이기 때문.

'x << n' 또는 'x >> n'에서 n의 값이 자료형의 bit수 보다 크면, 자료형의 bit수로 나눈 나머지만큼만 이동한다.

ex) '8 >> 32': 아무일도 하지 않음. '8>>34' == '8>>2'

n은 정수만 가능하며, 음수인경우 부호없는 정수로 변환된다.

2의 배수로 곱하거나 나누는 연산에서 '*', '/' 연산보다 속도가 빠르지만 가독성이 떨어지기 때문에 속도에 민감할 경우에 사용된다.

그 외 연산자

조건 연산자 (? :)

조건연산자는 조건식, 식1, 식2를 필요로 하는 삼항연산자이며 삼항 연산자는 하나뿐이다.

result = (조건식 ? 식1 : 식2)

if(조건식){
    result = 식1
} else{
    result = 식2
}

조건식이 true일 때, 연산 결과는 식1이 되며 조건식이 false일 때, 연산 결과는 식2가 된다.

조건 연산자의 식1과 식2의 피연산자의 타입이 다른 경우, 산술변환이 발생한다.

대입연산자

대입연산자 (=)

변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장한다.

가장 낮은 우선순위를 갖고 있다.

연산 진행방향이 오른쪽에서 왼쪽이다.

리터럴이나 상수같이 값을 저장 할 수없으면 왼쪽 피연산자가 될 수 없다.

복합 대입연산자 (op=)

i += 3; 
i = i +3;

i *= 10 + j;
i = i * (10 + j);
728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (1)  (0) 2021.07.11
형변환  (0) 2021.06.24
기본형  (0) 2021.06.24
변수  (0) 2021.06.21
JAVA란?  (0) 2021.06.17

연산자 (Operator)

연산자와 피연산자

연산자(Operator): 연산을 수행하는 기호 (+, -, *, /, 등)

피연산자(Operand): 연산자의 작업 대상 (변수, 상수, 리터럴, 수식)

식과 대입연산자

식(Expression): 연산자와 피연산자를 조합하여 계산하고자 하는 것을 표현한 것

평가(Evaluation): 식을 계산하여 결과를 얻는 것. 하나의 식을 평가하면, 하나의 결과를 얻는다.

대입 연산자(=): 식의 평가결과를 변수와 같이 값을 저장 할 수 있는 공간에 결과를 저장할때 사용.

연산자의 종류

종류 연산자 설명
산술 연산자 +, -, *, /, %, <<, >> 사칙연산과 나머지(%) 연산. bit shift 연산.
비교 연산자 >, <, >=, <=, ==, != 크고 작음과 같고 다름을 비교.
논리 연산자 &&, ||, !, &, |, ^, ~ AND와 OR으로 조건을 연결.
'|'은 OR연산자, '&'은 AND연산자, '^'은 XOR연산자, '~'은 NOT연산자
대입 연산자 = 우변의 값을 좌변에 저장.
기 타 (type), ? :, instanceof 형변환 연산자, 삼항연산자, instanceof 연산자
  • 삼항 연산자는 오직 '? :' 뿐이다.

연산자의 우선순위와 결합규칙

종류 결합규칙 연산자 우선순위
단항 연산자 ++, --, +, -, ~, !, (type) 높음
산술 연산자 *, /, %
+, -
<<, >>, >>>
비교 연산자 <, >, <=, >=, instanceof
==, !=
논리 연산자 &
^
|
&&
||
삼항 연산자 ? :
대입 연산자 =, +=, -=, *=, /=, %=
<<=, >>=, &=, ^=, |=
낮음

Shift 연산자 (<< , >> , >>>)

  • 정수형데이터에서만 사용가능하고 2진수로 표현했을때 각 자리를 오른쪽 또는 왼쪽으로 이동
  • 오른쪽으로 n비트 이동하면 피연산자를 2의 n승으로 나눈 것과 같은 결과이다.
  • '<<' 연산자의 경우, 피연산자의 부호에 상관없이 자리를 왼쪽으로 이동시킵니다.
  • '>>' 연산자는 음수인 경우 부호를 유지시켜주기 위해서 빈자리를 1로 채웁니다.
  • '>>>' 연산자는 부호에 상관없이 항상 0으로 빈자리를 채워줍니다.

산술 변환 (usual arithmetic conversion)

피연산자의 타입이 다르다면, 연산 전 형변환 연산자로 타입을 일치시켜야 한다.

자동 형변환 규칙이 적용되는 타입인 경우, 보통 작은 타입에서 큰 타입으로 자동 형변환이 수행된다.

연산 전 피연산자 타입의 일치를 위해 자동 형변환되는것을 '산술 변환' 또는 '일반 산술 변환'이라 한다.

  • 두 피연산자의 타입을 같게 일치시킨다. (보다 큰 타입으로 일치)
  • 피연산자의 타입이 int보다 작은 타입이면 int로 변환된다. (ex. char + short → int + int → int) 이유는 int형이 JVM에서 효율적으로 처리할 수 있는 단위이기도 하며 오버플로우의 발생 확률을 줄이기 위해서.

실수형이 아닌 피연산자의 연산결과는 정수형이 되어 소숫점 이하의 결과가 버려진다. 따라서 실수 결과를 얻기 위해서는 피연산자 중 한쪽을 실수형인 float 혹은 double로 형변환 해야 한다.

728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (2)  (0) 2021.07.29
형변환  (0) 2021.06.24
기본형  (0) 2021.06.24
변수  (0) 2021.06.21
JAVA란?  (0) 2021.06.17

형변환

형변환이란?

변수, 또는 상수의 타입을 다른 타입으로 변환하는 것.

캐스팅(casting)이라고도 한다.

형변환 방법

(타입) 피연산자;

double d = 85.4;
int score = (int)d; // double 타입의 변수를 int로 형변환
  • 기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환 가능.

정수형간의 형변환

큰 타입에서 작은 타입(ex. int -> byte)으로 변환하는 경우, 크기 차이만큼 삭제되며, 값의 손실이 발생 할 수 있다.

작은 타입에서 큰 타입(ex. byte -> int)으로 변환하는 경우, 빈 공간은 0 또는 1로 채워진다. (값이 음수인 경우, 2의 보수법에 의해 1로 채워진다.)

실수형간의 형변환

작은타입(float)에서 큰 타입(double)로 변환하는 경우

  • 지수(E)는 float의 기저인 127을 뺀 후 double의 기저인 1023을 더해서 변환한다.
  • 가수(M)은 float의 가수 23자리를 채우고 남은 자리를 0으로 채운다.

double 타입에서 float으로 변환하는 경우

  • 지수(E)는 double의 기저인 1023을 뺀 후 float의 기저인 127을 더한다.
  • 가수(M)은 52자리중 23자리만 저장하고 나머지는 버린다. 이 때, 가수의 24번째 자리 값이 1이라면 반올림이 발생하여 23번째 자리의 값이 1 증가한다.
  • float의 범위를 넘는 값을 float으로 형변환하는 경우, '±무한대' 혹은 '±0'을 결과로 얻는다.

정수형과 실수형간의 형변환

실수형을 정수형으로 형변환

정수를 2진수로 변환 한 다음, 정규화를 거쳐 실수의 저장형식으로 저장된다.

이 때, 실수형의 정밀도 제한으로 인한 오차가 발생 할 수 있다.

실수형을 정수형으로 변환.

실수형을 정수형으로 변환하면, 소수점 이하 값은 버려진다. (반올림이 발생하지 않는다.)

자동 형변환

편의상의 이유로 생략된 형변환을 컴파일러가 자동적으로 추가하는 것.

자동형변환 규칙

기존의 값을 최대한 보존 할 수 있는 타입으로 자동 형변환한다.

표현범위가 좁은 타입에서 넓은 타입으로 변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다.

실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 가진다.

  1. boolean을 제외한 7개의 기본형은 서로 형변환이 가능하다.
  2. 기본형과 참조형은 서로 형변환 할 수 없다.
  3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.
728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (2)  (0) 2021.07.29
연산자 (1)  (0) 2021.07.11
기본형  (0) 2021.06.24
변수  (0) 2021.06.21
JAVA란?  (0) 2021.06.17

기본형(primitive type)

논리형(boolean)

boolean

  • 논리형은 boolean 한가지 뿐
  • true와 false 중 하나를 저장 할 수 있으며 default는 false이다.
  • 값은 0과 1, 즉 1비트만 있으면 되지만 JAVA의 기본 메모리 단위가 1 byte이므로 1 byte의 공간을 차지한다.
  • 예약어인 true와 false만 사용 가능하므로 True, False등은 사용 불가능.

문자형(char)

  • 문자형은 char 한가지 뿐
  • 문자의 유니코드(정수)가 저장된다. 유니코드를 직접 저장 할 수도 있다.
char ch1 = 'A';
char ch2 = 65;
// ch1 == ch2 -> true
  • 특수 문자 리터럴이 있다.
특수문자 문자 리터럴
tab \t
backspace \b
form feed \f
new line \n
carriage return \r
역슬래쉬 \\
작은 따옴표 \'
큰 따옴표 \"
유니코드 (16진수 문자) \u유니코드 (ex. char a = '\u0041')

정수형(byte, short, int, long)

  • byte, short, int, long 4가지 타입이 있으며 각 1byte, 2byte, 4byte, 8byte의 크기를 가진다.
  • 가장 왼쪽의 첫번째비트를 부호비트로 사용한다. (양수는 0, 음수는 1)
  • JVM의 피연산자 스택(operand stack)이 4 byte 단위로 저장하기 때문에 4byte보다 작은 값을 계산할 때는 4 byte으로 변환하여 계산한다. 따라서 int형의 연산이 byte 혹은 short보다 효율적이다.

실수형(float, double)

  • 실수를 저장하기 위한 타입.
  • 오버플로우가 발생하면 무한대가 되며, 언더플로우가 발생하면 0이 된다.
  • float은 정밀도가 7자리이며(7자리의 10진수를 오차없이 저장 가능하다), double은 15자리이다.
  • 실수를 부동소수점 형태로 저장하며, 부호(Sign), 지수(Exponent), 가수(Mantissa) 로 이루어져 있다.
  • 지수 부분에 의해 자릿수가 결정되며, 가수 부분에 의해 오차없이 저장할 수 있는 숫자의 범위가 결정된다.
728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (2)  (0) 2021.07.29
연산자 (1)  (0) 2021.07.11
형변환  (0) 2021.06.24
변수  (0) 2021.06.21
JAVA란?  (0) 2021.06.17

변수란

단 하나의 값을 저장할 수 있는 메모리 상의 공간

변수 선언과 초기화

변수타입 변수이름;

변수타입

저장될 값의 타입. 저장하고자 하는 값의 종류에 맞게 선택.

변수이름

메모리 상의 공간에 값을 저장했으므로, 그 메모리 공간에 이름을 붙여주는 것.

같은 이름의 변수가 여러개 존재한다면, 메모리 공간을 찾아 갈 수 없으므로 같은 이름의 변수가 여러개 있으면 안된다.

변수 선언

변수를 선언하면, 메모리의 빈 공간에 변수타입에 맞는 저장공간이 확보되며, 이 저장 공간은 변수 이름으로 접근 할 수 있다.

변수 초기화

  • 변수를 선언했을 때, 메모리 공간에 쓰레기 값이 존재 할 수 있으므로 사용 전 초기화를 해야 한다.
  • 지역 변수는 반드시 초기화 이후에 사용 할 수 있다. 변수 종류에 따라 초기화 없이 사용할 수 있는 변수도 있다.
  • 클래스 변수와 인스턴스 변수는 초기화를 생략 할 수 있다.

변수 명명규칙

필수 규칙

  1. 대소문자가 구분되며 길이에 제한이 없다.
  2. 자바 예약어는 사용 할 수 없다. (true, default, super 등)
  3. 숫자로 시작할 수 없다.
  4. 특수문자는 '_'와 '$'만 허용한다.

선택 규칙

  1. 클래스의 첫글자는 대문자로 한다.
  2. 여러 단어로 이루어진 변수명은 첫글자를 대문자로 한다. (camelCase, PaskalCase)
  3. 상수의 이름은 모두 대문자로 한다. 여러 단어인 경우 '_'로 구분한다.

추가로, 자바의 모든 명명에는 유니코드 문자를 사용 할 수 있지만, 적어도 클래스 이름은 ASCII코드를 사용하여 작성하는것이 좋다. 유니코드를 인식하지 못하는 OS가 있기 때문이다.

변수 타입

값의 종류는 '문자'와 '숫자'로 나눌 수 있으며

이 중 '숫자'는 '정수'와 '실수'로 나눌 수 있다.

값의 종류에 따라 저장될 공간의 크기와 저장형식을 정의한것이 변수 타입이다.

  • 문자형: char
  • 정수형: byte, short, int, long
  • 실수형: float, double

기본형과 참조형

JAVA는 C언어와 다르게 참조형 변수 간 연산이 불가능하므로 실제 연산은 모두 기본형 변수를 사용한다.

기본형 변수

  • 문자형, 정수형, 실수형, 논리형(boolean) 총 8가지
  • 실제 값을 저장한다.
문자형

문자형 변수타입 char는 내부적으로 유니코드인 정수를 저장한다.(2 bytes)

정수형 혹은 실수형과 연산도 가능하다.

논리형

크기를 1byte 사용한다.

논리형 변수타입 boolean은 다른 기본형과 연산이 불가능하다.

정수형

정수형은 byte(1 byte), short(2 bytes), int(4 bytes), long(8 bytes) 네가지를 제공한다.

int 타입이 CPU가 가장 효율적으로 사용되는 타입이므로 연산이 빠르지만, 메모리 절약을 위해 byte나 short의 선언을 고려해 볼 수 있다.

실수형

실수형은 float(4 bytes), double(8 bytes)이 사용된다.

정수형의 int 타입이 기본 자료형인 것 처럼, 실수형은 double 타입이 기본 자료형이다.

참조형 변수

클래스이름 변수이름;

  • 기본형 변수를 제외한 나머지 타입
  • 어떤 값이 저장된 주소를 값으로 갖는다.
  • 변수의 타입으로 클래스의 이름을 사용.
  • null 또는 객체의 주소(4 byte 정수)를 값으로 가진다.

상수와 리터럴

상수란

final 변수타입 변수이름 = 초기화;

  • 변수와 같이 값을 저장 할 수 있는 공간이지만, 한번 값을 저장하면 변경 할 수 없다.
  • 반드시 선언시 초기화 하여야 하며, 이후 값을 변경 할 수 없다. (JDK 1.6부터는 한줄로 초기화를 하지 않아도 사용 전에만 초기화를 하면 되도록 바뀌었다.)

리터럴

상수란 1, 20, 'A'와 같은 값을 의미하는데, JAVA에서 상수란 '값을 저장 하면 변경 할 수 없는 메모리 공간'이기 때문에, 리터럴이라는 용어를 사용한다.

정수형

접두사

2진수: 0b (JDK 1.7부터 추가)

8진수: 0

16진수: 0x

접미사

int타입: 접미사 없음

long타입: 접미사 'l' or 'L'

JDK 1.7부터 정수형 리터럴 중간에 구분자 '_'을 넣을 수 있게 되었다.

실수형

접미사

float타입: f

double타입: d (기본형으로 생략 가능)

float pi = 3.14; // 리터럴 3.14는 d가 생략된 double타입 리터럴이므로 에러.

문자와 문자열 리터럴

문자 리터럴
  • 'A'와 같이 문자 하나를 감싼 것.
  • 단 하나의 문자만 저장 가능.
  • '' 안에 반드시 하나의 문자가 있어야 함.

문자열 리터럴

  • String 클래스 사용, 객체지만 특별하게 변수 타입처럼 선언 가능.
  • ""안에 아무런 문자도 넣지 않는 것 허용
  • 덧셈 연산자(+)는 피연산자 중 한쪽이 String이면 나머지 한쪽을 먼저 String으로 변환 후 두 String을 결합한다.
  • (EX. 7 + 7 + "7" = "147", 7+"7"+7+7 = "7777")
728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (2)  (0) 2021.07.29
연산자 (1)  (0) 2021.07.11
형변환  (0) 2021.06.24
기본형  (0) 2021.06.24
JAVA란?  (0) 2021.06.17

JAVA

자바란

썬 마이크로 시스템즈에서 개발하여 1996년 01월 공식 발표. (이후 오라클이 인수)

모바일(J2ME), 대규모 기업환경(J2EE), XML 등을 지원.

자바의 특징

  1. 운영체제에 독립적.
    • 자바는 JVM에 종속적이고, JVM은 운영체제에 종속적이다.
    • 따라서 자바는 서로 다른 운영체제에 종속적인 JVM만 있으면 실행 가능하다.
  2. 객체지향 언어.
    • 상속, 캡슐화, 다형성
  3. 자동 메모리 관리 (Garbage Collection)
    • 주기적으로 사용하지 않는 메모리 반환
  4. 네트워크 분산처리 지원
    • 네트워크 프로그래밍 라이브러리(Java API) 지원
  5. 멀티쓰레드 지원
    • 시스템과 관계없이 멀티쓰레드 구현 가능.
    • 여러 쓰레드에 대한 스케쥴링은 자바 인터프리터가 담당.
  6. 동적 로딩(Dynamic Loading) 지원
    • 프로그램 시작시 모든 클래스를 로딩하는게 아니라 필요한 시점에 클래스를 로딩.
    • 따라서 일부 클래스가 변경되어도 전체 애플리케이션 컴파일을 하지 않아도 됨.

JVM(Java Virtual Machine)

자바를 실행하기 위한 가상 머신.

자바는 하드웨어 맞게 컴파일된 상태가 아니고, 실행시 해석(interpret)되므로 네이티브 프로그램에 비해 느리다.

최근 바이트코드(컴파일 된 자바코드)를 바로 기계어로 바꿔주는 JIT 컴파일러 등 최적화 기술이 적용되어 빨라짐.

JDK

JDK를 설치하면, JVM과 자바클래스 라이브러리(Java API) 외 개발에 필요한 프로그램들이 설치된다.

JDK의 bin을 path로 지정해주면 해당 path의 프로그램들을 경로 없이 사용할 수 있다.

JDK의 bin 디텍토리에 있는 주요실행파일

  • javac.exe - 자바코드를 바이트코드로 컴파일
  • java.exe - 바이트코드를 해석하고 실행
  • javap.exe - 바이트코드를 다시 자바코드로 디컴파일
  • javadoc.exe - 소스파일의 주석(/* */)을 이용하여 JAVA API문서와 같은 형식의 문서를 자동생성.
  • jar.exe - 압축프로그램. 클래스와 프로그램에 실행에 관련된 파일을 jar로 압축하거나 압축 해제.

|참고|

JDK = JRE + 개발에 필요한 실행파일(javac 등)

JRE = JVM + 클래스 라이브러리(Java API)

자바 공식 API문서

https://docs.oracle.com/javase/8/docs/api/index.html

https://docs.oracle.com/en/java/javase/11/docs/api/index.html

자바 문법

  • 자바 애플리케이션은 항상 main 메서드의 호출로 시작해서 main 메서드의 수행을 마치면 종료된다.
  • 하나의 Java 애플리케이션에는 반드시 하나의 main 메서드가 있어야 한다.
  • 작성된 Java 애플리케이션을 실행 할 때는 'java ${메인메서드를 포함한 클래스의 이름}'을 적어줘야 한다.
  • 하나의 소스파일에 하나의 클래스가 보통.
    • 하나의 소스파일에 둘 이상을 정의도 가능.
    • 소스파일의 이름은 public class와 같아야 함.
    • 만약 public class가 없다면 아무거나 다른 class의 명.
  • 클래스파일(*.class)는 클래스별로 하나씩 만들어지므로 여러 클래스를 가진 자바 코드 하나를 컴파일 했을 때 여러개의 class 파일이 생성될 수 있음.

자바 실행과정

  1. 프로그램의 실행에 필요한 클래스(*.class)를 로드한다.
  2. 클래스파일을 검사한다. (파일형식, 악성코드 체크)
  3. 지정된 클래스에서 main(String[] args)를 호출한다.
  4. main메서드가 종료되면 자원을 모두 반환한다.

 

참고

그림

728x90
반응형

'Language > JAVA' 카테고리의 다른 글

연산자 (2)  (0) 2021.07.29
연산자 (1)  (0) 2021.07.11
형변환  (0) 2021.06.24
기본형  (0) 2021.06.24
변수  (0) 2021.06.21

+ Recent posts