자바애플리케이션 vs 다른애플리케이션
- 자바애플리케이션은 아래서부터 순서대로 하드웨어,os,JVM,java애플리케이션의 순서인 반면 보통은 하드웨어,os,애플리케이션으로 쌓어져있다.
- 자바애플리케이션은 JVM이 설치되어있는 곳에서만 실행가능하다
- java 애플리케이션이 os에 바로붙어있지 않기때문에 자바애플리케이션은 os에 종속적이지 않다.
하지만 jvm은 os에 바로 붙어있기때문에 os에 종속적이다.
- 단점) 하드웨어에 맞게 완전히 컴파일된 상태가 아니라 실행시에 해석돼서 속도가 느리다
- 자바에서 모든 코드는 클래스안에 정의되어야한다.
- 하나의
.java
파일안에 여러 클래스를 정의할 순 있지만 소스파일의 이름은 반드시 public class의 이름과 일치해야한다. 만약 public class가 없다면 있는 class들중 아무거나로 해도 된다
실행과정
.java
라는 소스파일을 자바컴파일러로 컴파일하면 바이트코드
를 얻어낸다. 그리고 바이트코드를 java.exe
즉, 인터프리터로 해석하고 실행시킨다
변수
값을 저장할수있는 메모리상의 공간
선언과 초기화
선언
: 변수타입만큼의 저장공간이 확보되고, 변수이름을 통해 이 공간을 사용할 수 있게 된다
초기화
: 사용하기전에 값을 초기화하는것
자료형
- 자료형은 기본형(소문자로시작하는타입)과 참조형(대문자로시작하거나 내가 만든class)으로 나눌수있다.
상수
- 한번 값을 넣으면 변경할 수 없는 수
- 앞에 final을 붙인다
리터럴
- 'A', "안녕하세요" 와같은 문자/숫자 등의 상수를 의미함
- 상수는 리터럴에 의미있는 이름을 붙인것임
상수가 필요한 이유
- 20대신에 20이 무엇인지를 의미하는 상수를 선언한다면 더 의미가 명확해질것이다
타입의 불일치에도 대입이 가능한경우
- long을 int에 대입할 수 있다. 범위가 더 넓기때문이다
이처럼 범위가 더 넓은것 -> 좁은것으로는 대입이 가능하다
다른 타입 간 연산
char c1 = 'a';
char c2 = c1 +1;
char c3 = 'a' + 1;
- 두번째 줄 같은 경우는 char + int를 해서 int가 됐는데 char로 선언하고 변수는 int라 타입이 불일치하여 컴파일 에러가 발생하였다
- 세번째 줄은 리터럴간의 연산이다. 리터럴간의 연산은 컴파일시에 계산이 돼서 값이 저장이 된다. 그래서 'b'가 들어가게 된다
리터럴은 컴파일러때 미리 계산된다
- 86400을
60*60*24
로 풀어쓴다고해서 더 오래걸리지않는다. 왜냐하면 리터럴이여서 컴파일러시간에 계산되기때문이다.
- 또한 가독성측면에서 더 좋다
유니코드
char x = 'a';
char x = 65;
x는 a를 저장하는게 아니라 a라는 유니코드 즉 숫자를 저장한다
그래서 사실은 모든 데이터를 숫자로 변환하여 저장하는 것이다
때문에 'a'말고 유니코드값을 직접 넣어줘도 된다
인코딩 디코딩
- 인코딩: 'a' -> 65
- 문자 -> 코드
- 디코딩: 65 -> 'a'
- 코드 -> 문자
정수 자료형 고르기
- 피연산자 스택이 4바이트 기준으로 저장해서 4바이트보다 작은 값 계산할때는 4바이트로 변환하여 수행함
그래서 int가 효율적임
- short나 byte는 성능보다 저장공간을 절약해야할때 사용해야함
그럼 long은?
실수형의 overflow
- 정수형의 경우 음수값이 나오지만 실수형의 경우 변수의 값이 무한대가 된다.
- underflow의 경우 변수의 값은 0이된다
double과 float
- double: double이 더 큰 범위를 갖는다
- float에 값을 저장하려면 실수리터럴 뒤에 f를 붙여야한다
float f1= 3.14;
float f2= 3.14f;
- double이 더 큰 범위를 갖기때문에 더 많은 수를 표현할 수 있다. 더 정확하다는 의미다.
flaot vs double
- 연산속도 향상, 메모리 절약 -> float
- 더 큰 범위, 더 높은 정밀도 -> double
float -> double 형변환
- 오차가 발생한다
- double을 구성하는 부호,지수,가수 부분이 있는데 여기서 가수부분만 0으로 채우기때문이다.
- 가수: 소수이하부분, 부호: +-, 지수: 2의지수
float와 double의 비교
- double을 float로 형변환해야한다
- 둘다 오차가있을수밖에없는데 그 오차가 다르게 나기때문이다.
실수
- 실수횽은 값을
부동소수점 수
로 저장한다
- 부동소수점 수: +-M * 2^E 같은 형태로 표현하는 것
- 22.3 을 이진수로 표현할때 .3은 2씩 곱해서 1이될때까지 반복하는데 이렇게 변환을하다보니 유한소수여도 이진수로 바꾸면 무한소수가 될때가있음. 이러다 보니 오차가 발생함.
- 애초에 실수는 무한대이기때문에 어느정도의 반올림같은것들을 넣음 그러다 보니 오차가 발생함
자동 형변환
float s = 1234;
int i= 3;
double a = 1.0 + i;
- 이게 가능한이유는 1234 앞에 (float)가 생략되었고
자동으로 형변환이 되었기때문이다
- 연산시 더 넓은 자료형으로 자동 형변환이 되기도 한다
- int보다 작은연산자들끼리의 덧셈은 int로 자동형변환된다
- char + short -> int + int -> int 가된다
- char + char -> int + int -> int
- char + int -> int + int -> int
- 비교연산자의 경우에도 이항연산자여서 위와 같은 형변환이 일어난다
c1++
char c1 = 'a';
c1++;
System.out.println(c1);
printf
- println: 값 변환없이 그대로 출력 다른 형식으로 출력못함
- printf를 통해 소수점 둘째짜리 출력 등을 할 수 있다
word
- word: CPU가 한번에 처리할 수 있는 데이터의 크기
비트 연산자
- 피연산자를 비트단위로 논리연산
- 피연산자를 이진수로 표현했을때의 각자리에 대해 연산을 수행한다
16진수 한자리씩 뽑기
0xABCD 에다가 0xF
를 AND
연산한다
1010 1011 1100 1101
0000 0000 0000 1111
-> 1101 만 남아서 0xD
를 얻을 수 있다
복합대입연산자
i *= 10 + j
i = i* (10+j);
출처
https://devlog-wjdrbs96.tistory.com/254