12. 자바 기초(5)
자바의 기초 언어를 공부하자.
12. 자바 기초(5)
java 패키지(package)
클래스를 분류하는 문법 → 폴더로 구현
- 패키지 명 : 조직명 제품명.역할명
- 조직명 = domain name 사용
- 정렬하기 편하게 거꾸로 사용
- ex. com.microsoft, com.oracle, com.bitcamp …
- 폴더로 만들기 쉽다.
마크 다운(markdown) 링크
HTML 태그 보다 더 간결한 방식으로 문서의 형식을 지정하기 위해 만든 포맷
ex. .md
1
2
3
# = 제목1
## = 제목2
내용
ex. .html
1
2
3
4
5
6
7
<html>
<body>
<h1></h1>
<h2></h2>
<p></p>
</body>
</html>
리팩토링?
요구사항 → 코드 작성 → 요구사항 만족 → 코드 정리(리팩토링)
연산자
1. 산술 연산자 : +, - *, /, %
- 값을 계산하는데 사용
- +(덧셈), -(뺄셈), *(곱셈), /(나눗셈_몫), %(나눗셈_나머지)
2. 증감 연산자 : ++, –
- a++, ++a, a–, –a 식으로 사용하며 1씩 +, -한다.
1
2
3
4
5
int a = 0;
a1 = a++; //a를 a1에 먼저 담고, ++계산하여 a 증가 => a1 = 0, a = 1
a2 = ++a; //++ 계산하여 a2에 담음 => a2 = 2, a = 2
a3 = a--; //a를 a3에 먼저 담고, --계산하여 a 감소 => a3 = 2, a = 1
a4 = --a; //-- 계산하여 a4에 담음 => a4 = 0, a = 0
3. 관계 연산자 : <, <=, >, >=, instance of
- 값을 비교할 때 사용. (4. 등가 연산자와 같이해서 비교연산자로 정리됨)
- instanceof는 해당 객체가 지정한 클래스나 인터페이스의 인스턴스인지 여부를 확인함.
ex.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
Class Animal{ - } Class Dog extends Animal{ - } Class Main{ public static void main(String args[]){ Animal animal = new Animal(); Dog dog = new Dog(); if (animal instanceof Animal) { true } if (dog instanceof Dog) { true } // dog가 Animal의 인스턴스인지 확인 (상속 관계) if (dog instanceof Animal) { true } // animal이 Dog의 인스턴스인지 확인 (false) if (animal instanceof Dog) { false } } } }
4. 등가 연산자 : ==, !=
- 관계 연산자 + 등가 연산자 = 비교연산자
5. 논리 연산자 : &&, ||, !, &, |
- 논리값(boolean) 타입에 대해 수행하는 연산자
- & : boolean 값에서 두 개의 논리 값이 모두 true라면 true 반환함
- | : boolean 값에서 두 개의 값 중 하나라도 true라면 true 반환함
- || 과 |, &&과 &의 차이?
a || b, a && b → a에서 결과가 확정 되면 뒷라인을 수행하지않는다.
a | b, a & b → a에서 결과가 확정되어도 뒷라인을 수행한다.
1 2 3 4 5 6 7 8 9 10
boolean a = false; boolean b = false; boolean r = a && (b = true); // r은 false이지만 b = true의 내용을 수행하기에 이후 b = true의 값을 가진다. // a = false, b = true, r = false boolean c = b || (a = true); // b가 true라 r도 true, 여기서 a = true의 내용도 수행하기 때문에 a = true로 변경된다. // a = true, b = true, c = true
- || 과 |, &&과 &의 차이?
6. 비트 연산자 : &, |, ^, ~
- 정수(Integer) 타입에 대해 수행하는 연산자
- 비트 값을 비교하여 수행하는 연산자이다.
ex. int a = 0b0110_1100; int b = 0b0101_0101;
- int는 8바이트 a = 0000~6byte 0110 1100 b = 0000~6byte 0101 0101
- 위 값을 비트 자리를 비교하여 계산한다.
- & = 0000~6vyte 0100 0100 : & 는 두 비트 모두 1일 때 1, 그렇지 않으면 0을 반환 (1, 1 = 1 / 1, 0 = 0 / 0, 0 = 0)
- | = 0000~6byte 0111 1101 : | 는 두 비트 중 하나라도 1이면 1, 그렇지 않으면 0을 반환 (1, 1 = 1 / 1, 0 = 1 / 0, 0 = 0)
- ^ = 0000~6byte 0011 1001 : ^ 는 두 비트가 다를 때 1, 같으면 0을 반환 (1, 1 = 0 / 1, 0 = 1 / 0, 0 = 1)
- ~ = 0110 1100 → 1001 0011 : ~는 두 비트를 반전 시킨다 (0 → 1, 1 → 0)
- 비트 연산자는 파일 권한 등 간단한 권한 등 비교하는 부분에 쓰이면 빠르고 적은 메모리로 응용이 가능하다. (ex05 > 0450 ~0481로 확인해보자)
7. 비트 이동 연산자 : <<, >>, >>>
- 비트를 밀어 계산하는 연산자.
<< : 왼쪽으로 밀어 계산한다. 한칸이 밀릴 때 2의 제곱으로 계산이 된다.
양수, 음수 상관없이 그냥 왼쪽으로 밀기 때문에 음수가 양수가 되는 일도 있어난다1 2 3 4 5 6 7
int i = 1; // [0000 0000 0000 0000 0000 0000 0000 0001] System.out.println(i << 1); // i << 2, i << 3 // 0[000 0000 0000 0000 0000 0000 0000 0001-] = 2 -> - 자리에 0이 채워짐 // 00[00 0000 0000 0000 0000 0000 0000 0001--] = 4 // 000[0 0000 0000 0000 0000 0000 0000 0001---] = 8 // 1[000 0000 0000 0000 0000 0000 0000 0001-] = -1이었지만 2가됨
>>과 >>>은 오른쪽으로 밀어 계산한다. 한칸이 밀릴 때마다 나누기 2의 제곱으로 계산이 된다.
>>은 양수는 0으로 채우고 음수는 1로 채우는 반면, »>은 양수, 음수 상관없이 0으로 채운다.1 2 3 4 5 6 7 8 9 10 11 12 13 14
int i = 105; // [00000000000000000000000001101001] System.out.println(i >> 1); // i >> 2, i >> 3 // [ 000000000000000000000000110100]1 = 52 -> 105 / 2 // [ 000000000000000000000000011010]01 = 26 -> 105 / 4 // [ 00000000000000000000000001101]001 = 13 -> 105 / 8 int i = -87; // [11111111111111111111111110101001] System.out.println(i >> 1); // [ 1111111111111111111111111010100]1 // [11111111111111111111111111010100]1 = -44 : 음수이기 때문에 공백을 1로 채워 계산 System.out.println(i >>> 1); // [01111111111111111111111111010100]1 = 2147483604: 음수 상관없이 공백을 1로 채워 계산
8. 대입 연사자 : =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=, >>>=
계산 후 값을 넣는 연산자.
1 2 3 4 5 6 7
int a = 4; a += 1; // = 5 a -= 1; // = 4 a *= 2; // = 8 a /= 2; // = 4 a %= 3; // = 1 ...
9. 삼항 연산자 : 조건 ? 값1 : 값2
- 조건에 따라서 값을 전달받는 연산자.
값을 되돌려주기에 반드시 담을 변수가 있어야하며 값을 되돌려주지않는 실행하는 명령어는 값에 들어갈 수 없다.
1 2
조건 ? System.out.println("true"); : System.out.println("false"); // 이런 식으로 사용하는 건 불가능하다는 얘기, println은 내부를 살펴봤을 때 값을 반환하지 않는 메서드이다.
statement vs Expression
1 2 3 4 5 6 7 8 9
// 모든 명령문은 statement System.out.println("Hello"); int v = 100; m1(); <- Expression m2(); <- Expression if( - ){ - } for( ; ; ) { - } void m1( ){ - } int m2( ){ - }
- Statement : 프로그래밍 언어에서 특정 작업을 수행하거나 명령을 실행하는 코드의 기본 단위이다.
- Expression : Statement 중 프로그래밍에서 값을 계산하는 코드의 조각. 해당 값은 다양한 데이터 타입을 가짐.
! 연산자 우선순위
- ( ~ )
- *, /, %
- +, -
- 우선순위가 같은 경우, 먼저 나온 연산자를 먼저 계산한다.
- ( ) 안에 있는 연산자는 가장 우선순위를 가짐
정수와 부동소수점의 계산
- 정수와 정수의 연산 = 정수
- 부동소수점과 부동소수점의 연산 = 부동소수점
- 부동소수점과 정수의 연산 = 부동소수점
형변환
암시적 형변환 : implicit type conversion(casting)
- 타입이 다를 시 컴파일러가 같은 타입으로 자동 변환하는 것
- (byte, char, short) → int → long → float → double로 자동 형변환이 이뤄짐
- 형변환할 때 기존 변수의 타입을 바꾸는 것이 아닌 임시 변수를 생성하는 것
계산 시 타입 참고
- byte + byte = int
- char + short = int
- java에서 byte, char, short는 계산 시 int로 바꿔 계산함. 당연히 결과는 int 타입으로 처리가 됨.
- 그래서 byte 타입을 가진 변수에는 집어넣지 못함. (byte)(a+b)를 하면 byte로 변환시켜 넣을 수 있다.
- int(21억 이상) + int(21억 이상) = 오버플로우
- 오버플로우가 되어 음수로 노출됨.
- 결과를 아무리 더 큰 단위인 long에 넣어도 결과값인 음수 int를 long에 대입하는 것 밖에 안됨.
- 처음부터 큰 크기를 쓰자.
- long(22억 이상) !오류
- 22억 이상의 값을 넣을 때면 반드시 리터럴을 추가해야함.
- 뒤에 L을 안 붙이면 자동으로 int로 이해 > int의 값을 넘어가버림으로 오류를 출력함
명시적 형변환 : explicit type conversion(casting)
- 개발자가 명시적으로 형변환을 하는 것
- ex. (byte)(int + int)
암시적 형변환 + 연산자 우선순위
1
3.2f + 5 / 2L = ?
- 우선 연산으로 5 / 2L 계산 → 암시적 형변환은 L을 따라감 = 2
- 다음 3.2f + 2 → 암시적 형변환으로 f를 따라감 = 5.2
- 즉, 우선 연산을 따라갈 때마다 암시적 형변환을 한다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.