[Java] 자바의 기본 문법(2)

INO·2022년 3월 18일
0
post-thumbnail

기본적인 계산

산술 연산

+ : 더하기 
- : 빼기
* : 곱하기
/ : 나누기
% : 나머지

자바는 위의 산술 연산자를 사용합니다.

우선순위

  1. ()로 감싼 식
  2. * / %
  3. + -

부동소수점수를 다루는 산술 연산의 주의점

자바에서 실수를 표시할 떄 double이나 float를 사용하는데 위는 부동소수점을 사용하기 때문에 실수를 계산할 때 오차가 발생해 의도하지 않은 값이 나오는 경우가 있습니다.

오차가 발생하는 경우는 자바 코드의 10진수를 2진수로 변경하기 때문에 부동소수점에서 발생하는 오류입니다.

정확한 수치를 요구하는 경우에는 BigDecimal 클래스를 사용합니다.

BigDecimal 클래스

BigDecimal 생성자에 문자열로 된 수치를 전달하면 BigDecimal 인스턴스가 생성됩니다.

BigDecimal value = new BigDecimal("0.7");
  • add : 더하기(+)
  • subtract : 빼기(-)
  • multiply : 곱하기(*)
  • divide : 나누기(/)
  • remainder : 나머지(%)

BigDecimald로 나눗셈으로 나눌 때 나누어 떨어지지 않는 숫자를 넣을 경우 java.lang.ArithmeticException이 발생하게 됩니다.
그래서 나누기를 할 때

  • 계산할 소수점의 자리수
  • 끝수를 버릴 것인가 올릴 것인가
    를 파라미터로 넣어주어야 합니다.
value.divide(value2, 0, RoundingMode.DOWN); // 소수점 미만을 내림 
  • RoundingMode 상수는 수치를 계산할 때 많이 사용됩니다.
    - HALF_UP : 반올림
    • UP : 0에서 멀어지도록 올림 (-5.5의 경우 -6)
    • DOWN : 0D에서 가까워지도록 올림(-5.5의 경우 -5)
    • CEILING : 양의 무한대에 근접하도록 올림(-5.5의 경우 -5)
    • FLOOR : 음의 무한대에 가깝도록 올림(-5.5의 경우 -6)
  • 자바에는 산술 연산을 지원하는 패키지는 java.lang.Math와 java.lang.StrictMath가 있습니다. 이론상으로는 Math클래스가 더 빠릅니다.

자료형

자바는 기본 자료형과, 참조형으로 구분되어 있습니다.

  • 기본 자료형은 데이터를 갖습니다.
  • 참조형은 인스턴스의 메모리 주소를 갖습니다.

기본 자료형

기본 자료형은 값을 직접 가진 자료형으로, 값을 변경하면 데이터의 내용이 직접 치환됩니다.

  • byte
  • short
  • int
  • long
  • float
  • double
  • char
  • boolean

기본 자료형은 자료형의 범위를 넘어서면 오류가 발생하지 않습니다. 양수라면 음수로, 음수라면 양수로 자동 변환해버립니다.

Integer와 long

자바8 이후 int와 long은 부호가 없는 값을 갖을 수 있게 되었습니다. 부호가 없다는 것은 음수를 갖지 않는다는 의미로 음수에 할당하는 값을 양수에 사용할 수 있게 되면서 다룰 수 있는 범위가 더 넓어졌습니다.

부호가 없는 기능을 사용하기 위해서는 Integer와 Long 클래스의 toUnsignedString() 메서드를 사용해야 부호가 없는 값을 가져오거나 사용할 수 있습니다.

Integer.toUnsignedString(i);
Long.toUnsingedString(i);

참조형

인스턴스가 위치한 메모리 영역(힙 영역)의 주소를 가지는 자료형입니다.

스택영역과 힙 영역

  • 스택 영역 : 기본 자료형으로 선언된 변수가 선언되며 설정할 크기가 정해져 있으므로 스택 영역에 저장됩니다.
  • 힙 영역 : 참조형은 메모리 영역에 얼마나 할당할지 모르기 때문에 참조 주소를 저장할 수 있는 크기만을 확보해두고 인스턴스화 했을 때 그 값은 메모리 영역의 힙 영역에 저장합니다.

String도 참조형 중 하나이지만 new String()이 아닌 ""로 감싼 경우는 같은 참조 주소를 갖게 됩니다.

  • String은 ""를 사용하면 값이 이미 존재하는지 확인하고 값이 존재하먄 그 인스턴스의 참조 주소를 반환하도록 내부에서 처리합니다.

인스턴스

클래스를 기반으로 생성된(new) 객체를 인스턴스라고 하며 참조형 데이터가 됩니다. new 연산자를 사용하여 인스턴스를 생성합니다.

Date today = new Date();

래퍼 클래스

참조형 값만 받는다고 정의되어 있으면 기본 자료형을 이용할 수 없는 경우도 있습니다. 기본 자료형을 이용할 수 없는 경우가 있습니다. 이때 기본자료형을 참조 자료형으로 바꿔야 하기 떄문에 래퍼 클래스를 사용합니다.

  • Byte
  • Short
  • Integer
  • Long
  • Float
  • Double
  • Character
  • Boolean

기본 자료형과 래퍼클래스의 변환은 자동으로 이루어집니다. 초기값을 설정하지 않으면 null이 된다는 것을 주의하면 됩니다.

상수

final이 붙게 되면 값을 다시 대입할 수 없는 상수가 되게 됩니다.

  • 단 참조형 변수는 메모리 주소가 바뀌는 것을 막기 떄문에 인ㅅ므턴스의 값이 바뀌는 것을 금지하지 않습니다.

비교연산

산술 비교

  • ==
  • !=
  • >
  • >=
  • <
  • <=

참조형 비교

참조형 비교는 산술 비교와는 달리 메모리 주소를 비교하기 때문에 equalse()와 compareTo를 사용해야 합니다.

new Integer("1").equals(new Integer("1"));
new Integer("1").compareTo(new Integer("1"));

compareTo는 같으면 0, 작으면 -1, 크면 1을 반환한다.

문자열 비교

String은 참조형이지만 == 연산자를 이용해도 true가 나옵니다. 왜냐하면 ""로 감싼 문자열은 내부에서 관리해 이미 정의된 문자열이 있을 경우 그 문자열의 주소를 지정하도록 제어하기 떄문입니다.

하지만 new String()으로 만들게 되면 false이기 때문에 문자열 비교시에는 ==가 아닌 eqauls()를 사용하면 됩니다.

자료형 비교

해당 데이터가 지정한 자료형인지 확인할 때 instanceof를 사용합니다.

instanceof는 아래의 경우에 해당할 경우 true를 반환합니다.

  • 지정한 클래스
  • 지정한 클래스를 상속한 클래스
  • 지정한 인터페이스를 구현한 클래스
String value = "Hello";
value.instanceof String;

논리 연산

논리 연산은 2개의 boolean 값을 결합해 true 혹은 false로 반환하는 연산입니다.

  • AND - &&
  • OR - ||
  • NOT - !
profile
🎢

0개의 댓글