본문 바로가기

Language/Java

다시 복습하는 자바 - 2.자바 데이터 타입, 변수 그리고 배열

대략적인 자바의 자료 구조 형식

실제 버전업을 거치면서 늘어나기도 줄어 나기도 하지만 자주 쓰이는 좋은 그림이 있어서 가져 왔다

프리미티브(원시,기본) 타입 종류와 값의 범위 그리고 기본 값

1.자바에서는 위의 이미지 처럼 8가지 기본형 타입(Primitive type)을 지원한다.(정수 실수, 문자, 논리)

2.데이터 타입이 선언 된 이후 기본 값은 null을 원칙적으로 넣을 수 없으나 null을 넣고 싶다면 래퍼 클래스를 사용하여 값을 넣는다.

3.실제 값을 저장하는 공간은 스텍 메모리에 저장한다.

4.코드 컴파일 시점에서 크기가 range 에서 벗어 나면 에러가 발생된다.

  • 특이한 점은 자주 쓰는 String은 기본형 타입은 아니라고 하는 것인다.

Reference type

1.8개의 타입을 제외한 모든 자료형은 모두 참조형 타입이라고 한다.

2.Null을 wrapper 클래스 사용 없이 사용 가능하다

3.값을 참조하는 주소값을 저장함으로 힙메모리에 저장한다.

4.만약 reference type의 값을 call 했지만 response 되는 것이 Null이라면 NullPointException이 일어난다

*기본적으로 자바 코드 단에서 내부 문자열은 모두 유니코드로 처리하고, new String 처리시 원하는 문자열을 인코딩 ,디코딩을 설정하여 한글로 출력한다.

리터럴

리터럴은 변수,상수에 넣는(할당하는) 기본형(primitive) 데이터 그 자체를 의미한다

int a = 10;

10이라는 값 자체의 메모리 주소는 변경이 되지 않는다.

다시말해 변수나 상수에 할당하기 이전 변하지 않는 기본형 데이터를 리터럴 이라고 한다.

특수 문자의 경우 quote 로 감싸서 표기 한다.

위의 이미지에는 없지만

캐리지 리턴과 라인 피드라는 것이 둘다 줄바꿈과 같은의미 다른 OS 체제에서의 혼용으로 햇갈 릴 수 있는 데

검색으로 더 참고해 보자

개행문자, 라인피드, 캐리지리턴

변수 선언(Declaration) 및 초기화(Initialization)하는 방법

변수 선언(Declaration)

int a;

어떤 자료형을 사용하겠다라고 공간 확보의 개념이다.

위의 자료형 마다 기본적으로 바이트 단위의 공간을 확보해 컴퍼일시 에러가 있는지 없는지 검사한다

변수 초기화(Initialization) (+ 변수 할당(Assignment) 과의 엄밀한 차이)

a = 1;

실제 변수나 상수에 값을 넣는 개념이다.

할당 연산자 "="를 사용하여 값을 할당한다

(참조:https://stackoverflow.com/questions/2614072/java-define-terms-initialization-declaration-and-assignment)

위의 이미지와 코드 한줄에 선언과 초기화가 같은 줄에 일어날 때와

코드 두줄로 선언 따로하고 값을 따로 할당한다 라고 표현한다.

할당이 조금 더 포괄적인 개념이라고 보면 될 거 같다

어셈블리어에 동작 방식에 따른 차이? 또는 엄밀한 구분을 위해서 구분되어 사용되는 것 같다.

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

스코프?

변수에 대한 접근과 존재(life time)에 대한 영역을 구분짓는 유효범위를 말한다

중괄호로 표현 한다.

큰 그림으로 지역변수와 전역변수가 이해가 된다면 된다.

(참조:https://www.iitk.ac.in/esc101/05Aug/tutorial/figures/java/basics-scope.gif)

위의 이미지를 기준으로 설명하자면

1.클래스(하늘색) 스코프

2.함수(노란색) 스코프

3.로컬(파란색) 스코프

4.예외(진한노랑) 스코프

가 있고 위의 순서대로

2,3,4번 영역에서 은 1번을 참조할 수 있자 만 역으로

1번 영역에서 2,3,4의 영역은 참조 할 수 없다.

다시 말해 상위 영역만 참조 할 수 있다.(물론 예외를 하기위해 지역 변수를 전역 변수 설정)

Indent를 잘 보고 하면 된다.

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

타입변환

1.묵시적 형변환(자동 현 변환)

위에서 언급한 작은 btyte 크기의 자료 형은 큰 byte 크기의 자료형으로 자동으로 형변환(Promotion)이 된다는 것이다.

*단 바꿀려는 변수가 음수이고 바뀔 자료형이 음수는 허용하지 않는다면 에러가 생김

** 위의 예시의 역은 명신적 자료형을 써야한다.

2.명시적 형변환(강제 형 변환)

기존에 선언된 자료 형보다 byte 크기가 작은 자료형으로 변환시 타입 캐스팅을 활용해서 사용한다.

int a = 126;
byte b = (byte) b // 타입 캐스팅

*단 아래와 같이 범위를 초과하는 자료형(char는 127까지 지원)은 에러를 뱉는다.

int a = 128;
byte b = (byte) b // 에러

1차 및 2차 배열 선언하기

1차원 배열

class firstDim {

    public void firstDim(){
        int arr[] = {1,2,3,4,5,6};
    }
}

2차원 배열

class secondDim {

    public void secondDim(){
        int arr[][] = {{1,2,3},{4,5,6}};
    }
}

array 자료형은 reference 자료형이다.

1차원 일때

1.array 자체는 메모리 주소가 저장된다

2.배열 내부 배열의 원소들의 고유 값 주소를 가리킨다

2차원 일때

1.1차원 array 자체는 메모리 주소가 저장된다

1.1차원 array 내 2차원 array의 원소들도 reference임으로 메모리 주소가 저장된다

2.배열 내부 배열의 원소들의 고유 값 주소를 가리킨다

타입 추론, var

타입추론은 자료형을 명시하지 않아도 되는

동적 타이핑 기능(var)이 JAVA 10에서 추가 된 것이다.

다시말해 javascript처럼 var를 선언해도 컴파일러 가 추론을 하다.

Java11에서는 람다도 지원이 된다.

*단 선언과 초기화가 한꺼번에 되어야한다 (선언만 되면 에러됨)

var a // 에러
var a = "hello" // okey

**자바 7의 다이아몬드 연산자와 함께 사용하지 못한다.

var a = new ArrayList<>(); //error
var a = new ArrayList<class>(); //okay

Reference

Java : Primitive Type

Primitive type vs. Reference type

자바의 데이터 타입(Primitive type, Reference type)

'Language > Java' 카테고리의 다른 글

4. 문(statement)  (0) 2020.12.12
3. 연산자  (0) 2020.11.28