자바스터디 - 2주차

megaseunghan·2022년 1월 21일
0

자바스터디

목록 보기
10/15
post-thumbnail

2주차 목표 : 자바의 프리미티브 타입, 변수 그리고 배열을 사용하는 방법을 익힙니다.

프리미티브 타입 종류와 값의 범위 그리고 기본 값

종류

  • 정수

    byte 타입의 범위가 -128 ~ 127인 이유

    • 최상위 비트는 정수값의 부호를 결정한다.
      • 최상위 비트가 0일 때 ▶ 양수
      • 최상위 비트가 1일 때 ▶ 음수
    • 실제 정수값은 나머지 7bit로 표현한다.
    • 음수의 경우 10진수로 표현하고자 할 때는 1의 보수로 바꾸고 더한 값에 -를 붙여주면 십진수이다.
    타입메모리 사용 크기기본값최소값최대값
    byte1byte (8bit)0-128127
    short2byte(16bit)0-3276832767
    char2byte(16bit)‘\u0000’‘\u0000’‘\uffff’
    int4byte(32bit)0-2^312^31 -1
    long8byte(64bit)0L-2^632^63 -1
  • 실수

    정수와는 다른 저장 방식( 부동 소수점)

    가수 m은 0 ≤ m < 1 범위의 실수여야 한다. 예를 들어 실수 1.2345는 0.12345 * 10^1 로 표현된다. 이때 가수는 0.12345, 지수는 1이다.

    타입메모리 사용 크기기본값최소값최대값
    float4byte(32bit)0.0f32bit single precision
    (+/-)1.4E-45(+/-)3.4028235E38
    double8byte(64bit)0.0d64bit double precision
    (+/-)4.9E-324(+/-)1.7976931348623157E308
  • 논리

    타입메모리 사용 크기기본값값의 범위
    boolean1bytetruefalse

프리미티브 타입과 레퍼런스 타입

Primitive Type이란

  • 정수(byte, short, int, long) 실수(float, double), 문자(char), 논리(boolean) 리터럴을 계산을 위한 실제 값으로 저장한다.

Reference Type이란

  • 객체(Object)의 번지를 참조하는 타입으로 배열, 열거(Enum), 클래스,인터페이스 타입을 말한다.

차이

  • primitive type은 변수의 실제값이 저장되지만, reference type은 메모리의 번지를 값으로 갖는다.
  • primitive type은 stack 영역에 생성되지만, reference type은 heap영역에 생성된다.
  • primitive type은 기본값이 있어 null값을 존재하지 않지만(Wrapper를 쓰지않고는) reference type은 null값이 존재한다.

리터럴

  • 데이터 그 자체를 의미한다.
  • 상수와 의미가 비슷하지만 프로그래밍에서 상수는 값을 저장하면 변경할 수 없는 저장 공간이기 때문에 이를 구분하여 리터럴이라는 용어가 쓰임.
final int MY_BIRTHDAY = 980521;
//        상수           리터럴

변수 선언 및 초기화하는 방법

변수 선언

  • 변수를 선언할 때는 변수 타입과 변수 명을 지정한다.
    • 변수 타입 : 변수에 저장될 값이 어떤 타입인지를 지정
    • 변수명 : 변수에 붙히는 이름으로, 값을 저장할 메모리 공간에 이름을 붙혀 이 저장공간을 사용한다.

초기화

  • 초기화는 변수의 값을 처음으로 저장하는 것이다.
  • 대입연산자 =을 통해 우측에 있는 값을 좌측 변수 명에 대입하여 저장 한다.

선언 및 초기화 방법

int myInt; // 선언
myInt = 10; // 초기화
int myInt2 = 10; // 선언과 초기화를 동시에 함

변수의 스코프와 라이프타임

변수의 스코프

  • 변수에 접근하거나 할 수 있는 유효 범위
  • 중괄호 {} 사이에 변수가 있다면 해당 중괄호 사이가 변수의 스코프이다.(일반적)

변수의 라이프 타임

변수가 메모리에서 살아있는 기간

public class LifeTime { // 스코프 1 start
    int lifetime; // 인스턴스 변수 || 필드
    static int lifetime2; // 정적 변수
    
    void myMethod(int age) { // 스코프2 start
        int myAge += age; // 지역 변수
    } // 스코프2 end
} // 스코프 1 end

변수의 종류

종류선언위치생성시기소멸시기
인스턴스 변수클래스 영역객체가 생성 될 때 생성참조가 없을 때 GC가 객체를 지워버리는데 이 때 같이 소멸
정적 변수클래스 영역클래스가 처음 호출될 때 생성자바 프로그램이 종료될 때 같이 소멸
지역 변수메서드, 생성자, 초기화 블록 내부 등 클래스 영역이 아닌 영역중괄호가 시작되는 시점에 생성중괄호가 끝나는 시점에 소멸

타입 변환, 캐스팅 그리고 타입 프로모션

자동 타입 변환(묵시적)

  • 프로그램 실행 도중에 형변환이 일어나는 것.
  • 작은 크기를 가진 타입이 큰 크기를 가진 타입에게 저장될 때 발생
  • 예시
  • 예외 : char는 2byte를 가지지만 범위가 65535이므로 음수가 저장될 수 없다.(음수가 저장될 수 있는 byte 타입을 char로 자동 변환하지 못함)

강제 타입 변환(명시적)

  • 강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어 저장하는 것(= 캐스팅).
  • 캐스팅 연산자 ‘( )’를 통해 사용
  • 예시
    • 끝 1byte만 변수에 저장되어 십진수 10이 저장된다.
    • 만약 int값이 10이였다면 값은 보존된다. 앞의 3byte가 모두 0이기 때문.
  • 주의할 점 1. 사용자로부터 입력받은 값을 변환할 때 값의 손실이 발생하면 안된다.

  • 주의할 점 2. 정수타입을 실수타입으로 변환할 때 정밀도 손실을 피해야 한다.

  int num1 = 123456780;
  int num2 = 123456780;
  float num3 = num2;
  num2 = (int)num3;
  
  int result = num1 - num2 // 예상값 : 0
  System.out.println(result); // 실제값 : -4

float타입은 부호(1)지수(8)가수(23)으로 이뤄져있기 때문에 123456780을 23비트로 표현할 수 없다. 따라서 근사치가 되며 정밀도 손실을 일으킨다. 이를 피하는 해결책으로 안전하게 double을 사용한다.

1차 및 2차 배열 선언하기

배열이란

  • 동일한 자료형의 변수들의 메모리 공간을 나란히 나열한 것.

1차원 배열 선언 및 초기화

public class Test {
    // 1차원 배열 선언 방법
	int[] array = new int[5];
    int array[] = new int[5]; 
    int[] array = {1,2,3,4,5};
    
    // 1차원 배열 값의 초기화 및 참조
    array[0] = 10; // 값 초기화
    array[1] = 20; 
    .
    .
 	.
    int num = array[0] + array[2]; // 참조
}

2차원 배열 선언 및 초기화

String[][] array2D = new String[3][4];
String[][] array2D = {{"1", "2", "3", "4"},{"5", "6", "7", "8"}, {"9", "10", "11", "12"}};

int cnt = 0;
for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 4; j++) {
        array2D[i][j] = cnt;
    }
    cnt++;
}

타입 추론, var

  • 타입추론이란 개발자가 변수의 타입을 명시적으로 적어주지 않고, 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것.

var

  • 사용 : var 키워드를 통해 사용한다.
  • 특징 :
    • 초기화 값이 있는 지역변수로만 선언이 가능하다.
    • 선언과 초기화를 함께 해야하며 멤버 변수 || 메서드의 파라미터 리턴값으로는 사용할 수 없다.
    • Runtime Overhead가 없다. 컴파일러가 오른쪽에 제공된 초기화 값을 통해 타입을 유추하고 중간에는 타입의 변환이 이뤄지지 않는다.
    • 기존 자바9 까지의 타입추론은 Generic과 Lambda를 사용할 때에만 지원하고 있었지만 자바10부터 type-inference(타입추론)이 가능하다.

0개의 댓글