[Java]데이터 타입과 배열

정석용·2023년 4월 5일
0

Java

목록 보기
2/15
post-thumbnail

자바의 데이터 타입

자바의 데이터 타입에는 2가지 원시 타입과 참조 타입으로 나눌 수 있다.

원시 타입(Primitive type)

정수, 실수, 문자, 논리 리터럴 등의 실제 데이터 값을 저장하는 타입이다.
종류는 8가지 byte, short, int, long, float, double, char, boolean가 존재한다.

정수형

byte, short, int, long 가 있으며 순서대로 1, 2, 4, 8바이트의 크기를 가진다.

  • 데이터 범위
    -byte -128 ~127
    -short -32,768 ~32,767
    -int -2,147,483,648 ~2,147,483,647
    -long -2^63 ~2^63-1

실수형

  • float, double 이 있으며 4, 8바이트의 크기를 가진다.

  • float 형식에 접미사 f를 뒤에 붙여 주지 않으면 double형으로 인식

  • double형 데이터가 float보다 더욱 정밀한 데이터 표현이 가능하다.

  • 데이터 범위
    -float 1.40239846E-45f ~ 3.40282347E+38f
    -double 4.94065645841246544E-324 ~ 1.79769313486231570E+308

문자형

  • char을 사용하며 메모리 크기는 2byte 표현 범위는 \u0000~\uFFFF 이다.
  • unsigned 형식이기 때문에 맨 앞 비트를 음수 양수 형식으로 사용하지 않는다.
  • 값을 대입하기 위해 3가지 방법을 대입할 수 있다.
    1)단일 문자열
    2)아스키코드(문자열의 숫자값)
    3)유니코드값(문자열 맵핑 공간)

논리형

참(true), 거짓(false)의 값을 갖는 변수타입을 논리형 변수 타입이라 한다.

참조 타입(reference type)

객체의 번지를 참조(주소를 저장) 하는 타입으로 메모리 번지 값을 통해 객체를 참조한다.

  • Java에서 실제 객체는 힙 영역에 저장되며 참조 타입 변수는 스택 영역에 실제 객체들의 주소를 저장한다.
  • 객체를 사용할때 마다 참조 변수에 저장된 객체의 주소를 불러와 사용하는 방식이다.

스택영역

  • Heap 영역에 생성된 Object 타입의 데이터 참조 값이 할당.
  • 원시 타입의 데이터가 값과 함께 할당
  • 지역 변수들은 scope에 따른 visibility를 가진다.
  • 각 Thread는 자신만의 stack을 가진다.

힙영역

  • 주로 긴 생명주기를 가지는 데이터들이 저장된다.
  • 애플리케이션의 모든 메모리 중 stack에 있는 데이터를 제외한 부분이라고 보면 된다.
  • 모든 Object 타입은 heap영역에 생성된다.
  • 몇개의 스레드가 존재하든 상관없이 단 하나의 heap 영역만 존재한다.
  • Heap 영역에 있는 오브젝트들을 가리키는 래퍼런스 변수가 stack에 올라가게 된다.

힙 영역에 있는 데이터는 함수 내부에서 파라미터로 copied value를 받아서 변경하더라도 함수호출이 종료된 시점에 변경내역이 반영되는 것을 볼 수 있다.

리터럴(literal)

프로그램에서 직접 표현한 값, 소스 코드의 고정된 값을 대표하는 용어
종류로는 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.

정수 리터럴
10진수, 8진스, 16진수, 2진수 리터럴

int a = 15;
int b = 015;
int c = 0x15;
int d = 0b0101;

정수 리터럴은 int형으로 컴파일, long 타입 리터럴은 숫자 뒤에 L 또는 l을 붙여 표시

실수 리터럴
소수점 형태나 지수 형태로 표현한 값을 의미한다.

double f = 0.1234;
double g = 1234E-4;

숫자 뒤에 f나 d를 명시적으로 붙이기도 한다.(double은 생략 가능)

문자 리터럴
단일 인용부호 (")로 문자를 표현한다.

char a ="정"
char b ="seok"
char c = \uae00; (유니코드 값)

문자열 리터럴
문자열은 기본타입이 아니며, 더블 쿼터("")로 표현한다.

String lter = "Jeong";
lter + 26 = "lter26" 

논리 타입 리터럴 외 리터럴
boolean 타입 변수에 치환하거나 조건문에 이용된다.

boolean a = true;
boolean b = 10 > 0;(여기선 b값이 true)
boolean c = 0;

Null 리터럴은 래퍼런스에 대입해서 사용한다.

int a = null; // 에러

String str = null;
str = "JAVA";

기본 타입에는 사용이 불가능하고 String 같은 경우에 사용이 가능하다.

변수 선언

자바에서 변수를 사용하려면 변수를 선언하여야 한다. 그 이유로는 값을 저장하는 공간을 확보 해야한다
미리 자원을 확보하는 동시에 사용한다는 의미를 가지고 있기 때문에 변수를 선언하지 않는다면 프로그램은 값을 담아둘 공간이 없어 값을 사용할 수 없다.

변수를 선언하는 방법으론 변수 타입과 변수명을 함께 작성한다.

string name;
int a;

변수 타입과 변수 값이 맞지 않으면 담을 수 없고 반대로 값은 변수 타입에 맞지 않으면 저장될 수 없다.
변수를 사용하기 위해서는 초기와가 필요하다.

변수 초기화

변수는 변수 선언 후 값을 할당해 주어야만 사용할 수 잇다. 예외로 초기화를 하지 않고도 사용할 수 있지만 기본적으로 변수는 선언과 초기화가 이루어져야 사용할 수 있다.

// 변수 선언
String message1;

// 변수 초기화
message1 = "Hello World";

// 변수 선언 및 초기화
String message2 = "Hello World";

초기화에는 각각 초기화 하는 방법과 선언과 동시에 초기화하는 방법이 있다.

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

변수의 스코프란?
변수를 사용할 수 있는 영역이고 스코프는 변수가 선언되는 영역에 따라 접근하는 방법이 다르다

지역 변수

  • 특정 스코프 내에서 생성되어 그 스코프 안에서만 사용 가능하다.
  • ex)함수 속에 선언되어 해당 함수 속에서만 사용이 가능한 변수

전역 변수

  • 클래스의 속성으로 선언된 변수의 사용 범위는 클래스 전체이다.
  • 메인 메소드가 같은 클래스 안에 있어도 변수를 사용할 수 없다.
  • 인스턴스 변수와 클래스 변수가 있다.
  • 객체 생성 시마다 매번 새로운 변수가 생성된다.

클래스 변수

  • 클래스 내에 static 키워드로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈때 부터 종료될 때까지 유지
  • 동일한 클래스의 모든 객체들에 의해서 공유된다.
  • main 메소드는 static 이라는 키워드로 메소가 정의되어 있다.
  • static한 필드나, 메소드는 class가 인스턴스화 되지 않아도 사용할 수 있다.
  • static한 변수는 공유된다.

라이프 타임이란?
이러한 변수가 유효한 시간을 말하는데, 프로그램이 구동되는 동안 변수가 값을 담고 있을 수 있는 주기를 말한다.

변수에 따른 스코프와 라이프 사이클

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

타입 변환의 종류

  • 캐스팅
    명시적 형 변환, 강제 형 변환
  • 프로모션
    묵시적 형 변환, 암시적 형 변환, 자동 형 변환

형 변환(casting) 이란?

변수 또는 상수의 타입을 다른 타입으로 변환하는 것

형 변환 방법

(타입)피연산자

ex)

double a = 1.0
int score = (int)a;

정수형을 실수형으로 변환

  • 정수는 소수점 이하의 값이 없으므로 간단하다.
  • 2진수로 변환한 다음 정규화를 거쳐 실수의 저장 형식으로 저장될 뿐이다.
  • 실수형은 정수형보다 훨씬 큰 저장 범위를 갖기 때문에, 정수형을 실수형으로 변환하는 것은 무리가 없다.

실수형을 정수형으로 변환

  • 실수형을 정수형으로 변환하면, 실수형의 소수점 이하 값은 버려진다.

자동 형 변환

경우의 따라 편의상의 이유로 형 변환을 생략할 수 있다.

자동 형 변환의 규칙

  • 컴파일러는 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형 변환시킨다.
  • boolean을 제외한 나머지 7개의 기본형은 서로 형 변환이 가능하다.
  • 기본형과 참조형은 서로 형 변환할 수 없다.
  • 서로가 다른 타입의 변수 간의 연산은 형 변환을 하는 것이 원칙이지만 값의 범위가 작은 타입에서의 큰타입으로의 형변환을 생략할 수 있다.

1차, 2차 배열 선언하기

배열이란?

동일 타입의 값을 여러개 취급할 수 있는 기능
인덱스라고 불리는 []로 감싼 0 부터 시작하는 정수를 사용하여 배열의 길이나 순서를 나타낼 수 있다.
배열도 결국은 타입에 따라 default value로 채워진다.

  • 참조의 경우 null
  • int / short / byte / long의 경우 0
  • float / double 의 경우 0.0
  • bool의 경우 false
  • char의 경우 \u0000

1차원 배열 = int arr[i]
2차원 배열 = int arr[i][j]
3차원 배열 = int arr[i][j][k]

타입 추론, Var

타입 추론

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

Var

  • 초기화 값이 있는 지역 변수로만 선언이 가능하다.
  • 멤버 변수, 메소드의 파라미터, 리턴 타입으로 사용 불가능.
  • var는 키워드가 아니다.
  • 런타임 오버헤드가 없다.
  • 어노테이션(소스코드에 추가해서 사용할 수 있는 메타데이터의 일종)을 사용 할 수 있다.

래퍼런스
https://codehouse.tistory.com/3
https://yaboong.github.io/java/2018/05/26/java-memory-management/
https://mine-it-record.tistory.com/100
https://7942yongdae.tistory.com/22
https://catch-me-java.tistory.com/19

profile
오늘도 성장중

0개의 댓글