경주장

2주차 과제. 자바의 프리미티브 타입, 변수 그리고 배열(~1/20) 본문

JAVA/whiteship_live-study

2주차 과제. 자바의 프리미티브 타입, 변수 그리고 배열(~1/20)

달리는치타 2022. 1. 16. 23:27

2주차 과제. 자바의 프리미티브 타입, 변수 그리고 배열

  • 프리미티브 타입 종류와 값의 범위 그리고 기본 값
  • 프리미티브 타입과 레퍼런스 타입
  • 리터럴
  • 변수 선언 및 초기화하는 방법
  • 변수의 스코프와 라이프타임
  • 타입 변환, 캐스팅 그리고 타입 프로모션
  • 1차 및 2차 배열 선언하기
  • 타입 추론, var

 


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

값의 종류 기본 타입 메모리 크기 범위 기본값
정수 byte 1byte -2^7~(2^7-1) 0
char 2byte 0~(2^16-1) '\u0000'
short 2byte -2^15~(2^15-1) 0
int 4byte -2^31~(2^31-1) 0
long 8byte -2^63~(2^63-1) 0L
실수 float 4byte (+/-)1.4E-45~(+/-)3.4028235E38 0.0F
double 8byte (+/-)4.9E-324~(+/-)1.7976931324E308 0.0
논리 boolean 1byte true,false false

컴파일러는 정수 리터럴을 int로, 실수 리터럴을 double로 생각한다.

 

  • 실제 값을 저장하는 공간은 스택(Stack) 영역입니다.
  • 만약 컴파일 시점에 담을 수 있는 크기를 벗어나면 에러를 발생시키는 컴파일 에러가 발생합니다.

 


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

 

데이터 타입은 메모리 안에 저장된 데이터의 종류를 분류하는 데 사용하는 메모리 집합에 관한 메타데이터다.
데이터에 대한 분류는 암시적으로 어떤 종류의 연산이 해당 데이터에 대해 수행될 수 있는지를 결정한다.

 

 

자바의 참조 타입에는 Class, Interface, Enum, Array 4가지가 있습니다.

기본 타입과 참조타입의 차이점은 저장되는 값이 무엇이냐입니다. 

primitive type은 실제값을 stack에 저장하지만 ref type은 heap의 객체 주소를 stack에 저장합니다.


primitive type과 reference type의 ==, !=연산

 

기본 타입 변수의 ==, !=연산은 변수의 값이 같은지, 아닌지를 조사하지만 참조 타입 변수들 간의 ==, !=연산은 참조값이 같은지 아닌지를 조사합니다. 즉 ==, !=연산은 항상 스택메모리에 저장된 값을 비교합니다.

 

참조 타입 변수는 힙 영역의 객체를 참조하지 않는다는 뜻으로 null값을 가질 수 있습니다.


대표적인 참조 타입 중 하나인 String을 통해 참조타입과, String class의 특징을 간단히 알아보겠습니다.

자바는 문자열 리터럴이 동일하다면 String 객체를 공유하도록 되어 있습니다. 이는 효율적인 힙 메모리 사용을 가능하게합니다.

 

리터럴을 대입을 통해 String을 생성하면 String객체의 값은 JVM Heap 안 Constant Pool의 StringPool에 값이 저장됩

니다. 

 

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3==s4);

=> true, false, false

 

Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable

String.java의 생성자 doccument comment

 

System.out.println(s1.equals(s2));
System.out.println(s1.equals(s3));
System.out.println(s3.equals(s4));

=> true, true, true

문자열 자체를 비교하는 .equal( ) 매서드의 결과는 모두 true이다. 


리터럴

변수의 초기값으로 소스 코드내에 직업 입력된 값을 리터럴(literal)이라고 부른다.

 

정수 리터럴 - 0,75,-100, 02, -04, 0x5, 0xAC08, ...
  • 정수 리러럴을 저장할 수 있는 타입은 byte, char, short, int, long이다. 
실수 리터럴 - -.25, -3.14, 5E7, 0.12-E ...
  • 실수 리터럴을 저장할 수 있는 타입은 float, double이 있다.
문자 리터럴 - 'a', '한', '\t', '\n' ...
  • 문자 리터럴을 저장할 수 있는 타입은 char 하나 뿐이다.
문자열 리터럴 - "hello world", "헬로 월드" ...
  • 문자열 리터럴을 저장할 수 있는 타입은 String 하나뿐이다.
논리 리터럴 - true, false ...
  • 논리 리터럴을 저장할 수 있는 타입은 boolean 하나뿐이다.

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

참고 . 변수 = 하나의 값을 저장할 수 있는 메모리 공간

변수 선언은 다음과 같다.

//타입 변수이름;
int age;			//정수 (int)값을 저장할 수 있는 age 변수 선언
double value;		//실수 (double)값을 저장할 수 있는 value변수 선언

같은 타입의 변수는 콤마를 이용해서 한꺼번에 선언할 수도 있다.

int x,y,z;

 

변수의 초기화

int score; //변수 선언
score = 80; //값 저장

초깃값은 변수를 선언함과 동시에 줄 수도 있다.

int score = 90;

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

 

변수는 중괄호 { } 블록 내에서 선언되고 사용된다. 중괄호 블록은 클래스, 생성자, 메소드이다.

변수는 생성위치와 선언 방식에 따라 아래의 3가지 종류를 가진다

  • 클래스에 선언된 변수중 static 키워드를 포함한 변수, 객체 외부 클래스 영역에 존재 -  클래스 변수
  • static 키워드를 포함하지 않은 변수, 객체 내부에 존재 -  인스턴스 변수
  • 메소드, 혹은 생성자에 선언된 변수- 지역 변수

클래스에 선언하는 변수인 클래스 변수와 인스턴스 변수를 통틀어서 class의 field, 멤버 변수, 전역 변수라고도 부른다.

 

분류 init destroy
지역변수 중괄호 시작 { 중괄호 끝 }
인스턴스변수 new 연산자로 객체가 생성될 때 해당 객체에 대한 참조가 모두 끊어져 GC의 대상이 될때
클래스 변수 클래스가 처음 호출될때 자바 프로그램이 종료될때

 

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

타입 변환

타입 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것을 말한다.
e.g. byte->int, int->byte, ...

타입 변환의 종류

자동 타입 변환(Promotion)/ 강제 타입 변환(Type Casting)


자동 타입 변환(Promotion)

자동 타입 변환은 프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것을 말한다. 
작은 크기의 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.

 

byte byteValue1 = 10;
int intValue1 = byteValue1; // Promotion!

int intValue2 = 200;
long longValue = intValue2; //200L - Promotion!
double doubleValue = intValue2; //200.0 - Promotion!

char charValue = 'A';
int intValue3 = charValue // 65 - Promotion!

byte byteValue2 = 65;
//char charValue = byteValue2; - Not Allowed!

byte(1byte)->char(2byte)의 경우 메모리 크기는 char이 크지만 표현하는 범위가 포함되지 않기 때문에 promotion이 일어나지 않는다 (Type Casting)은 가능 


강제 타입 변환(Casting)

강제적으로 큰 데이터 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 강제 타입 변환이라고 한다.

정수형 -> 정수형 : Byte Drop

실수형 -> 정수형 : truncate (i.e. drop everything after the decimal dot)

 

* Data의 손실이 발생 할 수 있으므로 캐스팅하는 타입의 표현범위 및 Precision(정밀도)를 고려하여 신중하게 활용!


1차 및 2차 배열 선언하기

작성했는데 두번 날라 갔습니다...

 


타입 추론, var

작성했는데 두번 날라 갔습니다...