String의 비교
“1234” VS “987”
위의 둘을 비교하면 “987”이 크다 어제 정리한 것처럼 첫 글자부터 하나씩 비교하기 때문이다.
"1234"와 "987"을 비교한다면 첫글자인 1과 9를 비교한다는 뜻
그러나 숫자형이나 char처럼 변수에 넣어서 비교 연산자로 비교하면 에러가 난다.
위의 코드블록에서 s1과 s2는 기본 자료들과는 달리 조금 특별한 자료형이며(Stirng), 이 두 변수가 직접 문자를 저장하고 있지 않다.
문자들은 별도의 장소에 저장하고, 변수에는 그 문자들의 위치정보(주기억장치 내 위치)값을 저장한다.
그나마 사용 가능한 연산자는 ==, != 는 사용이 가능.
(즉, 같은지 다른지만 비교할 수 있다)
그래도 숫자형이나 char처럼 ~보다 크다 / 작다 라는 비교는 할 수 없다.
그래서 ==, != 연산이 에러없이 가능은 하지만 이도 사용을 하지 않습니다.
그래도 String 자료 간의 비교를 하고 싶다면 별도로 만들어져 있는 도구를 이용해야 한다.
string.compareTo();
string.equals();
AND 연산 - &&
좌항 우항 모두 true 일 때만 true이고, 나머지는 모두 false
즉, 좌항 우항 하나라도 false 이면 결과는 false
OR 연산 - ||
좌항과 우항 중 하나라도 true가 있다면 결과는 true
둘 다 모두 false 일 때 결과가 false가 된다
NOT 연산 - !
단항연산(피연산자 1개)
true / false 값을 현재 값의 반대로 변경하는 연산
입력받은 정수(점수)가 50이상이면서 100이하면 true, 그렇지 않으면 false
100 이상 이거나, 40 미만 true, 아니면 false
응용 1 : 짝수? 홀수?
응용 2 : 윤년 계산기 만들기
byte b1 = (byte)100;
원래 이렇게 써야 맞음b3의 값은 220이다 그런데 갑자기 음수가 출력된다
그 이유는 byte의 범위를 넘었기 때문에 (-128 ~ 127)
byte의 범위를 넘어서면 이렇게 출력된다.
위에 있는 숫자가 출력될 때는 아래에 있는 숫자로 출력됨
입력 : 127 128 129 130 131
출력 : 127 -128 -127 -126 -125
-128 ~127이 동그랗게 줄서있다고 생각해보자
범위 안의 수라면 자신의 자리에 들어가면 된다. 그런데 넘어간다면?
128은 자기 자리가 없다 127 다음의 자리에는 -128의 자리이다.
따라서 128은 출력될 때 -128로 출력되는 것이고,
위 블록의 경우 220은 자기 수만큼 빙빙 돌다가 멈춰보니 -36자리 였던 것
잘못된 예
String s1 = "1234";
int a4 = (int)s1; (X) ⇒ ERROR!!!
String 변수에 저장된 문자들이 사용되는 때는 다른 자료와 연산할 때이지만, 위의 코드처럼 혼자 연산될 때에는 문자들이 저장된 위치 정보가 사용된다.
따라서 위의 코드가 에러가 나는 것!
반대의 경우도 에러
int a5 = 123456;;
String str2 = (String)a5; (X) ⇒ ERROR!!!;
if문의 특징
명령이 하나만 있는 if명령은
if부터 한 개의 명령 뒤에 세미콜론까지가 하나의 문장으로 인식
그래서 세미콜론도 마지막에 한 번만 사용
명령이 여러개여서 중괄호가 사용되면 따로 if문자에 세미콜론은 사용하지 않고, 중괄호 안의 각 명령들에만 세미콜론을 붙인다.
else if
result = (year%4==0)&&(year%100!=0)||(year%400==0);
에서 뒤에 두 개를 안 묶어도 윤년의 조건을 만족하는가? 라는 의문이 생겼다.
아마 내가 여기서 글로된 조건을 논리연산으로 바꿀 때 조금 헷갈린 부분이 있었던 것 같다.
그래서 혼자 &&와 ||을 연속해서 써보고 출력해보고 또 다른 사람들의 정리된 글을 읽으면서 이해를 했다.
아마 차근차근 생각했으면 혼란스럽지 않았을 텐데 빠르게 나가는 수업을 들으면서 생각하려니 순간 헷갈렸던 듯
어쨌든 이 문제로 인해서 논리연산과 연산자들의 계산순서를 더 잘 이해하게 되었다.
내가 배운 것
||의 특징 때문이었다. 굳이 ( )로 묶을 필요가 없는 이유 ||는 앞이 true이면 ||연산자는 뒤의 항은 확인 하지 않는다. (값이 뭐든 true니까)
그래서 ||와 &&가 연속할 때 ||가 앞에 있는 뒤에있든 &&으로 묶인 단항이 true이면 true가 되어버림
즉, 위의 블록에서 굵은 글씨가 T인 이상(그리고 || 앞 뒤가 FF가 아닌 이상) 저 연산은 true가 되어버린다.
다시 정리하면
result = (year%4==0) && (year%100!=0)||(year%400==0);
(year%100!=0)||(year%400==0) 여기를 굳이 묶을 필요가 없다.
간단하게 A && B || C 로 표기 하면
A가 T 일 때 (2 가지로 나뉜다.)
B가 T 일 때 : 여기까지 이미 T라서 C는 볼 것도 없이 T
B가 F 일 때 : 여기가 F라도 C가 T라면 T
A가 T 일 때 ⇒ B,C가 둘 다 F일 때만 제외하고 전체는 T가 된다.
A가 F 일 때 &&연산에서 뒤까지 갈 것 없이 이미 F
결론 : B,C를 묶을 필요가 없음
연산의 우선순위 (같은 우선순위끼리는 앞에서 순서대로)
1. ( )
2. 변수의 앞에 사용되었다는 가정하에 ++, --
3. 곱셈 나눗셈 나머지(%)
4. 덧셈 뺄셈
5. 비교(관계)연산
6. 논리 연산
7. 대입 연산
비교가 논리보다 먼저 계산
total=pay+(int)(pay*r);
라는 코드가 반복이 된다.total=pay+(int)(pay*r);
를 total=+(int)(pay*r)+pay;
이렇게 쓰고 실행했을 때 이상한 값이 출력됬었다.