3주차 과제: 연산자
2020. 11. 22. 17:29ㆍ백기선의 온라인 자바 스터디
반응형
- 목표
- 자바가 제공하는 다양한 연산자를 학습하세요.
- 학습할 것
- 산술 연산자
- 비트 연산자
- 관계 연산자
- 논리 연산자
- instanceof
- assignment(=) operator
- 화살표(->) 연산자
- 3항 연산자
- 연산자 우선 순위
- (optional) Java 13. switch 연산자
● 산술 연산자
- 사칙 연산자(+, -, *, /), 나머지 연산자( % )는 두 개의 피연산자를 가지는 이항연산자이며 산술 연산자는 피 연산자의 크기가 4byte보다 작으면 4byte(int형)로 변환한 다음에 연산을 수행.
- 연산하기 전에 데이터형 일치시키기. (둘 중 더 큰 자료형으로)
- 정수와 정수 나눗셈시 정수로 나와야 하므로 소수는 버려지고 정수만 출력 된다.
- 사칙연산자(+,-,*,/)
- int형(4byte)보다 크기가 작은 자료형은 int형으로 형변환 한 후에 연산을 수행한다.
public static void main(String args[])
{
byte a = 10;
byte b = 20;
//byte c = a + b; 일경우 a, b 모두 int 형으로 변환 되어 연산 되기 때문에 에러 발생.
byte c = (byte)(a + b);
// 형변환을 통해 byte 데이터 타입으로 바꿔주고 계산해야 한다.
System.out.println(c);
}
- 두개의 피연산자 중 자료형의 표현범위가 큰 쪽에 맞춰서 형변환 뒤 후 연산을 수행한다.
public static void main(String args[])
{
int a = 1000000;
int b = 1000000;
long c = a*b;
System.out.println(c); //결과값은 -727379968.
//int형과 int형의 연산 결과는 int형이어야된다.
//int형으로 계산된 결과값이 long형으로 형변환 되어이상한값이 대입된다.
//a,b를 long타입으로 먼저 바꾼 뒤 연산해야 한다.
}
- 정수형간의 나눗셈에서 0으로 나누는 것은 금지되어 있다.
- 나눗셈 연산자( / )
- 왼쪽의 피 연산자를 오른쪽 피 연산자로 나누고 난 나머지 값을 돌려주는 연산자이다.
- 나머지 연산자는 주로 짝수, 홀수, 배수검사 등에 사용된다.
- 3 / 2 의 결과는 1.5 또는 2가 아니라 소수를 완전히 버린 1이 된다.
● 비트 연산자(이동 or 논리)
- 비트 연산자는 데이터를 비트 단위로 연산합니다. 0과1로 표현이 가능한 정수 타입만 비트 연산이 가능합니다.
- 비트 이동 연산자(쉬프트 연산자)
- 비트 이동 연산자는 정수 데이터의 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산을 합니다.
- 자바의 기본정수 타입은 반드시 부호(sign)가 있는 정수 값을 가짐.
- 부호는 제일 왼쪽 한 비트에 표시, 이 비트를 MSB(Most significant Bit : 최상위 비트), 양수 0, 음수 1
- 비트 단위 연산 수행, 기본 정수 타입인 byte, short, char, int, long에만 사용 할 수 있다.
- 비트 논리 연산자
- 정수형 기본형 데이터 타입의 각 비트를 개별적으로 조작.
- 양쪽 피연산자의 대응되는 각 두 값을 비트단위로 나열한 뒤 각 자리수를 비트별로 부울 연산을 함.
- 양쪽 피산잔자의 대상이 boolean타입일 경우에는 일반 논리 연산자로 활용.
- 각 자릿수의 연산은 독립적이며 다른 자릿수에 영향을 주지 않음.
- 참고) 10진수를 2진수로 변환시켜 테스트 해볼것! (integer 클래스 활용)
- int i = 127; String binaryString = Integer.toBinaryString(i); > 출력 : 1111111
● 관계 연산자
- 이항 연산자로 피연산자의 크기를 비교하는 연산자.
- 연산의 결과는 treu 또는 false.
- < , > , <= , >= : 두 피연산자의 크기를 비교.(boolean형의 값을 제외한 나머지 자료형 사용가능)
- ==, != : 두 피연산자의 값이 같은지 비교.
※ == 과 equals() 의 차이점!!!
- == 연산자는 비교하고자 하는 대상의 주소값을 비교.
- equals()메소드는 비교하고자 하는 대상의 내용 자체를 비교.
- Call By Value 형태는 일반적으로 int, double, float,char..과 같은 primitive type 임으로 주소값을 갖지 않음.
- Call By Reference 형태는 String,객체(new 연산자)와 같은 클래스 타입이기 때문에 주소값을 갖음.
- 이에 String(문자열) 같은 경우 ==연산자로 이용할때 값이 일치하지 않는 오류를 범할 수 있다.
- (A.equals(B) 사용)
● 논리 연산자
- 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다. (반복문에서도 사용)
- 결과가 true 또는 false로 반환된다.
● instanceof
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용.
- 주로 조건문에 사용, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치.
- 연산의 결과로 boolean값인 true, false 중의 하나를 반환.
- instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 뜻.
- 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다.
- 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용.
/**
* instanceof : 객체 타입을 확인하는데 사용한다. 속성은 이항연산자이고 형변환 가능여부를 가능하면 true 불가능하면 false로 리턴해준다.
* 주로 상속 관계에서 부모객체인지 자식객체인지 확인하는데 사용한다.
*/
public class InstanceofExam {
public static void main(String[] args) {
A a = new A();
B b = new B();
//객체 a는 자기 자신의 객체이기 때문에 형변환 가능.
System.out.println(a instanceof A); //true 출력
//객체 b는 A의 자식객체이기 때문에 A로 형변환 가능.
System.out.println(b instanceof A); //true 출력
//객체 a는 B의 부모객체이기때문에 형변환 불가능.
System.out.println(a instanceof B); //false 출력
//객체 b는 자기 자신의 객체이기때문에 형변환 가능.
System.out.println(b instanceof B); //true 출력
} // end of main
} // end of class
class A{
}
class B extends A{
}
//출처: https://zzdd1558.tistory.com/124 [윤들윤들]
● assignment(=) operator (대입 연산자)
- 대입 연산자는 변수에 값을 대입할때 사용하는 이항 연산자.
- 피연산자들의 결합 방향은 오른쪽에서 왼쪽.
- 자바에서는 대입 연산자와 다른 연산자를 결합하여 만든 다양한 복합 연산자 제공.
● 화살표 (->) 연산자
- = 람다 표현식. 메소드를 하나의 식으로 표현한 것.
- 단 하나의 객체만을 생성할 수 있는 클래스를 익명 클래스 라고 함.
- 자바에서 람다 표현식은 익명클래스와 같다고 할 수 있음.
- 람다 표현식은 메소드의 매개변수로 전달될 수도 있으며, 메소드의 결괏값으로도 반환될 수 있다.
- 기존의 불필요한 코드를 줄여주고, 작성된 코드의 가독성을 높여준다.
- JAVA SE 8부터 자바에서도 함수형 프로그래밍 가능.
- (매개변수목록) - > {함수 몸체}
- 매개변수의 타입을 추론할 수 있는 경우에는 타입을 생략할 수 있습니다.
- 매개변수가 하나인 경우에는 괄호(())를 생략할 수 있습니다.
- 함수의 몸체가 하나의 명령문만으로 이루어진 경우에는 중괄호({})를 생략할 수 있습니다. (이때 세미콜론(;)은 붙이지 않음)
- 함수의 몸체가 하나의 return 문으로만 이루어진 경우에는 중괄호({})를 생략할 수 없습니다.
- return 문 대신 표현식을 사용할 수 있으며, 이때 반환값은 표현식의 결괏값이 됩니다. (이때 세미콜론(;)은 붙이지 않음) - 직접 사용 해봐야 파악이 가능할것!!
● 3항 연산자
- if/else 문과 비슷하지만 심플한 분기문을 처리하는데 특화되어 있는 연산자.
- if/else로 처리했을때보다 라인수를 획기적으로 줄여줌. 가벼운 로직에서 자주 쓰인다.
- 다만, 삼항연산자를 사용하여 코드의 라인이 줄어들었다고 컴파일 속도가 빨라지는것은 아니다.
- 삼항연산자의 중복사용은 가독성이 떨어질 수 있으므로 가급적 피한다.(if/else 사용)
//IF ELSE
int a;
if(5<4) {
a = 50;
}else {
a = 40;
}
System.out.println(a); //결과 = 40
//삼항연산자
int b = (5 < 4) ? 50 : 40;
System.out.println(b); //결과 = 40
//출처 : https://coding-factory.tistory.com/266
● 연산자 우선순위
- 단항, 이항, 삼항 연산자 순으로 우선순위를 갖는다.
- 산술, 비교, 논리, 대입 연산자 순으로 우선순위를 갖는다.
- 단항과 대입 연산자를 제외한 모든 연산 방향은 왼쪽에서 오른쪽이다.(>>)
- 복잡한 연산식에는 () 괄호 사용해서 우선순위를 정해준다. (연산이 복잡해질때는 괄호를 사용하는것을 추천!)
- 연산자 우선순위가 같으면, 연산 방향에 따라 달라진다.
● Java 13. switch 연산자
- : 대신 - > 를 사용할 수 있다. ( ★꼭 한번 써보기!!)
static void howMany(int k) {
switch (k) {
case 1 -> System.out.println("one");
case 2 -> System.out.println("two");
default -> System.out.println("many");
}
}
public static void main(String[] args) {
howMany(1); //출력값 : one
howMany(2); //출력값 : two
howMany(3); //출력값 : many
}
- full through가 없기 때문에 break를 쓰지 않아도 된다.
- switch가 expression으로 사용될 수 있다.(?)
static void howMany(int k) {
System.out.println(
switch (k) {
case 1 -> "one"
case 2 -> "two"
default -> "many"
}
);
}
//즉, 다음과 같이 변수 할당을 할 수 있다.
T result = switch (arg) {
case L1 -> e1;
case L2 -> e2;
default -> e3;
};
- yield 키워드가 추가되었다. (일종의 return의 용도로 해석)
int j = switch (day) {
case MONDAY -> 0;
case TUESDAY -> 1;
default -> {
int k = day.toString().length();
int result = f(k);
yield result; // 일종의 return문 같은 느낌
}
};
//yield는 : 를 사용한 전통적인 switch 문에서도 쓸 수 있다.
int result = switch (s) {
case "Foo":
yield 1;
case "Bar":
yield 2;
default:
System.out.println("Neither Foo nor Bar, hmmm...");
yield 0;
};
*************************************************출처*****************************************************
coding-factory.tistory.com/521
www.tcpschool.com/java/java_lambda_concept
johngrib.github.io/wiki/jdk13/
*****참고 페이지******
10진수 -> 2진수
instanceof
mine-it-record.tistory.com/120
반응형
'백기선의 온라인 자바 스터디' 카테고리의 다른 글
6주차 과제: 상속 (0) | 2021.01.28 |
---|---|
5주차 과제: 클래스 (0) | 2020.12.22 |
4주차 과제: 제어문 (0) | 2020.12.12 |
2주차 과제: 자바 데이터 타입, 변수 그리고 배열. (0) | 2020.11.19 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2020.11.15 |