02. Data type, variable and array

Kim Sang Yeob·2022년 12월 28일

Study Java

목록 보기
2/3
post-thumbnail

학습할것

  • Primitive type
  • Reference type
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • Type Inference(타입 추론), var.

Primitive type(기본형 타입)

  • 기본값이 있기 때문에 Null이 존재하지 않는다. 만약 기본형 타입에 Null을 넣고 싶다면 래퍼 클래스를 활용한다.
  • 실제 값을 저장하는 공간으로 스택(Stack) 메모리에 저장된다.
  • 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 컴파일 에러가 발생한다. 주로 문법상의 에러가 많다.
이름크기값 범위기본 값비고
byte1 byte-128 ~ 1270
short2 byte-32,768 ~ 32,7680
signed int4 byte231-2^{31} ~ 23112^{31}-10
unsigned int4 byte0 ~ 23112^{31}-10java 8 이상부터
signed long8 byte263−2^{63} ~ 26312^{63}−10L
unsigned long8 byte0 ~ 26312^{63}−10Ljava 8 이상부터
float4 bytesingle-precision 32-bit0.0f
double8 bytedouble-precision 64-bit0.0d
boolean1 bytetrue / falsefalse
char2 byte'\u0000' ~ '\uffff'\u0000

Reference type(참조형 타입)

  • 기본형 타입을 제외한 타입들이 모두 Reference type(참조형 타입)이다.
  • 빈 객체를 의미하는 Null이 존재한다.
  • 값이 저장되어 있는 곳의 주소값을 저장하는 공간으로 Heap(힙) 메모리에 저장된다.
  • 문법상으로는 에러가 없지만 실행시켰을 때 에러가 나는 런타임 에러가 발생한다. 예를 들어 객체나 배열을 Null 값으로 받으면 NullPointException이 발생하므로 변수값을 넣어야 한다.
타입예시기본값할당되는 메모리 크기
Arrayint[] arr = new int[5];Null4 byte (객체의 주소값)
Enumeration(열거)Null4 byte (객체의 주소값)
ClassPepsi zero = new Pepsi();Null4 byte (객체의 주소값)
String typeString str = "pepsi";Null4 byte (객체의 주소값)
InterfaceNull4 byte (객체의 주소값)

리터럴

정수 리터럴

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

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

각각의 선언에 대한 리터럴은 다움과 같다.

  • 15 -> 10진수 리터럴 15
  • 015 -> 0으로 시작하면 8진수, 10진수 값으로 13 출력
  • 0x15 -> 0x로 시작하면 16진수, 10진수 값으로 21 출력
  • 0b0101 -> 0b로 시작하면 2진수, 10진수 값으로 5 출력

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

long e = 26L;

실수 리터럴

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

실수 타입 리터럴은 float이나 double 타입으로 컴파일 된다.

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

숫자 뒤에 f나 d를 명시적으로 붙이기도 한다.

(float 같은 경우에는 f를 꼭 붙여줘야하며, double은 생략 가능하다.)

문자 리터럴

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

char a = 'H';
char b = "한";
char c = \uae00; // 유니코드값
// \u 다음에 4자리 16진수로, 2바이트의 유니코드

익스케이프 문자

특수문자 리터럴용도유니코드
\t수평 탭0x0009
\n줄바꿈0x000a
\r리턴0x000d
\\"" 큰 따옴표 표시0x0022
\\'' 작은 따옴표 표시0x0027
\ \ \ 역슬래쉬 표시0x005c
\u16진수16진수에 해당하는 유니코드0x0000 ~ 0xffff

문자열 리터럴

문자열은 기본타입이 아니며, 큰 따옴표("")로 문자열을 표현한다.

String Iter = "JAVA";

논리 타입 리터럴 외 리터럴

boolean 타입 변수에 치환하거나 조건문에 이용된다.

boolean a = true;
boolean b = 10 > 0; // b는 true로 저장
boolean c = 0; // C언어와 다르게 boolean타입으로 1, 0을 참, 거짓으로 사용 불가

null 리터럴은 Reference type에 대입하여 사용한다.

int a = null; // 에러
String str = null; // 가능

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

class A{
	public int a;
}
class Hello{
	public static void main(String[] args){
		A a = new A(); // 클래스 선언
		
		// 정수 리터럴의 _ 은 숫자를 구별하기 위해 사용할 수 있게 지원해준다. 
		// 100_000 = 100,000
		// 맨 앞이나 뒤에 _ 를 작성할 경우 컴파일 에러가 발생한다.
		byte variableB = 100;
		short variableS = 30_000;
		int variableI = 100_000; // 10진수
		int variableI = 010; // 8진수, 8
		int variableI = 0xa; // 16진수, 10
		int variableI = 0b11; // 2진수, 3
		long variableL = 100_000_000_000; // 혹은 100_000_000_000l;
		float variableF = 3.14f;
		double variableD = 3.14; // 3.14D; 기본적으로 Double 로 판단하여 선언해준다.
		char variableC = 'c';
		boolean bool = true;
	}
}

변수의 스코프(영역)와 라이프타임

변수의 스코프란 해당 변수를 사용할 수 있는 영역범위를 뜻한다.

라이프타임은 해당 변수가 메모리에서 언제까지 살아있는지를 의미한다.

선언하는 위치(Scope)에 따라 Instance Variables, Class Variables, Local Variables로 나눈다.

Instance Variables

  • 클래스 안에서 선언되며, 어떠한 method나 block안에서 선언되지 않은 변수
  • Scope : static method를 제외한 클래스 전체 (static메소드 호출 시 객체의 생성 여부를 알 수 없기 때문에 사용불가)
  • Lifetime : 클래스를 인스턴스화한 객체가 메모리에서 사라질 때까지

Class Variables

  • 클래스 안에서 선언되며, 어떠한 method나 block안에서 선언되지 않고, static 키워드가 포함되어 선언된 변수
  • Instance 변수는 각각 고유한 값을 가지지만, Class 변수는 모든 인스턴스가 공통된 값을 공유
  • 따라서, 한 클래스의 모든 Instance에서 고옹적인 값을 가져야할 때 Class 변수로 선언한다.
  • 접근제한자 public을 붙이면 프로그램 내 어디서든 접근할 수 있는 전역 변수로 사용 가능
  • Scope : 클래스 전체
  • Lifetime : 프로그램 종료시까지

Local Variables

  • 특정 Scope({}) 내에서 생성되며, 그 Scope 안에서만 사용가능
  • Scope : 변수가 선언된 block 내부
  • Lifetime : control이 변수가 선언된 block 내부에 있는 동안

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

Primitive type

  • Widening type cast(더 넓은 타입으로의 형 변환)
int value = 10;
long value2 = value;
  • Narrow type cast(더 좁은 타입으로의 형 변환)
    - 값이 손실될 가능성 존재
long value = 10;
int value2 = value;

Reference type

  • Inheritance 관계에서만 가능
  • Upcast : subclass -> superclass
    - 모든 subclass는 superclass의 컨텐츠를 가지고 있으므로 superclass로의 casting 가능
  • Downcast : superclass -> subclass
    - 모든 superclass는 subclass의 컨텐츠를 가지고 있지 않을 수도 있음. 그러므로 오류 발생 가능성 존재

1차 및 2차 배열 선언하기

class ArrayExample{
	public static void main(String[] args){
		//1차원 배열
		int[] oneDimensionArrayEx1 = {1, 2, 3, 4, 5};
		int[] oneDimensionArrayEx2 = new int[10];
		
		//2차원 배열
		int[][] twoDimensionArrayEx1 = {1, 2}, {3, 4};
		int[][] twoDimensionArrayEx2 = new int[10][10];
	}
}

1차원 배열

  • oneDimensionArrayEx1은 Runtime Stack 영역의 힙 영역 주소값을 가짐
  • Heap 영역에 int 타입 크기의 요소 5개를 할당하여 사용됨

img

2차원 배열

  • Runtime Stack 영역의 twoDimensionArrayEx1은 2개의 요소 크기(2개 요소에 주소값을 가지고 있음)를 가진 힙 영역 주소값을 가짐
  • 힙 영역에는 실제 값이 들어있는 요소들과 주소값이 들어있는 요소들로 존재하게됨

img


Type Inference(타입 추론), var.

  • Type Inference란 정적인 언어에서 컴파일러가 컴파일 시점에서 변수를 초기화하는 리터럴을 판단하여 해당 타입으로 변환하는 것
  • 자바는 JDK 10부터 Local Scope 내에서 var이라는 새로운 Type을 지원하게 되었다.
String message = "data"; // Java 9 이하
var message = "the initializer"; // Java 10 이상
public class Test {
    Pair<Integer, String> p1 = new Pair<>(1, "apple");
    Pair<Integer, String> p2 = new Pair<>(2, "pear");
    boolean same1 = Util.<Integer, String>compare(p1, p2);
    // <Integer, String> 은 없어도 되는 코드이다.

    Pair<Integer, String> p3 = new Pair<>(1, "apple");
    Pair<Integer, String> p4 = new Pair<>(2, "pear");
    boolean same2 = Util.compare(p3, p4);
    // 간결해진 코드
}

class Util {
    public static <K, V> boolean compare(Pair<K, V> p1, Pair<K, V> p2) {
        return p1.getKey().equals(p2.getKey()) &&
                p1.getValue().equals(p2.getValue());
    }
}

class Pair<K, V> {
    private K key;
    private V value;

    public Pair(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public void setKey(K key) { this.key = key; }
    public void setValue(V value) { this.value = value; }
    public K getKey()   { return key; }
    public V getValue() { return value; }
}
profile
Studying NodeJS...

0개의 댓글