티스토리 뷰

 

자바 기본 타입

  • 정수 : int, long, short, byte
    대부분은 int 타입이 가장 알맞다. int 범위가 최대 20억 정도이므로 초과하는 범위에 대해서는 long을 사용한다. long 타입으로도 충분하지 않을 때 BigInteger을 사용한다.
  • 부동소수점 : float, double
    float 타입에는 접미어 F를 붙인다.(ex 3.14F) 3.14처럼 접이어 F를 붙이지 않으면 double 타입이 된다.
    double 타입에는 접미어 D를 붙인다.(ex 3.14D)
    무한대(Double.POSITIVE_INFINITY), 음의 무한대(Double.NEGATIVE_INFINITY)
    숫자가 아님을 검사할 때 Double.isNaN()을 사용한다.
    부동소수점 수가 무한대도 아니고 Nan도 아닌지 검사할 때 Double.isFinite()을 사용한다.
  • 문자 : char
  • boolean : 값은 true, false만 가능하며, 숫자 타입(0,1)과 무관하다.

 

수학 메서드

Math.min, Math.max, Math.pow, Math.sqrt, Math.PI, Math.E 와 같은 메서드들은 정적(static) 메서드이므로 객체(인스턴스)로 호출할 수 없다. Math 클래스에는 정수를 더 안전하게 계산하는 여러 메서드가 있다. 예를 들어 10억 * 3은 -1294967296으로 계산된다. int의 최댓값이 20억을 넘기기 때문이다. 반면 Math.multiplyExact(1000000000, 3)을 호출하면 틀린 결과가 아닌 예외를 잡아내거나 프로그램을 종료할 수 있다.

 

숫자 타입 변환

피연산자 중 하나가 double타입이면 다른 하나를 double로 변환한다.
피연산자 중 하나가 float타입이면 다른 하나를 float로 변환한다.
피연산자 중 하나가 long타입이면 다른 하나를 long로 변환한다.
이외에는 두 피연사자를 int로 변환한다.

예를 들어 3.14 + 42를 계산할 때는 두 번째 피연산자를 42.0으로 변환한 후 합계를 계산한다.

특히, 작은 타입에서 큰 타입으로 변환은 언제나 합법적이지만 반대로 큰 타입에서 작은 타입으로 변환할 때는 항상 주의해야 한다. 소수부가 버려지거나 마지막 바이트만 보존되는 경우가 생긴다. 주요 숫자 부분이 소리 없이 사라져 버릴까 염려된다면 캐스트 대신 Math.toIntExact 메서드를 사용하자. 이 메서드는 long을 int로 변환할 수 없을 때 예외를 발생한다.

 

논리 연산

&&(and), ||(or) 연산을 할 때 신경 써야 할 부분은 && 앞에 조건이 false이면 두 번째 조건을 평가하지 않는다. 마찬가지로 || 앞에 조건이 true이면 두 번째 조건을 평가하지 않는다는 것이다.

 

큰 숫자

int 나 double의 정밀도로 충분하지 않을 때 java.math 패키지의 BigInteger와 BigDecimal 클래스를 사용하면 된다.
BigInteger n = BigInteger.valueOf(879464894561511548L);
BigInteger k = new BigInteger("879464894561511548");

부동소수점 뺄셈에서 2.0 - 1.1의 결과가 0.899999999999999999999999로 나오는 이유는 10진수로 1/3을 정확히 표현할 수 없듯, 2진수로 1/10을 정확히 표현할 수 없기 때문이다. 이러한 경우에는 BigDecimal클래스로 정확히 계산할 수 있다. BigDecimal.valueOf(2,0).subtract(BigDecimal.valueOf(11,1)) 이 코드의 결과는 정확하게 0.9가 된다.

 

문자열

String 클래스는 불변 클래스이며 문자의 시퀀스(연속)이다. 자바에서는 유니코드 문자라면 무엇이든 문자열에 쓸 수 있다. String Builder 클래스를 이용하면 간단하고 효율적으로 문자열 연결이 가능하다.
substring 메서드는 추출할 문자열의 시작 위치와 끝 위치를 인자로 받아 추출한다.
equals 메서드는 두 문자열이 같은지 검사할 때 사용해야 한다. == 연산자로 비교하면 안 된다.
null과 빈 문자열("")은 다르다.
문자열을 비교할 때는 리터럴 문자열을 앞쪽에 두어야 한다. if("world".equals(location))
대소문자를 구별하지 않고 두 문자열을 비교하려면 equalslgnoreCase 메서드를 사용한다.

 

숫자와 문자열 변환

정수를 문자열로 변환할 때는 Integer.toString 메서드를 사용한다. 반대로 정수를 문자열로 변환할 때는 Integer.parseInt 메서드를 사용한다. 부동소수점 수는 Double.toString과 Double.parseDouble 메서드로 변환한다.

 

문자열 API(String 클래스 유용한 메서드)

 

입력과 출력

system.out.println 표준 출력 스트림으로 전달되어 출력된다.
system.in 객체는 Scanner를 생성해야 한다.
Scanner in = new Scanner(System.in); // java.util.Scanner
nextLine() 다음 한 줄을 읽은 메서드
next() 공백마다 나눠 읽는 메서드
nextInt() 정수 읽는 메서드
nextDouble() 부동소수점 읽는 메서드
다른 줄, 단어, 정수, 부동소수점 수가 있는지 검사하고 싶을 때는 hasNextLine, hasNext, hasNextInt, hasNextDouble 메서드를 사용한다.

 

배열과 배열 리스트

정수의 배열은 int[], String 객체의 배열은 String[] 타입이 된다. 초기화하려면 new 연산자가 필요하다.
범위를 벗어나는 접근에 대해서는 ArrayIndexOutOfBoundsException이 일어난다.
배열의 길이는 array.length로 얻을 수 있다.

 

배열 복사

// 얕은 복사
int[] numbers = primes;
numbers[5] = 42; // primes[5]도 42이다.
// 깊은 복사
int[] copiedPrimes = Arrays.copyOf(primes, primes.length);

 

배열 리스트 복사

// 얕은 복사
ArrayList<String> people = friends;
people.set(0,"Mary"); // friends.get(0)도 "Mary"다.
// 깊은 복사
Arraylist<String> copiedFriends = new ArrayList<>(friends);

 

배열을 배열리스트로 복사

ArrayList<String> friends = new ArrayList<>(Arrays.asList(names)); // names는 배열

 

가변 인자

메서드를 호출하는 쪽에서 인자 개수를 정하지 않고 사용할 수 있는 메서드가 몇 가지 있다.
public static double average(double... values){}
이런식으로 ... 을 쓰면 다음과 같이 호출할 수 있다.
double avg = average(3, 4.5, 8, 0);
4개의 인자가 들어오면 자동적으로 뒤에 적은 values라는 변수 안에 배열로 들어가 있다.

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함