※ 목차
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;
0 |
1 |
2 |
3 |
4 |
5 |
이런 형태로 배열에 들어가 있다
8. 타입 추론과 var
- 코드 작성 당시 정해지진 않았지만 , 컴파일러가 그 타입을 유추하는것
- 변수 타입을 선언하는것이 아니라 설정되는 값에서 유추함
- var : 자바 10에 생긴 키워드이며 타입추론을 지원한다.
자바 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 |