Programming Language/java

[whiteship_java_study]2주차. 자바 데이터 타입, 변수 그리고 배열

김크리 2021. 6. 22. 20:16

목표

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

학습내용

프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입과 레퍼런스 타입
리터럴
변수 선언 및 초기화하는 방법
변수의 스코프와 라이프타임
타입 변환, 캐스팅 그리고 타입 프로모션
1차 및 2차 배열 선언하기
타입 추론, var

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

프리미티브 타입(Primitive type, 기본형 타입)

자바에서는 총 8가지의 기본형 타입(Primitive type)을 정의하여 제공한다.
기본값이 있기때문에 Null이 존재하지 않는다.
Null을 넣은 기본형 타입이 필요하다면 참조 클래스(reffer class)를 황용해야한다.
실제 값을 저장하는 공간은 스택(Stack)메모리에 저장된다.

 

  타입 메모리크기 기본값 범위
논리형 boolean 1byte false true, false
정수형 byte  1byte  0 -128 ~ 127
short 2byte  0 -32,768 ~ 32,767
int  4byte  0 -2,147,483,648 ~ 2,147,483,647
long 8byte  0L -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
실수형 float  4byte  0.0F -(3.4 X 10-38) ~ (3.4 X 1038) 의 근사값
double  8byte  0.0 (1.7 X 10-308) ~ (1.7 X 10308) 의 근사값
문자형 char  2byte(uniCode) \u0000 '\u0000' ~ '\uFFFF'

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

프리미티브 타입을 제외한 모든 타입은 참조형 타입(reference Type)이다.
빈 객체를 의미하는 Null이 존재한다.
값이 저장되어있는 곳의 주소값을 저장하는 공간으로 힙(Heap)메모리에 저장된다.
할당되는 메모리의 크기는 4byte로 객체의 주소값을 의미한다.


리터럴(Literal)

상수(Constant) : 변하지 않는 값(데이터), 자바에서는 final 제어자를 사용한다.
메모리의 값을 변경할 수 없다.
리터럴(Literal) : 상수에 저장되는 값 자체를 일걷는다. 변수에 넣는 변하지 않는 데이터를 의미한다.

public static final float PI = 3.14f;


라면, PI는 상수가 되는 것이고,
3.14f가 실수 리터럴이라고 할 수 있다.

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

변수 선언
사용할 데이터를 저장하기 위해 메모리를 잡는 것

int num //num 이라는 이름의 int 타입의 변수 선언, 4byte의 메모리 할당


변수 초기화(initialization)
변수를 선언하고, 변수를 사용하기 위해 값을 넣어주는 작업

int num = 0 //num 이라는 이름의 int 타입의 변수를 선언한다. 0이라는 값으로 초기화한다.

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

변수의 스코프(scope, 영역)
변수에 접근하거나 접근할 수 있는 유효 범위/영역
자바에서는 중괄호 {}로 하나의 스코프를 형성한다.
이 영역 내에서 선언된 변수를 지역변수(local variable)이라고 하며, 영역을 벗어나면 소멸되게 된다.

라이프타임(lifetime, 생명주기)
변수가 메모리에 남아있는 기간


인스턴스 변수(instance variables)
클래스 내에서 선언하는 변수, 다른 메소드나 블록에서 인스터늣 변수로 정의되어 사용
범위 : 정적 메소드를 제외한 클래스 전체
생명주기 : 클래스 객체가 메모리에 남아있는 동안(클래스 객체가 생성되어 종료되는 기간)


클래스 변수(class variables)
클래스가 처음 호출되며 생성되는 변수, static으로 정의되어진 클래스 내부의 변수
범위 : 클래스 내부
생명주기 : 프로그램이 종료되는 시점에 소멸


지역 변수(local variables)
인스턴스 변수, 클래스 변수가 아닌 모든 변수
범위 : 정의되어진 스코프(블록)
생명주기 : 정의되어진 스코프를 떠나면 소멸

public class Scope_and_lifetime {
	int num1, num2; //Instance Variables
	static int result; //Class Variable
	int add(int a, int b){ //Local Variables
      num1 = a;
      num2 = b;
      return a+b;
	}
    
	public static void main(String args[]){
      scope_and_lifetime ob = new scope_and_lifetime();
      result = ob.add(10, 20);
      System.out.println("Sum = " + result);
	}
}

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

타입변환

묵시적 형변환(자동 형변환, promotion)
프로그램 실행 도중 자동으로 타입 변환
작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.


명시적 형변환(강제 형변환, Casting)
큰 크기의 타입은 작은 타입으로 묵시적 형변환을 할 수 없다.
하지만 강제로 일부를 소실하여 작은 타입의 변수에 저장할 수 있다.
이 과정을 명시적형변환, 캐스팅이라고 한다.

 

public class Casting {
  public static void main(String[] args) {
    double dNum = 1.1;
    int num = (int) dNum; // 1
  }
}

1차 및 2차 배열 선언하기

배열(Array)
배열은 원시타입이나, 참조타입으로 구성된 객체이다.
배열에 담기는 값은 배열의 타입에 의해 결정되고, 배열의 사이즈에 따라 생성된다.
배열은 직렬화(Serialize) 인터페이스를 상속한다.

1차 및 2차 배열 선언하기
Java 배열은 자바에서 사용하는 타입으로 구성된 객체이다.
선언한 타입의 데이터를 배열을 사이즈에 따라 공간(메모리)에 저장할 수 있다.
배열을 선언 및 초기화 하며 배열의 타입과 다차원을 구성할 수 있다.

int[] arr1 = new int[10];// int 값 10 size 의 배열선언
int[][] arr2 = new int[10][10];// int 값 10*10 size 의 배열선언


타입 추론, var

타입추론(Type Inference)
타입이 정해지지 않은 변수의 타입을 컴파일러가 유추하는 기능이다.
자바에서는 일반 변수에 대해 타입 추론을 지원하지 않기 때문에, 자바에서 타입 추론은 제네릭과 람다에 대한 타입추론을 말한다.

제네릭(Generic)
데이터 형식에 의존하지 않고, 하나의 값이 여러 다른 데이터 타입들을 가질 수 있는 기술에 중점을 두어 재사용성을 높일 수 있는 프로그래밍 방식

타입 설명
<T> Type
<E> Element
<K> Key
<V> Value
<N> Number

해당 규칙은 암묵적인 규칙이며, 사용자에 따라 다르게 사용할 수 있다.

람다(Lambda)
Java 8 부터 람다가 지원되기 시작하였다.
람다는 함수의 수학적 표기이다.
람다 대수는 함수를 사용하여 수학을 탐구하는 방식이며, 이후에 람다 함수를 적용한 함수 프로그래밍 분야에서도 발전하였다.
람다는 "익명함수" 이고, 함수를 정의하는 간편한 방법이다.
람다함수는 힙(Heap)의 permanent 영역에 한번 저장된다.

var
Java 10 부터 타입 추론이 지원되기 시작하였다.

public class Type_reference {
  public static void main(String[] args) {
    var i = 1;
    var str ="string";
  }
}

var 는 초기화값을 통해 해당 변수의 타입을 추론한다.


Java 에서 var의 특징
 초기값이 있는 변수로만 선언이 가능하다.
 지역변수(Local Variables)로만 선언이 가능하다.
 null 값이 들어갈 수 없다.
 Lamda Expression에서는 명시적인 타입을 지정해주어야 한다.
 배열 선언시에는 타입을 명시해주어야한다.

참조

https://catch-me-java.tistory.com/19
https://www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/
https://futurecreator.github.io/2018/07/20/java-lambda-type-inference-functional-interface/
https://ko.wikipedia.org/wiki/%EC%A0%9C%EB%84%A4%EB%A6%AD_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D