DevCastleOne

※ 목차


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

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

3. 리터럴

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

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

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

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

8. 타입 추론, var



1. Primitive Type 종류와 값의 범위 , 기본값


- primitive type은 총 8가지를 제공한다.

- 기본값이 존재

- Stack 메모리에 저장됨

- 논리형 : true , false 의 값이 존재하며 조건식과 논리적 계산에 사용

- 문자형 : 문자를 저장하는데 사용되며 , 하나의 문자만 저장이됨

- 정수형 : 정수를 저장하는데 사용되고 byte는 이진 데이터를 다룰때 사용되며 , short는 C언어와의 호환을 위해서 추가됨

- 실수형 : 실수를 저장하는데 사용됨



 

 타입

할당 메모리 크기 

Default value 

데이터 범위 

 논리형

 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 

 -2^63 ~ 2^63-1

 실수형

 float

 4byte

 0.0F 

 1.4E-45 ~ 3.4E38  ( 6~7자리 정밀도 ) 

 실수형

 double

 8byte

 0.0 

 4.9E-324 ~ 1.8E308 ( 15자리 정밀도 )

 문자형

 char

 2byte

 '\u0000'

 0 ~ 65,535



2. Primitive Type과 Reference Type


-    자바 타입은 primitive Type 과 Reference Type 으로 나뉜다.

-    Primitive의 경우 변수에 값이 저장(실제값이 저장)되나 Reference Type의 경우 힙 영역에 저장된 주소를 가르키게 됨

-    Reference의 경우 null을 할당할수 있으며 Class , Interface , Type Variable , Array 로 구분함

-    Primitive Type : 스택영역에 실제 값 저장 , Reference Type : 힙 영역의 주소를 저장



3. 리터럴 ( Literal ) 


-    상수와 혼동을 해서 사용하는 경우가 있음

-    상수 ( constant)

: 변하지 않는 변수

: final 키워드를 붙여서 사용함

: 오해! 참조변수(객체)을 상수로 지정할때 참조변수가 가지고 있는 데이터들이 변경 안되는것이 아니다.

: 다른 참조값으로 변경할수 없는것이다. 참조된 값이 가르키는 데이터는 변경이 가능

=> 메모리 위치의 값이 변경 불가능


-    리터럴 (Literal)

: 변수에 대입되는 변하지 않는 데이터 그 자체

: 기본 데이터 타입들을 리터럴이라고 부름

: 기본적으로 인스턴스는 리터럴이 될수 없다.

=> 그러나 데이터가 변하지 않도록 설계한 클래스의 경우 객체 리터럴이 될수있다.

=>메모리 위치의 데이터 변경이 불가능한것

=>String 같은 Immutable class나 VO Class의 경우 객체 리터럴이 가능하다.



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


    int value;


변수 선언을 하기 위해선 변수 타입과 이름이 존재한다.

변수 타입 : 변수에 저장될 값의 타입을 지정하는것 ( int ) , 메모리를 데이터 크기 만큼 할당함

변수 이름 : 저장된 값이 존재하는 메모리 공간의 이름으로 사용됨 ( value)


=> int data : int type을 가진 데이터를 value 이름을 가진 공간에 넣겠다. 


변수 초기화 

=>       int value = 10;

=> 대입연산자의 우측의 값을 좌측의 변수에 저장함

=> int 크기를 가진 value 변수를 10으로 초기화 하겠다.

=> But, 변수가 선언된 방식에 따라 다른 이름으로 불리는데 

     지역변수의 경우 사용하기전 반드시 초기화 해줘야한다.




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


Variable Type 

Scope 

Lifetime 

Intance Variable 

 static methods를 제외한 클래스 모든영역

객체가 메모리에서 활용될때까지

Class Variable

 클래스 모든 영역

프로그램이 끝날때까지

Local Variable

클래스 영역 이외의 영역

(메소드 , 생성자 , 초기화 블록 내부)

블록을 벗어났을때까지



참조 : https://www.learningjournal.guru/article/programming-in-java/scope-and-lifetime-of-a-variable/



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


타입변환 : 데이터를 다른 타입의 데이터로 변환하는 과정


-    Casting(명시적 형변환)

: 큰 타입 -> 작은 타입으로 변환

: 데이터 손실이 존재할수 있다.

: 캐스팅 연산자를 명시적으로 작성해야 한다.

int a = 10;
float b = 20;
a=(int)b;


-    Promotion(묵시적 형변화)

: 작은타입 -> 큰 타입으로 변환

: 데이터 손실 없다.

: 하위클래스에서 상위클래스 메소드를 오바라이드하면 하위 메소드가호출됨

int a = 10;
float b = 20;
b = a;

SuperClass super = new SubClass();

:예외!!) 상위 클래스의 static 메소드는 하위 클래스에서 오버라이드 불가능

=> 동적 바인딩과 정적 바인딩의 개념이 필요함

=> 동적 바인딩 : 런타임(Runtime)시점에 객체 타입을 기준으로 실행될 함수를 호출

=> 정적 바인딩 : 컴파일(Compile) 시점에 객체 타입을 기준으로 실행될 함수를 호출


==> static 키워드가 붙은 애들은 JVM에서 객체가 생성되기전 메모리에 올리기 때문에 

==> new SubClass는 static이 붙은 메소드 오버라이딩이 불가능하다.

==> 인스턴스 메소드는 런타임시에 성격이 결정되기 때문에 오버라이딩기 가능!!


참조)https://medium.com/webeveloper/%EC%9E%90%EB%B0%94-%ED%98%95%EB%B3%80%ED%99%98-casting-promotion-%EA%B3%BC-%EB%B0%94%EC%9D%B8%EB%94%A9-binding-ef3e453eb8a6


public class Main {
public static void main(String[] args) {

Animal cat = new Cat();
cat.bark();
cat.name();

}
}
public class Animal {
public void bark(){
System.out.println("Animal bark");
}

public static void name(){
System.out.println("name");
}
}
public class Cat extends Animal{
@Override
public void bark() {
System.out.println("Cat bark");
}

public static void name(){
System.out.println("cat");
}
}

===============================<출력결과>===============================

Cat bark

name



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


1. 배열의 선언

int[] array;
int array1[];

-    타입[ ] 변수명 or 타입 변수명[ ] 

-    대부분 타입뒤에 [ ]를 붙이는 형식


2. 배열의 생성

int[] array = new int[10];
int[] array1 = {1,2,3,4,5};

-    타입[] 변수명 =  new 타입[데이터사이즈];

-    new 키워드를 통해 원하는 사이즈의 메모리를 할당함.

-    new를 통한 키워드가 아닌 {}를 통해 배열을 초기화 할수도 있다.

-    배열 인덱스의 시작은 0부터 이다. 

-    new int[10]을 했다면 인덱스는 0~9까지 존재하게 된다.



3 . 2차원 배열 선언

int[][] array = new int[3][2];

-    2차원 배열은 대괄호( [ ] )가 2개가 생긴다. 첫번째 대괄호는 행을 두번째 대괄호는 열의 숫자를 나타낸다.

-    아래의 형태라고 볼수있다.    


 

 

 

 

 

 


아래의 코드로 데이터를 초기화 한다면?

int[][] array = new int[3][2];

array[0][0] = 0;
array[0][1] = 1;
array[1][0] = 2;
array[1][1] = 3;
array[2][0] = 4;
array[2][1] = 5;


이런 형태로 배열에 들어가 있다



8. 타입 추론과 var 


-    코드 작성 당시 정해지진 않았지만 , 컴파일러가 그 타입을 유추하는것

-    변수 타입을 선언하는것이 아니라 설정되는 값에서 유추함

-    var : 자바 10에 생긴 키워드이며 타입추론을 지원한다.





'JAVA' 카테고리의 다른 글

자바 Dispatch란? ( static , dynamic , double Dispatch )  (0) 2020.12.25
자바 상속이란?  (0) 2020.12.25
[JAVA] 클래스란?  (0) 2020.12.16
Java13 switch 연산자  (0) 2020.11.28
JAVA] Java code가 돌아가는 JVM 동작원리  (0) 2020.11.14

이 글을 공유합시다

facebook twitter googleplus kakaoTalk kakaostory naver band