Java 공부 (2)
Sparta Java handbook 학습으로, Java에 대한 기본 공부를 위한 필기입니다.
01. 연산자
- 연산자 : 연산을 수행하는 기호
- 피연산자 : 연산자의 연산 수행 대상
모든 연산자는 연산 결과를 반환합니다.
- 산술 연산자 : + - * / % « » : 사칙 연산과 나머지 연산(%)
- 비교 연산자 : < > >= <= == != : 크고 작음과 같고 다름을 비교
두 피연산자를 비교해서 true(참) 또는 false(거짓)을 반환 문자열 비교에는 == 대신 equals()를 사용해야 합니다. – equals : 비교하고자 하는 두 피연산자의 값 자체를 비교 – == : 비교하고자 하는 두 피연산자의 주소값을 비교
논리 연산자 : && ! & ^ ~ : AND, OR로 조건을 연결 - 대입 연산자 : = : 우변의 값을 좌변에 저장
- 기타 연산자 : (type) ? : instance of
조건 연산자 – 삼항 연산자 : 조건식 ? 반환값1 : 반환값2
- 순위 : 산술 > 비교 > 논리 > 대입 : 대입은 제일 마지막에 수행됩니다.
단항(1) > 이항(2) > 삼항(3) : 단항 연산자의 우선 순위가 제일 높습니다.
- 증감 연산자(++) : 피연산자의 값을 1 증가 시킵니다.
감소 연산자(–) : 피연산자의 값을 1 감소 시킵니다.
타입 설명 사용 예 전위형 값이 참조되기 전에 증가/감소 k = ++j; k=–j; 후위형 값이 참조되기 후에 증가/감소 k = j++; k=j–;
02. 형변환
- 형변환 : 변수 또는 상수의 타입을 변환하는 것을 의미합니다.
- int -> char (char)65 ->
A
- float -> int (int)1.6f -> 1
- 서로 다른 두 타입을 일치시키기 위해서 형변환을 하는데 형변환을 생략 하려면 컴파일러가 자동으로 형변환을 해줍니다.
표현 범위가 좁은 타입에서 넓은 타입으로 형변환 하는 경우 값 손실이 없기에 두 타입 중에서 표현 범위가 더 넓은 쪽으로 형변환됩니다. - 큰 타입을 작은 타입에 저장할 때 Eror 발생
int i = 3.14f
: Errorint i = (int)3.14f
03. Math 클래스
Math는 수학과 관련된 메서드를 가지고 있는 클래스입니다.
- round() : 실수를 소수 첫째 자리에서 반올림한 정수를 반환
- ceil() : 올림값을 double 형으로 반환
- floor() : 내림값을 double 형으로 반환
- abs() : int, double 기본형 모두 사용 가능, 절대값을 얻음
04. 2진수 음수표현
- 2진수 00000011 = 10진수 : 3
2진수 10000011 = 10진수 : -3
- 1의 보수 – 1의 보수는 11111111 - x 를 하는 방식 – 11111111 - x 는 x를 반전시킨 것과 같습니다.
1이면 0, 0이면 1이됩니다.
- 2의 보수 – 2의 보수는 100000000 -x를 하는 방식 – 가장 왼쪽 숫자가 0일 경우 양수, 1일 경우 음수를 표현합니다. – 1의 보수를 구한 뒤, 나온 수에 +1을 하면 됩니다.
-9를 2의 보수로 표현 00001001(9) -> 11110110 11110110 + 1 => 11110111
05. Java와 C언어의 차이점
- Java는 소스 파일을 하나만 작성하면 어디에서든지 사용 가능하고 C언어는 하나의 소스파일로 각 기계에 맞는 목적파일로 만들어 어디든 사용 가능합니다.
하나의 목적파일로 어디든 실행이 가능한가, 다수의 목적 파일을 만들어서 각 기계에 맞게 사용하냐의 차이점
Java는 반기계어인 바이트코드(.class)로 이는 OS가 아니라 JVM에서 사용됩니다.
소스 코드를 바이트 코드로 컴파일 해주는 것이 자바 컴파일러(javac)입니다.
main 함수 작성
– Java로 작성된 프로그램을 실행할 때는 main 함수로 진입하고 작성된 소스의 작업을 모두 수행하면 main 함수가 종료됩니다.
–
System.out.println(출력값);
은 콘솔에 값을 출력하기 위한 Java 함수입니다.IntelliJ에서는
sout
라는 글자를 입력하면System.out.println();
을 자동으로 작성해줍니다.
06. String과 new String()의 차이점
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Hello {
public static void main(String[] args) {
String msg1 = "Hello";
String msg2 = "Hello";
String msg3 = new String("Hello");
String msg4 = new String("Hello");
String msg5 = new String("Hello").intern();
System.out.println(msg1==msg2); //true
System.out.println(msg3==msg4); //false
System.out.println(msg1==msg3); //false
System.out.println(msg1==msg5); //true
System.out.println(msg1.equals(msg3)); //true
}
}
- Java에서 문자열은 String Pool로 관리됩니다. “Hello”라는 두 개의 문자열 변수를 지정했지만 JVM Heap 메모리의 String Pool에는 “Hello”라는 문자열 하나만 존재합니다. 두 변수(msg1, msg2)는 reference로 가르키게 됩니다.
- new 키워드는 Heap에 객체를 생성하게 됩니다.
- intern() 메서드를 이용하면 String pool에 등록할 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Hello {
public static void main(String[] args) {
String msg1 = "Hello";
String msg2 = "Hello";
String msg3 = new String("Hello");
String msg4 = new String("Hello");
String msg5 = new String("Hello").intern();
System.out.println(System.identityHashCode(msg1==msg2)); //1096979270
System.out.println(System.identityHashCode(msg3==msg4)); //1078694789
System.out.println(System.identityHashCode(msg1==msg3)); //1078694789
System.out.println(System.identityHashCode(msg1==msg5)); //1096979270
System.out.println(System.identityHashCode(msg1.equals(msg3))); //1096979270
}
}
- new로 생성한 객체의 경우는 HashCode 값이 다르지만 String Pool을 Reference 하는 경우는 같다는 것을 알 수 있습니다.