[JAVA] Primitive 타입,변수 그리고 배열

OneTwo·2022년 7월 22일

Java

목록 보기
2/7
post-thumbnail

Ⅰ. Primitive 타입(기본 타입)과 Reference 타입(참조 타입)

Primitive 타입은 스택 메모리에 생성된 공간에 변수의 실제 데이터 값을 직접 저장하는 타입을 말한다.

기본형으로는 8개의 자료형이 있으며 논리형,문자형,정수형,실수형으로 구분된다.
아래의 표는 기본 데이터 타입과 그에 대한 범위와 기본값,크기(byte)를 보여준다.

  • 논리형(boolean) : true, flase의 값만 저장할 수 있는 자료형
  • 문자형(char) : 문자를 저장하는 자료형 , 변수 당 하나의 문자만 저장 가능하다.
  • 정수형(byte,short,int,long) : 정수를 저장하는 자료형
  • 실수형(float,double) : 실수값을 저장하는 자료형

기본형 타입(Primitive type)

  • 기본값이 있기 때문에 null이 존재하지 않는다.
  • 실제 값을 저장하는 공간으로 Stack영역에 저장된다.
  • 변수가 사용할 수 있는 값의 범위를 초과하게 되면 오버플로우(overflow) 현상이 발생하게 되어 컴파일 에러가 발생한다.

참조형 타입(Reference type)

  • 객체의 주소값을 참조하는 타입으로 배열,열거,클래스,인터페이스 타입을 말한다.
  • 기본형 타입을 제외한 모든 자료형은 참조형 타입이다.
  • 빈 객체를 의미하는 null이 존재할 수 있다.
  • Stack메모리에 실제 데이터 값이 저장되는 기본형 타입과 달리
    참조형 타입은 실제 데이터 값은 Heap 메모리에 저장하고
    Stack 메모리의 변수 공간에는 실제 변숫값이 저장된 힙 메모리의 위치값이 저장된다.

Ⅱ. 리터럴(literal)

리터럴이란 변하지 않는 데이터 그 자체를 의미한다.
리터럴에는 기본타입과 String이 존재한다.
예컨데,

int a = 10;

에서 a는 변수이고 10과 같은 변하지 않는 고정값이 리터럴이다.

  • 정수 리터럴
    정수 리터럴은 byte,short에 저장할 수 없는 범위의 정수 리터럴은 모두 int형으로 인식한다.
    정수 리터럴 뒤에 long을 나타내는 L(혹은 l)을 붙여 표기하면 long으로 인식한다.
  • 실수 자료형
    float자료형의 정밀도는 소수점 7자리이고 double자료형은 소수점 15자리이다.
    자바는 실수 리터럴을 double형으로 인식하며 실수 리터럴 뒤에 float을 의미하는 F(혹은 f)를 붙이면 float자료형으로 인식한다.

  • 문자 리터럴
    작은 따음표('')안에 표기된 문자
    자바는 모든 문자에 정숫값을 할당해 놓은 유니코드표를 사용하여 문자에 해당하는 정수로 바꾸어 메모리에 저장한다.

  • 이스케이프 문자
    특별한 용도로 사용되는 리터럴이다.

Ⅲ. 변수 선언 및 초기화 방법

변수는 다음과 같은 형식으로 선언된다.

변수타입 변수이름;

이렇게 변수를 선언해주었다면 사용하기 이전에 변수에 적절한 값을 대입해줘야 하는데 이를 초기화라고 한다.
초기화는 변수 선언과 동시에 하거나 변수 선언과 초기화를 분리할 수 있다.
보통 전자의 방법을 사용한다.

// 변수의 선언과 초기화를 동시에 함

int a = 10;

// 변수의 선언과 초기화를 분리함

int b;
b = 10;

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

프로그램상에서 사용되는 변수들은 사용 가능한 범위를 가지는데 그 범위를
변수의 스코프라고 한다.
해당 변수가 접근할 수 있는 변수,객체,함수들의 집합을 의미한다.

지역 변수

  • 특정 스코프({}) 내에서 생성되어 해당 스코프 내에서만 사용 가능하다.
  • 메서드내에서 선언되었다면 해당 메서드 내에서만 사용 가능하다.

전역 변수

  • 클래스의 속성으로 선언된 변수 globalScope의 사용 범위는 클래스 전체이다.
  • 메인 메서드가 같은 클래스 안에 있어도 globalScope 변수를 사용할 수 없다.
    (main은 static하기 때문에 static하지 않은 필드는 사용 불가)
  • 클래스 변수는 클래스가 메모리에 올라갈때 생성되며
    인스턴스 변수는 인스턴스가 생설될 때 생성된다.
  • 객체 생성 시마다 매번 새로운 변수가 생성된다.

클래스 변수

  • 클래스 내 static으로 선언된 변수
  • 처음 JVM이 실행되어 클래스가 메모리에 올라갈 때부터 프로그램이 종료될 때까지 유지
  • 동일한 클래스의 모든 객체들에 의해서 공유된다.
  • static으로 선언된 필드나 메서드들은 클래스영역에 클래스가 저장될 때 클래스 내부에 같이 저장된다.
  • 클래스의 객체를 생성하지 않아도 사용가능하다.
  • static변수는 공유된다.
    static하게 선언된 변수는 값을 저장할 수 있는 공간이 하나만 생성된다. 그러므로, 인스턴스가 여러개 생성되도 static한 변수는 하나다.

라이프타임

  • 클래스 변수
    클래스 변수는 정적 변수라고 부르며, 프로그램이 실행될 때 클래스와 함께 메모리에 로드되는 변수로 프로그램 종료시 삭제 된다.

  • 인스턴스 변수
    객체를 생성함에 따라 각각의 인스턴스마다 변수의 복사본을 가질 수 있는 변수이며, 객체가 소멸되기 전까지 존재한다.

  • 지역 변수
    메소드, 반복문, 생성자 등에서 선언된 변수로 해당 영역 내에서 사용이 가능한 변수로, 해당 범위를 벗어날 경우 사용 불가능하다.

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

타입 변환 (명시적 형변환, 캐스팅)이란
변수 또는 리터럴의 타입을 다른 타입으로 변환하는 것이다.

  • 업캐스팅
    범위가 작은 자료형을 큰 자료형에 대입하는 행위
    어떠한 데이터 손실도 발생하지 않는다.
    컴파일러가 자동으로 타입 변환 실행
    자동 타입 변환이라고도 한다.(타입 프로모션)

    byte -> short, char -> int -> long -> float -> double
    다음과 같은 방향으로만 자동 형변환이 가능하다.
    역방향은 명시적으로 형변환을 해주어야 한다.

  • 다운캐스팅
    큰 자료형을 작은 자료형에 대입하는 행위
    데이터 손실이 발생할 수도 있으며 컴파일러가 자동으로
    타입 변환을 해주지 않는다.
    따라서 개발자가 명시적을 타입변환을 수행해야한다.

float val1 = 10 ;    // int >> float(업캐스팅)
double val2 = 20;    // int >> double(업캐스팅)

int val3 = (int)4.7;       // double >> int(다운캐스팅)
float val4 = (float)7.6   // double >> float(다운캐스팅)

Ⅵ. 1차 및 2차 배열 선언하기

배열은 동일한 자료형을 묶어 저장하는 참조 자료형이다.
생성할 때 크기를 지정해야 하며 한번 크기를 지정하면 절대 변경 할 수 없다.
배열은 참조 자료형이므로 실제 데이터는 힙 메모리에 생성된다.
참조변수는 스택영역에 생성되어 실제 데이터의 주소값을 참조한다.

  • 1차원 배열 선언하는 방법
    자료형[ ] 변수명
    자료형 변수명[ ]
int[] arr1;   // 방법 1

int arr2[];   // 방법 2
  • 2차원 배열 선언하는 방법
    자료형[ ][ ] 변수명
    자료형 변수명[ ][ ]
    자료형[ ] 변수명[ ]
int[][] arr1;    // 방법 1

int arr2[][];    // 방법 2

int[] arr3[];    // 방법 3

Ⅶ. 타입 추론, var

var이란 지역변수 선언시 초기값을 통하여 변수의 타입을 명시적으로 적지 않아도 컴파일러가 알아서 데이터 타입을 통해 변수의 타입을 추론하게 해준다.
(Java 10부터 지원)

var text = "String";     // String으로 추론
var num = 10;           // Int로 추론
		

var의 특징

  • 형식 변수 선언 및 메서드 반환유형, 멤버 변수, 필드 선언, 생성자 형식 및 다른 종류의 변수 선언에는 사용 불가
  • 지역 변수 타입 추론할 때 허용됨
  • 람다 표현식에 사용한다.

var사용시 주의사항

  • var에는 null 값이 들어갈 수 없다.
  • 초기화 없이 사용이 불가하다.
  • 람다 표현식에서는 명시적인 타입을 지정해줘야한다.

참고자료

https://kdg-is.tistory.com/217
https://tychejin.tistory.com/230
https://kingpodo.tistory.com/54
https://yoo11052.tistory.com/50
https://www.devkuma.com/docs/java/literal/
https://antstudy.tistory.com/238
https://school.programmers.co.kr/learn/courses/5/lessons/231
https://tgyun615.com/165
Do it! 자바 완전 정복

profile
매일 성장하는 개발자

0개의 댓글