경주장
2주차 과제. 자바의 프리미티브 타입, 변수 그리고 배열(~1/20) 본문
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
작성했는데 두번 날라 갔습니다...
'JAVA > whiteship_live-study' 카테고리의 다른 글
5주차 과제: 클래스 #5 나머지! (0) | 2022.02.21 |
---|---|
5주차 과제: 클래스 #5 (~02.15) (0) | 2022.02.08 |
4주차 과제. 제어문(~2/10) (0) | 2022.02.07 |
3주차 과제. 연산자(~1/27) (0) | 2022.01.24 |
1주차 과제: JVM은 무엇이며 자바 코드는 어떻게 실행하는 것인가. (0) | 2022.01.06 |