날아라쩡글이의 블로그입니다.
연산자 02 본문
비교연산자
비교연산자는 두개의 값을 비교하되 자동으로 크고 작은걸 선택하는 것이 아니라 우리가
"왼쪽의 값이 오른쪽의 값보다 크니?"와 같이
예 혹은 아니로 즉 true/false라는 결과값으로 나올수 있게 연산자를 적어주게 된다.
비교연산자에는 ' > >= < <= == != ' 라는 6가지 연산자가 존재한다.
단, 다른 연산자도 마찬가지이지만 여러 기호로 이뤄진 연산자의 경우, 가운데에 공백을 넣으면 에러가 발생한다.
public class Ex06Operator3 {
public static void main(String[]args) {
//int 변수 number1과 number2를 선언하고 각각 5와 4로 초기화한다.
int number1 = 5;
int number2 = 4;
//1.>
//비교는 비교값 주위로 ()를 쳐줘야한다.
System.out.println("1. > , < ");
System.out.println("number1> number2:"+(number1 > number2));
System.out.println("number1>10:"+(number1 > 10));
System.out.println("number1>5:"+(number1 > 5));//무조건 커야만 true
//2.>= , <=
System.out.println("2. >= , <=");
System.out.println("number1<= number2:"+(number1 <= number2));
System.out.println("number1<= 10:" + (number1 <= 10));
System.out.println("number1<=5:"+(number1 <= 5));//같음이 들어가서 true 값이 나옴
//3. ==, !=
System.out.println("3.==, !=");
System.out.println("number1 == 4 : "+ (number1 == 4));//달라서 false
System.out.println("number1 == 5 : "+ (number1 == 5));
System.out.println("number1 != 4 : "+ (number1 != 4));//달라서 true
System.out.println("number1 != 5 : "+ (number1 != 5));
//단, 참조형 데이터타입의 값들이 같은지 혹은 다른지를 비교할 때에는 비교연산자를 사용하면 안된다. !!
System.out.println();
System.out.println("--------------");
System.out.println("참조형 데이터타입의 비교");
System.out.println("--------------");
//String 데이터 타입 변수 3개를 만들고 모든 변수를 "abc"로 초기화하되 초기화 하는 방법을 다르게 해보자
String str1 = "abc";
String str2 = new String("abc");
String str3 = str1;//str 1, str2 ,str3의 값을 출력해보자
System.out.println("str1: ["+str1+"]");
System.out.println("Str2: ["+str2+"]");
System.out.println("Str3: ["+str3+"]");
//str1, str2 , str3 을 비교연산자로 사용하여 같은 값을 가지고 있는지 확인해보자
System.out.println();
System.out.println("비교연산자를 통한 비교");
System.out.println("str1==str2: "+(str1 == str2));
System.out.println("str1==str3: "+(str1 == str3));
System.out.println("str3==str2: "+(str3 == str2));
System.out.println();
참조형 데이터타입의 경우 참조를 하는 값 : 메모리가 특정으로 존재한다. //메모리값은 heap영역에 저장한다.
비교연산자는 stack 영역에 저장되어있는 값을 기준으로 하여 비교를 한다.
만약 기본형 데이터타입의 값들을 비교할 때에는 해당 stack 영역에 실제 값들이 2진법으로 변환되서
저장되어있기 때문에 비교연산자가 정상적으로 비교할 수 있다.
하지만 참조형 데이터타입은 stack영역에 실제 값이 아니라 실제 값이 저장되어 있는 heap영역 공간의 주소값만 가지고 있다.
따라서 우리가 참조형 데이터타입의 값을 비교하겠다 라는 것은 stack영역의 주소값이 아니라,heap영역에 저장된
실제 값을 기준으로 비교를 하겠다는 의미가 되지만, 비교연산자는 heap영역으로 접근을 절대로 하지않기때문에 위의 str1,str2,str3비교에서처럼
참조형 데이터타입의 값 비교가 부정확한 결과가 나오게 되는 것이다.
따라서, 참조형 데이터타입의 실제 값 비교를 할 때에는 비교연산자를 사용하는 것이 아니라,
메소드를 통하여 비교를 해야한다 !!!
2개의 참조형 데이터타입 공강의 실제 값이 같은지를 비교할 때에는 equals()라는 메소드를 통하여 비교하게된다.
자바의 경우 자바는 가상의 컴퓨터를 만들어서 사용하기 때문에 JVM을 이용하여 작성하도록 있기 때문에 heap에 참조값을 저장하여 stack이 불러올 수 있도록 만든다.
equals()메소드의 사용방법은 다음과 같다. 변수.equals( 비교대상)
단, 변수 뿐만이 아니라 상수나 ""로 둘러쌓인 String 값도 equals()를 실행시킬 수 있다.//다른참조형데이터도 가능
System.out.println();
System.out.println("equals()메소드를 이용한 비교");
System.out.println("str1.equals(str2): "+(str1.equals(str2)));
System.out.println("str1.equals(str3): "+(str1.equals(str3)));
System.out.println("str2.equals(str3): "+(str2.equals(str3)));
}
}
논리 연산자
논리 연산자는 boolean데이터 타입의 값에 대한 연산을 한다.
AND 연산자 OR연산자 NOT연산자까지 3개가 있다.
AND : && 으로 표시하고 왼쪽과 오른쪽 의 값이 모두 true 일때에만 true가 나온다
OR : ||으로 표시하고 왼쪽이나 오른쪽의 값 중 하나라도 true 이면 true가 나온다 //shift+역슬러쉬 함께 누르면 ||가됨
NOT : !으로 표시하고 true는 false로 , false는 true로 연산한다.
public class Ex07Operator4 {
public static void main(String[]args) {
System.out.println("-----------------");
System.out.println("1.AND 연산자 ");
System.out.println("true && true : "+(true&&true));
System.out.println("true && false : "+(true&&false));
System.out.println("false && true : "+(false&&true));//어차피 false가 나올것이기 때문에 힌트를 줌
System.out.println("false && false : "+(false&&false));
System.out.println("-----------------");
System.out.println();
System.out.println("-----------------");
System.out.println("2.OR 연산자 ");
System.out.println("true || true : "+(true||true));//어차피 ture가 나올 것이기 때문에 힌트를 줌
System.out.println("true || false : "+(true||false));
System.out.println("false || true : "+(false||true));
System.out.println("false || false : "+(false||false));
System.out.println("-----------------");
System.out.println();
System.out.println("-----------------");
System.out.println("3.NOT 연산자 ");
boolean a = true;//실제값은 변경하지 않는다.
System.out.println(" boolean 변수 a의 현재값:" +a );
System.out.println("!a : "+!a);//a 의 값을 변경해준 것은 아님
System.out.println(" boolean 변수 a의 현재값:" +a );
System.out.println("-----------------");
System.out.println();
System.out.println("myNumber가 0부터 10사이의 숫자인지 체크하기");
// int 변수 myNumber에 현재 저장된 값이 0~10사이의 값인지 체크하는 코드
//우리가 현실 세계에서는 위의 범위 체크하는 식은
// 0 <= myNumber <=10 으로 써줄 수 있지만 프로그래밍에서는 불가능하다.!
//프로그래밍은 실행되는 코드의 우선순위라는 것이 존재하기 때문에 위의 0<=myNumber<=10은 한번에 실행되는 것이 아니라
//2단계로 나뉘어서 실행이 된다.
//먼저 실행되는 것은 0<=myNumber이다.
//myNumber의 현재 저장되어있는 값에 따라 true 혹은 false의 값이 나오게 된다.
//그 다음에 실행되는 것은 해당 결과값이 10보다 작거나 같은지를 실행하게 되는데
//true가 10보다 작거나 같습니까? - >???????????
//false가 10보다 작거나 같습니까? - >??????????
//true가 나오건 false가 나오건 int값과의 비교는 불가능하다.
//따라서 우리는 범위를 체크할 때에는
//1.myNumber가 0보다 크거나 같다.
//2.myNumber가 10보다 작거나 같다.
//가 모두 true 가 나오면 true,그 외에는 false가 나오게 코드를 작성해야한다.
//int 변수 myNumber 선언하고 3으로 초기화
int myNumber = 3;
System.out.println("number가 3일때: "+(0<=myNumber && myNumber <=10));
myNumber = -4;
System.out.println("number가 -4일때: "+(0<=myNumber && myNumber <=10));
myNumber = 123;
System.out.println("number가 123일때: "+(0<=myNumber && myNumber <=10));
System.out.println("--------------------");
System.out.println();
//myNumber가 0~100사이의 숫자가 아니면 true 맞으면 false가 나오게 체크해보자 !
//이렇게 특정 범위에 안속하는지 체크할 때에는 2가지 방법으로 체크가 가능하다.
//1.OR연산자를 사용하여 내가 원하는 (지금은 -1이하거나 101이상이거나)범위에 속하는지 체크하기
//2.NOT연산자를 사용하여 0~100에 속하는 지 체크하여 최종결과값을 반대로 바꿔주기
System.out.println("myNumber가 -5일때 ");
myNumber = -5;
System.out.println("1번방법 (myNumber <0 || myNumber> 100 : "+(myNumber<0||myNumber>100));
//둘중에 하나만 맞아도 true 니까 0보다 작거나 또는 100보다 크면
System.out.println("2번방법 (!(myNumber>=0&&myNumber<=100)):"+(!(myNumber>=0&&myNumber<=100)));
//0~100사이의 myNumber이 NOT이라면 true의 값이 출력되도록 입력 됨. not이 반대로 출력되게 만들음
}
}
'java (학원 전) story' 카테고리의 다른 글
Scanner (0) | 2021.08.04 |
---|---|
자바콘솔에서 출력하는 방법, 이스케이프 문자 (0) | 2021.08.04 |
java class이름 변경시 (Tip) (0) | 2021.08.03 |
연산자 (0) | 2021.08.03 |
형변환 (0) | 2021.08.03 |