[whiteship] 자바 온라인 스터디 - 데이터 타입, 변수, 배열

노력을 즐기는 사람·2020년 11월 21일
1
post-thumbnail

선장님이 알려주신 bundle에서 java in a nutshell 책을 참고해서 정리했습니다. 책이 정말 좋습니다. 만세~~

목차

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

Primivite type

Primitive Type의 종류/기본 값/값의 범위

TypeContainsDefaultSizeRange
booleantrue / falsefalse1 bitNA
charUnicode character\u0000 (null)16 bits\u0000 to \uFFFF (non-character)
byteSigned integer08 bits-128 to 127
shortSigned integer016 bits-32768 to 32767
intSigned integer032 bits-2147483648 to 2147483647
longSigned integer064 bits-9223372036854775808 to 922372036854775807
floatIEEE 754 floating point0.032 bits1.4E-45 to 3.4028235E+38
doubleIEEE 754 floating point0.064bits4.9E-324 to 1.7976931348623157E+308

The char Type

charUnicode 이다. Unicode 는 전세계 모든 언어를 컴퓨터로 표현하기 위해 디자인되었다.
자바는 char 접근법이 특이하다고 하다. javac에서 identifierliteralUTF-8 (가변 길이 인코딩) 로 받고 자바는 내부적으로 char를 고정 길이 인코딩으로 제공한다고 한다.
위와 같은 내부 사정은 개발자하고는 상관이 없다고 한다.(일반적으로..)

문법은 아래와 같다. 파이썬, 자바스크립트처럼 '' 로 쓰나 "" 로 쓰나 모두 문자열로 받아들여주지 않는다.

char test = '1'
char uni = '\000'

Floating-Point Types

학교에서 자주 배웠다. 컴퓨터에서 소수점을 정확히 표현해내는 것은 아주 어려운 일이라고.. 당연히 자바에서도 부동소수점을 사용해 소수를 표현한다.
부동소수점을 계산하는 방법은 까먹었지만 알고 있으니 넘어가자.
float 는 32 비트 부동소수점을 사용하고 double은 64비트 부동소수점을 사용한다.
부동 소수점 literal은 16진법, 8진법, 2진법으로 표현이 불가능하다.

아래와 같이 여러가지 형태로 선언할 수 있다.

123.45
0.0
.01
1.2345E02
1e-6
6.02e23
double d = 6.02E23; // double이 default
float f = 6.2e23f; // float를 사용할 때는 f라고 명시해줘야함

float 타입은 양의 방향에서 내려오는 0과 음의 방향에서 내려오는 0을 발생시킬 수 있다. 방향은 underflow가 발생한 방향이 결정한다.
그리고 또 NaN 이라는 값을 발생시킨다. Not-a-Number 의 약자인데 잘못된 연산을 시도했을 때 발생한다.

아래와 같이 위의 값들을 발생 시킬 수 있다.

double inf = 1.0/0.0;        // Infinity
double neginf = -1.0/0.0     // Negative infinity
double negzero = -1.0/inf    // Negative zero
double Nan = 0.0/0.0;        // Not-a-Number

Literals

위에서 자꾸 Literals 라는 녀석이 나오는데 처음 들어봤다. Literals 란 자바 소스 코드에 정의된 상수 값들을 말하는 것 같다. integer, floating-point numbers, single characters within single quotes, strings of characters within double quotes, ture, false, null을 말한다.

아래 예시를 보자

1 
1.0
'1'
1L
"one"
true
false
null

Primitive type vs Reference type

Typedefine byallow define moreSizestore wheregarbage collect automaticallyCall by
primitivejavanot allowed1 ~ 8 Bytesmemorynoreference
referenceuserallowedsubstantially more than primitiveheapyesvalue
  • primitive 는 java language로 정의되어 있다.
  • 프로그래머가 새로운 primitive 타입을 정의할 수 없다.
  • 한번에 하나의 값만 제공한다.
  • primitive types는 1~8바이트의 메모리를 사용한다.
  • primitive types를 변수에 저장하거나 메소드에 넘겨줄 때 컴퓨터는 메모리 자체를 복사해간다.
  • Reference types은 유저에 의해 정의되었다. 그래서 얼마든지 유저에 의해 더 정의될 수 있다.
  • 예를들어 도형을 표현하기 위해 Point라는 Datatype을 정의할 수 있다. 그러면 Spring에서 사용하는 Dto 같은 녀석도 Reference data type이라고 부를 수 있겠다.
  • 0개 혹은 다수의 primitive value or objects 를 포함할 수 있다.
  • 객체는 대체로 primitive 보다 더 많은 메모리를 필요로 한다.
  • 객체를 저장하기 위한 메모리는 객체가 생성된 시점에 힙 위에 동적으로 할당된다. 그리고 객체가 더 이상 사용되지 않으면 그 메모리는 자동으로 garbage collected된다.
  • 객체는 변수에 저장되거나 메소드에 전달할 때 메모리가 복사되지 않는다. 메모리의 참조만 저장되거나 메서드에 전달된다. call by value , call by reference를 말하는 듯하다. 영어 어렵다.

변수의 선언과 초기화

자바는 statically typed 언어이기 때문에 기본적으로 변수에 타입을 지정해줘야한다.

int counter;
String s;

자바에서는 초기화하지 않은 변수를 사용하는 것을 허락하지 않는다. 그래서 대부분의 경우 변수를 선언하는 동시에 초기화한다.

int counter = 0;
String s = readLine();
int[] data = {x+1, x+2, x+3};

변수 여러개를 한번에 초기화, 할당할 수도 있다. 단, 변수들은 같은 타입이어야 한다. (그러면 var 타입은 여러개 한번에 선언가능?) 당연히 안되더라.

int i, j, k; 
float x

값을 상수로 사용하고 싶으면 final을 사용하자. 딱 한번만 값을 할당할 수 있다.

final String greeting = getLocalLanguageGreeting();

변수의 라이프타임과 var 타입추론

오 자바에서 var를 사용하면 컴파일러에게 자동으로 타입을 추론하도록 요청할 수 있다.
신기하구먼

var i = 0 // type of i infereed as int
var s = readLine(); type of s inferred as String

foreach 문이랑 같이 쓰면 엄청 편하더라

TooLongNameDto tooLongNameDto = new TooLongNameDto();
for (var dto : tooLongNameDto) {
  // TODO
}

자바의 변수는 블록 스코프를 가진다 { } 안에서 선언된 변수는 그 블록 안에서만 사용가능하다. 메소드, 클래스 같은 녀석안에서만 사용 가능하다는 말이다.

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

괄호안에 데이터 타입이나 변수를 넣음으로써 변환, 캐스팅이 가능하다. 그런데 이 연산이 엄청 비싼 연산이라고 들었다. 어디서 주워들음..

(byte) 28          // integer -> byte 캐스팅
(int) (x + 3.14f)  // float 연산 -> integer 캐스팅

프로모션은 서로 포함관계가 있는 것을 나타낸다고 이해하면 좋을 것 같다.

byte, short, char -> int 로 프로모션 가능하다.
long은 연산을 거치면 결과값을 long으로 만들어버린다.
float는 연산을 거치면 결과값을 float로 만들어버린다.
double도 연산을 거치면 결과값을 double로 만든다.

primitive 타입변환 테이블을 참고해서 프로모션, 캐스트가 어떻게 일어나는지 파악하자.

N은 타입 변환이 불가능하다는 뜻이다.

Y는 확장 변환이 가능하다는 뜻이고 자바에 의해 자동으로 암시적 형변환이 발생한다. 그래서 연산을 하면 자연스럽게 형변환이 발생한다. 언어를 처음 배울 때 이 녀석 때문에 버그를 많이 발생시키기도 했다 ㅠㅠ

C는 축소 변환이 가능하다는 뜻이고 프로그래머에 의해 명시적 형변환을 해줘야한다. 명시적 형변환은 위와 같이 괄호 안에 타입을 넣어 지정하는 것을 말한다.

Typebooleanbyteshortcharintlongfloatdouble
boolean-NNNNNNN
byteN-YCYYYY
shortNC-CYYYY
charNCC-YYYY
intNCCC-YY*Y
longNCCCC-Y*Y*
floatNCCCCC-Y
doubleNCCCCcC-

배열은 너무 쉬우니까.. 1차는 []하나만 2차는 [][] 2개를 쓰자
코딩 테스트 때 2차 배열을 활용해서 2차원 좌표 문제를 해결하기도 한다.

profile
노력하는 자는 즐기는 자를 이길 수 없다

2개의 댓글

comment-user-thumbnail
2020년 11월 24일

var과 foreach문 메모.. 하겠습니다

1개의 답글