on
[백기선] 2주차 과제: 자바 데이터 타입, 변수 그리고 배열
[백기선] 2주차 과제: 자바 데이터 타입, 변수 그리고 배열
728x90
프리미티브 타입 종류와 값의 범위 그리고 기본 값
프리미티브 타입은 기본형으로도 불리며 논리형과 숫자형 문자열형 등의 기본적인 데이터 타입이다.
자바의 기본 타입으로서 정수, 실수, 문자, 논리 리터럴을 직접 저장하는 타입이다.
값의 종류 기본 타입 메모리 사용 크기 저장되는 값의 범위 정수 byte 1 byte 8 byte -27 ~ (27 - 1)(-128 ~ 127) char 2 byte 16 bit 0 ~ 216 -1(유티코드 \u0000 ~ \uFFFF, 0 ~ 65535) short 2 byte 16 bit -215 ~ (215 -1)(-32,768 ~ 32,767) int 4 byte 32 bit -231 ~ (231 -1)(-2,147,483,648 ~ 2,147,483,647) long 8 byte 64 bit -263 ~ (263 - 1) 실수 float 4 byte 32 bit (+/-)1.4E-45 ~ (+/1)3.4028235E38 double 8 byte 64 bit (+/-)4.9E-324 ~ (+/-)1.7976931348623157E308 논리 boolean 1 byte 8 bit true, false
byte 타입 색상 정보 및 파일 또는 이미지 등의 이진데이터를 처리할 때 주로 사용
short 타입 정수값을 저장할 수 있는 데이터 타입이며, C언어와의 호환을 위해 사용되며 비교적 자바에서는 잘 사용하지 않는다.
int 타입 자바에서 정수 연산을 하기 위한 기본 타입이며 byte 타입 또는 short 타입의 변수를 + 연산하며 int 타입을 변환된 후 연산되고 연산의 결과 역시 int가 된다. 그 이유는 자바에서 정수 연산을 4byte로 처리하기 때문이다.
long 타입 수치가 큰 데이터를 다루는 프로그램에서는 long 타입이 필수적으로 사용되며, 대표적인 예가 은행 및 우주와 관련 프로그램 들이 있다. long 타입의 변수를 초기화 할 때에는 정수값 뒤에 소문자 'l'이나 대문자 'L'을 붙일 수 있다. 4byte 정수 데이터가 아니라 8byte 정수임을 컴파일러에게 알려주기 위해서다. int 타입의 범위를 넘어가는 경우 소문자 'l' 혹은 대문자 'L'을 붙여야 에러가 나지 않기에 반드시 붙여줘야 한다.
실수 타입(float, double) 메모리 사용 크기에 다라 float, double로 나뉜다.
논리 타입(boolean) 두 가지 상태값을 저장할 필요성이 있을 경우 사용한다. 상태값에 따라 조건문과 제어문의 실행 흐름을 변경하는데 주로 이용한다.
프리미티브 타입과 레퍼런스 타입
자바 변수의 데이터 타입에는 프리미티브 타입과 레퍼런스 타입이 존재한다.
프리미티브(기본형 변수)는 언어에서 사전 정의 되어있는 데이터 타입이며 레퍼런스 타입(참조형 변수)는 프리미티브의 wrapper객체로서 object를 상속한 개체형으로 나타난다.
기본형 변수
실제 값을 저장
참조형 변수
어떤 값이 저장되어 있는 주소를 값으로 가짐
프로그래머가 직접 만들어 추가할 수 있어서 그 개수가 정해져 있지 않다.
참조형 변수를 선언할 때 변수의 타입으로 클래스의 이름을 사용하므로 클래스의 이름이 변수의 타입이 된다.
새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 것이 된다.
선언 방법 클래스 이름 변수명; Date today; Date 클래스 타입의 참조변수 today를 선언하기 Date today = null; or Date today = new Date(); 참조형 변수는 null 또는 객체의 주소를 값으로 갖고 참조변수의 초기화는 위와 같이 한다. 객체를 생성하는 연산자 new의 ㅅ연산결과는 생성된 객체의 주소이며 이 주소가 대입연사자(=)에 의해 참조변수 today에 저장되고 참조변수 today를 이용해 생성된 객체를 사용할 수 있다.
자바는 C언어와 달리 String을 제외한 참조형 변수 간의 연산이 불가능하므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.
리터럴
프로그램에서 직업 표현한 값으로 소스 코드의 고정된 값을 대표하는 용어이다.
종류는 정수, 실수, 문자, 논리, 문자열 리터럴이 있다.
정수 리터럴
10진수, 8진수, 16진수, 2진수 리터럴이 있다.
int a = 15; int b = 015; int c = 0x15; int d = 0b0101;
15 -> 10진수 리터럴 15 015 -> 0으로 시작하면 8진수, 십진수값으로 13을 출력 0x15 -> 0x로 시작하면 16진수, 십진수값으로 21을 출력 0b0101 -> 0b로 시작하면 2진수, 십진수값으로 5를 출력
실수 리터럴
소수점 형태나 지수 형태로 표현한 값이며 double로 컴파일 되지만 숫자 뒤에 f(float) 혹은 d(double)을 명시적으로 붙이기도 한다.
double f = 0.1234; double g = 1234E-4;
float는 반드시 f를 붙여줘야 하고 double는 생략가능하다.
float h = 0.1234f; double i = .1234D;
문자 리터럴
단일 인용부호('')로 문자를 표현한다.
char a = 'H'; char b = "한"; char c = \uae00;(유니코드값) (\u다음에 4자리 16진수로, 2바이트의 유니코드(Unicode))
문자열 리터럴
문자열은 기본타입이 아니며, ("")로 문자열을 표현한다.
String lter = "JAVA"; lter + 26 = "lter26"(문자열 출력)
논리 타입 리터럴, 외 리터럴
boolean 타입 변수에 치환하거나 조건문에 이용한다.
boolean a = true; boolean b = 10 >0; (여기선 b값이 true) boolean c = 0; (c언어와 달리 boolean 타입으로 1,0을 참, 거짓으로 사용 불가)
null 리터럴은 레퍼런스에 대입해서 사용한다.
기본타입에는 사용이 불가하고 String 같은 경우에는 사용가능하다.
int a = null(에러 발생) String str = null; str = "JAVA"
변수 선언 및 초기화하는 방법
변수 선언하기
public class TestObject { int number; String name; }
변수 초기화 하기
public class TestObject { int number = 123; String name = "test" }
변수의 스코프와 라이프타임
변수의 스코프
변수에 접근하거나 접근할 수 있는 유효 범위/ 영역이다. 일반적인 규칙은 변수가 선언된 블록내에서만 엑세스 할 수 있다는 것이다. 블록은 왼쪽 중괄호 { 로 시작하고 오른쪽 중괄호 } 로 끝난다.
변수의 라이프 타임
변수가 메모리에서 살아있는 기간을 말한다.
Instance Variables
정의 클래스 내부와 모든 메소드 및 블록 외부에서 선언된 변수
scope 정적 메서드를 제외한 클래스 전체
라이프타임 객체가 메모리에 남아있을 때까지
예시
Class Variables
정의 클래스 내부, 모든 블록 외부에서 선언되고 static으로 표시된 변수
scope 클래스 전체
라이프타임 프로그램이 끝날때까지 또는 클래스가 메모리에 로드 되는 동안
예시
Local Variables
정의 인스턴스 및 클래스 변수가 아닌 모든 변수
scope 선언된 블록 내에 있음
라이프타임 컨트롤이 선언 된 블록을 떠날때까지
예시
타입 변환, 캐스팅 그리고 타입 프로모션
타입변환
데이터 타입을 다른 데이터 타입으로 변환하는 것이다.
타입변환에는 두 가지 종류가 있다. 자동(묵시적) 타입 변환 강제(명시적) 타입 변환
캐스팅
강제적으로 큰 데이터를 타입을 작은 데이터 타입으로 쪼개어서 저장하는 것을 강제 타입 변환(Casting)이라고 한다.
예시
int testIntValue = 123456789; byte textByteValue = (byte) testIntValue; // 강제 타입 변환 (캐스팅) double doubleTestValue = 3.14; int textIntValue = (int) doubleTestValue; // textIntValue는 정수 부분인 3만 저장한다.
타입 프로모션
프로그램 실행 도중에 자동적으로 타입 변환이 일어나는 것이다.
자동 타입 변환은 작은 크기를 가지는 타입이 큰 크기를 가지는 타입에 저장될 때 발생한다.
프로모션의 경우엔 변환 이전의 값과 변환 이후의 값이 동일한다.
byte byteTestValue = 10; int intTestValue = byteTestValue; // 자동 타입 변환이 일어난다.
1차 및 2차 배열 선언하기
배열
동일 타입의 값을 여러개 취급할 수 있는 기능이다.
인덱스라고 불리는 [] 로 감싼 0부터 시작하는 정수를 사용하여 배열의 길이나 순서를 나타낼 수 있다.
로 감싼 0부터 시작하는 정수를 사용하여 배열의 길이나 순서를 나타낼 수 있다. 타입에 따라 디폴트 값으로 채워진다. 참조 : null float, double : 0.0 bool : false char : \u0000
1차 배열 선언
int []array = new int[10];
초기 값이 {0,0,0,0,0,0,0,0,0,0} 과 같이 0으로 10개 값이 초기화된다.
1차 배열에 값 넣기
int[] array = new int[5]; array[0] = 1; array[1] = 3; array[2] = 6; array[3] = 1; array[4] = 1;
2차 배열 선언
int [][]array = new int[10][10];
2차 배열에 값 넣기
int [][]array = new int[5][5]; array[0][0] = 1; array[0][1] = 12; array[0][2]= 2; array[1][0] = 1; array[2][0] = 1; ...
타입 추론, var
Java 10에서 var 라는 Local Variable Type-Inference가 추가 되었다.
라는 Local Variable Type-Inference가 추가 되었다. 타입추론 정적 타이핑을 지원하는 언어에서, 타입이 정해지지 않은 변수에 대해서 컴파일러가 변수의 타입을 스스로 찾아낼 수 있도록 하는 기능이다. 즉, 타입을 명시하지 않아도 된다는 뜻이고 이것은 코드량을 줄이고 코드의 가독성을 높일 수 있다.
기존 자바는 일반 변수에 대해 타입추론이 지원되지 않고, generics와 lambda식에 대해서만 타입 추론을 지원하고 있었다.
다이아몬드 연산자를 같이 사용하면 어떤 데이터 타입이 들어오는지 확인하기 어려워 컴파일 에러가 발생한다.
지원예시
var name = "test";
자바 9 이하 String name = "test";
자바 10 이상 var name = "test";
참고
https://devjun.tistory.com/54
https://hggggggk.wordpress.com/2013/07/04/%EC%B2%AB%EB%B2%88%EC%A7%B8%EA%B3%BC%EC%A0%9C2-primitive-type%EA%B3%BC-reference-type%EC%9D%98-%EC%B0%A8%EC%9D%B4/
https://mine-it-record.tistory.com/100
https://league-cat.tistory.com/410
https://league-cat.tistory.com/411
https://devjun.tistory.com/57
https://league-cat.tistory.com/413
728x90
from http://maximum-curry30.tistory.com/287 by ccl(A) rewrite - 2021-10-10 14:28:08