algoqna

[JAVA] 데이터타입, 형변환 본문

JAVA

[JAVA] 데이터타입, 형변환

kkalgo 2023. 1. 16. 11:06

 [Variable]

기본형 : 미리 정해진 크기의 데이터 표현, 변수 자체에 값 저장

참조형 : 크기가 미리 정해질 수 없는 데이터의 표현, 변수에는 실제 값을 참조할 수 있는 주소만 저장

 

 

구분 Type bit 수
논리형 boolean   true/false
정수형 bte 8 -2^(비트수-1)
~
2^(비트수-1) -1
short 16
int (기본형) 32
long 64
실수형 float 32  
double (기본형) 64  
문자형 char 16  

* 맨 앞 비트는 부호비트로 bit수 - 1 제곱이 크기임.

 

* 오버플로우(Overflow)는 '오류'는 아님.

 

*실수의 연산은 부정확하다.

   - 유효 자리수를 이용한 반올림 처리가 필요하다.

 2.0f - 1.1f = 0.9

 

1) 실수를 정수로 바꾸고 정수를 실수로 바꾸는 과정을 거침.

2) BigDecimal을 이용한 연산.

 

 

[형 변환]

변수의 타입을 다른 타입으로 변환.

기본형은 기본형끼리, 참조형은 참조형끼리 형 변환 가능

 *기본 타입과 참조형의 형 변환을 위해서는 Wrapper 클래스 사용

   (Integer, Double, Float... 앞에 기본형 8개에 대해서 8개의 Wrapper클래스 존재)

 

작은집 -> 큰집 (데이터 손실 x), 큰집 -> 작은집 (데이터 손실 o)

묵시적 형 변환 / 명시적 형 변환

 

값의 크기, 타입의 크기가 아닌 타입의 '표현 범위'가 커지는 방향으로 할당할 경우는 묵시적 형변환 발생

 * 비트수만으로 변환하는 것은 아님.

 * short와 char는 호환이 안되는 이유? : char는 시작이 0부터이기 때문.

    - char는 음수를 표현할 수가 없음

 

명시적 형변환은 값손실을 프로그래머 책임하에 진행 (값에 대한 손실이 발생할 때는 반드시 필요)

묵시적 형변환은 JVM이 서비스해줌.

 

package com.ssafy.a_basic.basic;

public class BP_09 {
    public static void main(String[] args) {
        int i1 = Integer.MAX_VALUE;
        int i2 = i1 + 1;
        System.out.println(i2); // Overflow

        long l1 = i1 + 1; // 깨진 값을 long에 할당한 것임
        System.out.println(l1);

        long l2 = (long) (i1 + 1); // i1 +1이 연산과정에서 이미 깨진 값임
        System.out.println(l2);

        long l3 = (long) i1 + 1; // i1이 long으로 형변환 후 +1이기 때문에 가능
        System.out.println(l3);

        // 컴퓨터는 수 연산을 왼쪽 -> 오른쪽으로.
        int i3 = 1000000 * 1000000 / 100000;
        int i4 = 1000000 / 100000 * 100000;
        System.out.println(i3 + " : " + i4);
    }
}
package com.ssafy.a_basic.basic;

public class BP_11 {

    @SuppressWarnings("unused")
    public static void main(String[] args) {
        byte b1 = 10;
        byte b2 = 20;
        // TODO: 
         byte b3 = b1 + b2; // 실제로 더하기를 하는 과정에서 int가 된다.

        int i1 = 10;
        long l1 = 20;
        // TODO: 연산을 할 때는 두 타입을 맞추어야 함.
         int i2 = i1 + l1; 

        // TODO: 
         float f1 = 10.0; // 뒤에 f를 붙여줘야 float, 안붙여주면 double임
         float f2 = f1 + 20.0; // 20.0이 double이기 때문에 두 type을 맞춰주어야 함
    }

}
package com.ssafy.a_basic.basic;

public class BP_15 {
    public static void main(String[] args) {

        int a = 10;
        int b = 20;
        System.out.println((a > b) & (b > 0));

        System.out.println((a += 10) > 15 | (b -= 10) > 15); // 결과는 뻔한데 굳이 뒤에거까지 연산을 하겠다는 것임 얘는 b가 20임.
        System.out.println("a = " + a + ", b = " + b);

        a = 10;
        b = 20;
        System.out.println((a += 10) > 15 || (b -= 10) > 15); // 얘는 b가 10
        System.out.println("a = " + a + ", b = " + b);
    }
}

[배열]

- 동일한 타입의 데이터 '0'개 이상을 연속된 메모리 공간에서 관리하는 것.

 * int[] arr --> arr의 타입 = 참조형, primitive 타입에는 []타입이 없다.

 

참조형 변수의 기본값 : null

문자열

  -toCharArray() : 문자열을 Char 배열로 변환.

 

* for-each with Array

 - index 대신 직접 요소(element)에 접근하는 변수를 제공

for (int i=0; i< intArray.length; i++) // index가 필요한 경우
{
	int x = intArray[i];
    System.out.println(x);
}

for (int x : intArray) // index를 사용할 수 없다. 
{
	System.out.println(x);
}

* api 제공하는 배열 복사 method

 - System.arrayCopy

 - Arrays.Copyof

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              

 

 

'JAVA' 카테고리의 다른 글

[JAVA] pair 생성 후 정렬  (0) 2023.02.17
[JAVA] Call by value  (0) 2023.02.08
[JAVA] 놓치고 있는 점 정리  (0) 2023.02.06
[JAVA] 예외처리  (0) 2023.01.25
[JAVA] String  (0) 2023.01.17