[JAVA스터디] 2주차- 자바 데이터 타입, 변수 그리고 배열JAVA스터디] 2주차- 자바 데이터 타입, 변수 그리고 배열

Hyewon·2021년 3월 13일
0

javastudy

목록 보기
2/3
post-thumbnail

백기선 선생님과 함께하는 JAVA스터디 2주차

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

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

typesize in bytesrangedefault value
boolean정의되지 않음(일반적으로 1byte)true or falsefalse
charunsigned 2byte'\u0000'(0) to '\uffff'(65535)'\u0000'
byte1byte-128 to 1270
short2byte-32,768 to 32,7670
int4byte-231 to -231-10
long8byte-263 to -263-10
float4byte(6~7자리 정밀도)0.0f
double8byte(15자리 정밀도)0.0d

참고 : https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

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

  • primitive type은 자바에서 기본적으로 제공하는 데이터형을 의미한다. 기본적으로 기본형이 아닌 것은 참조형이라고 생각해도 된다.
  • 기본형으로 변수를 선언하게 되면 표에 나온 고정된 크기로 저장되고 변수에 데이터의 값을 저장하게 된다.
  • 하지만 reference type은 변수를 선언할 때 크기가 정해져 있지 않고 값이 변수에 할당될 때 저장할 메모리에 대한 주소가 저장되어 있다.
  • 기본적으로 기본형은 Runtime Data area에서 스레드영역안에 스택영역에 생성이 되고, 참조형은 힙영역 안에서 생성이 된다.

리터럴

  • 리터럴은 데이터 그 자체를 뜻한다.
    변수에 넣는 변하지 않는 데이터를 의미하는 것이다.

    int a = 10;
    여기서 10은 리터럴이 된다.

  • 상수와 리터럴을 구분해야하는데, 상수는 변하지 않는 변수(메모리 위치)를 의미하며 final을 붙여서 변수를 선언하면 된다.

  • 리터럴은 변수의 값이 변하지 않는 데이터(메모리 위치안의 값)이다.

명시적 선언을 위한 정수 리터럴

btye value1=120;
int value3=300;
long value4= 25000L;

여기서 vlaue4를 보면, 숫자 뒤에 대문자 L(혹은 소문자l)을 붙이는 경우가 있는데 이것은 변숫값이 long형이라고 명시적으로 선언하는 것이다. 이러한 문자표기법을 자바에서는 정수 리터럴이라고도 한다.

부동 소수형 리터럴

float price = 2.99f;

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

int a;

  • 변수를 선언하기 위해서는 변수타입과, 변수명을 지정해주어야한다.
  • 변수는 메모리 영역에 데이터를 저장할 공간을 의미하고, 그 공간에 대한 이름이 변수명이 되는 것이다.
  • 이렇게 변수를 선언하면 메모리의 빈공간에 변수타입의 크기만큼의 공간이 확보가 되고, 이름을 붙여서 그 저장된 공간을 사용할 수 있게 되는 것이다.

int a=100;

  • 변수의 초기화란 변수를 사용하기 전에 처음으로 값을 저장하는 것을 말한다.
  • a라는 변수에 100이라는 변수의 값을 대입시키는 것이다.
  • 이렇게 되면 100이라는 값은 JVM 메모리에 할당됨을 의미한다.
  • 변수의 초기화를 생략하는 경우도 있지만, 사용되기 전에 적절한 값으로 초기화를 지정해주는 것이 좋다.
    - 단, 지역변수는 무조건 초기화를 시켜야 한다.

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

  • 변수의 스코프(영역)은 변수에 접근하거나 접근할 수 있는 유효한 영역을 말한다.
  • 변수의 라이프타임은 즉, 변수의 생명주기. 변수가 살아있는 기간을 말한다.

인스턴스 변수

  • 클래스 내부와 모든 메소드 및 블록 외부에 선언된 변수

클래스 변수

  • 클래스 내부, 모든 블록 외부에서 선언되고 static으로 표시된 변수

지역변수

  • 인스턴스 및 클래스 변수가 아닌 모든 변수

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

  • 타입 변환 : 하나의 타입을 다른 타입으로 바꾸는 것.

1) 묵시적 타입 변환 (== 타입 프로모션)

자동으로 타입을 변환 시키는 것

double a = 10;
double b= 10.0f + 3.14;
System.out.println(a);
System.out.println(b);

여기서 a의 결과는 10.0이 된다. int 데이터인 10을 넣었지만 double 형식이기 때문에 자동으로 타입 변환이 된다.
b의 결과는 float와 double의 데이터의 산술 연산을 수행하여서 float데이터가 double로 자동 타입 변환 된다.

2) 명시적 타입 변환 (== 캐스팅)

사용자가 type cast를 강제로 수행하는 것
(변환할 타입)변환할 데이터

int a =1;
int b=2;
double res1 = a/b;
double res2 = (double) a/b;

여기서 res1은 0.0이 출력된다. int형이 0으로 반환되어서 double에 결과가 대입될 때 자동으로 0.0으로 대입이 되는 것이다.
res2의 결과는 0.5가 된다. 피연산자 중의 하나의 타입이 double형이 되면, 나눗셈 연산을 위해 나머지 하나의 피연산자도 자동으로 타입 변환이 된다.

1차 및 2차 배열 선언하기

  • 배열은 같은 데이터형을 갖는 객체들의 집합이다.

1차원 배열 선언

[데이터형] 배열이름[] = new [데이터형][배열길이];
[데이터형] 배열이름[] = new 데이터형[]{ [객체0],[객체1], .... };
[데이터형] 배열이름[] = new { [객체0], [객체1].... };

원래는 [데이터형][] 배열이름 = new [데이터형][배열길이];
이렇게 많이 사용하는데 뭔가 나는 c언어를 먼저 접해서 그런지 항상 배열이름[];
이렇게 쓰게 된다.. 이게 더 익숙한데 둘다 상관없으니까 난 이렇게 써야지

사용예) String str[]=new String[19];
String str[] = new String[]{"a","b","c"};
String str[]= {"a","b","c"};

2차원 배열 선언

  • 2차원 배열도 1차원 배열이랑 비슷하게 선언할 수 있다.

    [변수형] 배열이름 [][]= new [변수형][1차원배열 길이] [2차원 배열길이];
    [변수형] 배열이름 [][]=new 변수형[][]{ {1차원객체1,1차원객체2},{2차원객체1,2차원객체2}};
    [변수형] 배열이름 [][]= {{1차원객체1,1차원객체2},{2차원객체1,2차원객체2}};

이렇게 쓰니까 좀 복잡해보이지만 실은 엄청 간단하다.

String arr[][]= new String[10][20];
String arr[][]= new String[][]{ {"a","b","c"}, {"d","e","f"} };

2차원 배열만 가능한 것이 아니라 다양한 다차원배열도 이런식으로 사용이 가능하다.

타입 추론, var

  • 타입 추론 : 개발자가 명시적으로 변수의 타입을 지정하지 않고 컴파일러가 알아서 이 변수의 타입을 대입된 리터럴로 추론하는 것을 말한다.
  • 쉽게 생각하면 javascript에서 var를 사용하는 것을 말하는데, 자바에서도 가능한지는 몰랐다...허허
  • 자바 10부터 type-inference가 가능하다.

하지만 var를 사용할 때 주의해야할 점이 몇가지 있다.

var

  1. 초기화 값이 있는 지역변수로만 선언이 가능하다.
  2. null값으로 초기화 될 수 없다.
  3. 람다 표현식에는 var를 사용할 수 없다.
  4. 배열을 선언할 때 var 대신 타입을 명시해주어야한다.
profile
#back_end #developer #🐥

0개의 댓글

관련 채용 정보