All of My Records

[Java] 자바의 자료형(Java의 Data Type), 변수(Variable)

by 캐떠린

Java의 Data Type(자료형)

  • 데이터(자료)의 형(形)태
  • 데이터의 길이(범위)와 생김새를 미리 정의하고, 그 정의에 따라 분류해놓은 규칙
  • 자바(Java)의 자료형: 형태 + 길이
  • 예시
    • 학생 시절 우리는 100, 200, 300을 정수라고 배웠다. 이는 자료형이다.
    • 3.14, 5.33, 2.13는 실수라고 배웠다. 이것 또한 자료형이다.
    • ‘홍길동’, ‘자바’, ‘컴퓨터’는 문자라고 배웠다. 이것 또한 자료형이다.
  • 자바의 자료형원시형 또는 값형참조형 2가지로 나뉜다.
    여기서 '원시'는 '처음부터 가지고 있음'을 의미한다.

 

✓ 프로그래밍 언어 → 그 언어의 자료형이 매우 중요하다.
✓ 프로그램 = 데이터 + 행동 → 흐름을 나타낸다.

 

1. 원시형(Primitive Type), 값형(Value Type)

  1. 숫자형
    1. 정수형
      • byte → 1byte → -128 ~ 127
      • short → 2byte → -32,768 ~ 32,767
      • int → 4byte → -2,147,483,648 ~ 2,147,483,647
      • long → 8byte → -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
    2. 실수형
      • float → 4byte : 무한대(범위가 있긴 있으나 사실상 무한대), 단정도형. double형에 비해 정밀도가 떨어진다.
      • double → 8byte : 무한대, 배정도형. 따라서 정밀도가 더 높다.(→ 구체적인 세밀한 숫자까지 표현할 수 있다.)
  2. 문자형
    1. 문자형
      • char(character) → 2byte : UniCode, 부호 비트가 없으므로 0 ~ 65,535 표현이 가능하다.
        문자를 컴퓨터가 이해하는 숫자로 변환(문자표 → 각 문자별로 특정 숫자로 변환한다는 것을 약속한 것)
        문자 데이터임을 표시하기 위해 ' '(작은따옴표)를 사용한다. 작은 따옴표 없이 오는 단어는 예약어가 아닌 이상 변수로 취급한다.
        1글자만 표현 가능하다.
  3. 논리형
    1. 논리형
      • boolean → 1byte → true, false
        00000001 = True = 참
        00000000 = False = 거짓

 

2. 참조형(Reference Type)

  • String
    • 문자열(문자들이 열을 지어있는 형태) → 문자 집합 → char가 여러개..
    • ⚠️주의⚠️ 대문자로 시작하며, 자주색으로 변하지 않는다. → 추후 다시 배울 때 이유가 나온다.
    • " "(큰따옴표)를 사용한다.
  • 클래스
  • 배열 등...

 

각 자료형 별로 표현 가능한 숫자 범위를 디테일하게 외울 필요는 없으나, 대략적으로 알아두면 앞으로 편하니 알아두기!
아래와 같은 코드를 사용하면 프로그램에서 해당 자료형의 범위를 확인할 수도 있다.
System.out.println(Byte.MAX_VALUE);
System.out.println(Byte.MIN_VALUE);

//Byte.MAX_VALUE, Byte.MIN_VALUE
//Short.MAX_VALUE, Short.MIN_VALUE
//Integer.MAX_VALUE, Integer.MIN_VALUE
//Long.MAX_VALUE, Long.MIN_VALUE

 

실수형 모두 유효자리수가 너무 길어지면 해당 뒷자리는 0으로 치환이 되어 데이터 손실분이 발생한다. 그러므로 정밀한 숫자 계산은 실수형으로 하면 오류가 발생한다. → 유한한 공간 안에 데이터를 저장하는 것이기 때문에 만능은 아니다.
Ex) 3.33333333333333333333333333… 이건 무한 소수지만 유한한 데이터 공간 안에 작업하는 거이기 때문에 뒤의 내용은 생략된다. 그래서 실질적으로 실수형을 사용하는 경우는 적다고 한다?!
//단정도형
float f1;
f1 = 3.14F; //Type mismatch: cannot convert from double to float
//뒤에 F붙이면 float형 실수가 됨!(대소문자 구분X)
System.out.println(f1);


//배정도형
double d1;
d1 = 6.28D; // double의 D는 생략 가능
System.out.println(d1);

f1 = 123.1234567890123456789012345678901234567890F;
d1 = 123.1234567890123456789012345678901234567890D;

System.out.println(f1);
System.out.println(d1); //float 대비 자리수 더 detail하게 표현해줘서 정밀도가 높다고 함. 소수에서 뿐만 아니라 정수에서도 그렇다. 아래를 봐보시오!

f1 = 123456789012345678901234567890F;
d1 = 123456789012345678901234567890D;

System.out.println(f1);
System.out.println(d1);

double d2 = 0.25;
System.out.println(d2);

double d3 = 0.1;
System.out.println(d3);

System.out.println(0.1 + 0.2); //약간의 오차 발생

 

1 byte = 8 bit 이므로 이 안에 들어갈 경우의 수는 256가지이다. 즉, 십진법의 정수 0~255까지 저장이 가능하다는 말인데 이 경우는 양수만 저장한다는 가정에만 해당된다. 음수의 경우 8 bit 중 1 bit를 부호비트로 사용한다. (부호비트에 0을 넣으면 양수, 1을 넣으면 음수로 판단)
음수를 포함한 범위로는 -128 ~ 127(0은 양수로 빼버림)이 되는데, 이게 바로 Java의 자료형에 쓰이는 byte 자료형이다. 

 

Memory의 공간을 최소한으로 얻어오고 낭비하지 않기 위해 개발자는 해당 프로그램의 Data 길이와 형태를 생각하여 자료형을 지정해야 한다.

 


변수, Variable

개발자가 명령어를 사용해서 메모리에 할당받은 공간

변수를 생성한다는 말은 메모리로부터 공간을 할당 받는다는 말과 같다.

 

변수를 생성하는 방법은 아래와 같다.

//자료형 변수명;
int score;

 

예를 들어 아래와 같은 요구사항이 있다고 가정하자.

요구사항: 학생 1명의 국어 점수를 저장한 후, 화면에 출력하시오.

 

이를 위해서는 메모리 어딘가에 사용할 공간 = '변수'를 할당받아야한다.

변수를 할당 받기 위해 우리는 먼저 데이터 성질을 파악해야한다.

1. 형태 파악 → 정수인지? → byte, short, int, long

2. 길이 파악 → 어떤 범위의 숫자를 담을것인지? → 0 ~ 100 byte

위와 같이 데이터 성질을 파악했다면 변수를 생성해보자.

 

1. 생성하기

//변수 생성, 변수 선언
// - 변수명: 메모리 주소 번지의 별명
byte kor;

 

2. 변수 초기화

 - 변수 = 값 의 의미는 "오른쪽에 있는 숫자(값)을 왼쪽의 변수에 넣어주세요." 라는 뜻이다.

   여기서 '='는 대입 연산자, 할당 연산자이다.

kor = 100;

//LValue(변수) = RValue(상수, 변수)
//********** LValue와 RValue는 자료형이 동일해야 한다.

 

3. 변수 호출, 변수 사용

System.out.println(kor);

 

4. 실행(Run): Ctrl + F11

//실행값
100

 

변수 생성 방법 및 주의할 점

byte kor; //변수 선언
kor = 100; //초기화
System.out.println(kor); //출력
  • 각 1줄은 문장(Statement) → 1개 이상의 표현식
  • 문장 종결자: ;

 

※ 주의할 점

1. Duplicate local variable kor (동일한 지역 변수 'kor'이 있다.)

  • 같은 이름의 변수명을 2개 이상 선언 불가능
  • 변수명은 유일해야 한다.

 

변수명을 만들 때 규칙

변수명을 만들 때 규칙은 모든 것의 식별자를 만들 때 규칙과도 다름 없다.

  1. 영문자 + 숫자 + _ 만 사용한다. → 관습적 + 물리적
  2. 숫자로 시작 불가능 → 물리적으로 불가능
  3. 예약어(public, class, int) 사용 불가능
  4. 의미있게(★★★★★) 생성하기 → 풀네임으로 → 과도하게 생략하여 의미를 알아볼 수 없지 않도록
  5. 대소문자 구분
byte kor1;
byte kor_1;
byte kor$ //java에서는 $를 변수명으로 쓰는 일은 거의 없다.

 

변수 생성하기

byte b2; //변수 선언문
b2 = 100; //변수 초기식

byte b3 = 100; //선언 + 초기화

byte b4, b5; //다수의 변수 같이 선언 가능

byte b6 = 40, b7 = 50; //다수의 변수 같이 선언 및 초기화

byte b8 = 80, b9, b10; //일부 초기화, 일부 선언도 가능

 

수정, 치환

기존값을 가지고 있는 변수에 새로운 값을 대입

byte b1;
b1 = 100;
System.out.println(b1); //값: 100

//수정, 치환
b1 = 50;
System.out.println(b1); //값: 50

 

변수명 명명법 패턴

1. 헝가리안 표기법

  • 식별자를 만들 때 식별자의 접두어로 자료형을 표시하는 방법
  • 자바에서 많이 사용 안함
  • 가끔 사용 → 인터페이스명
  • 개발 툴이 발전하면서 커서를 가져다 대도 자료형 확인이 가능하여 요즘 잘 사용 안함(변수명 누르고 F3 또는 컨트롤 누르고 변수명 클릭 시, 해당 변수가 쓰인 상위로 이동하여 확인 가능)
byte weight; 
byte byte_weight;
byte byteWeight;
byte bweight;
byte bWeight;
byte b_weight;

 

2. 파스칼 표기법

  • 식별자 단어의 첫문자를 대문자 표기 + 나머지 문자는 소문자로 표기
  • 2개 이상 단어로 만든 합성어 → 모든 단어 붙임 → 각 단어의 첫문자를 대문자
  • 클래스명에 사용
byte EnglishScore; //파스칼 표기법

 

3. 캐멀 표기법

  • 식별자 단어의 첫문자를 소문자 표기 + 나머지 문자는 소문자로 표기
  • 2개 이상 단어로 만든 합성어 → 모든 단어 붙임 → 각 단어의 첫문자를 대문자
  • 변수명메소드명에 사용
byte mathScore; //캐멀 표기법
byte mapPositionLatitude; //캐멀

 

4. 스네이크 표기법

  • 전부 소문자 표기
  • 합성어 → 각 단어를 ‘_’로 연결
  • Java에서는 딱히 스네이크 표기법에 어디에 쓰인다는 규칙은 없다.
byte english_score; //스네이크 표기법

 

5. 케밥 표기법

  • 전부 소문자 표기
  • 합성어 → 각 단어를 ‘-’로 연결
  • Java에서는 사용이 불가능 → ‘-’ 기호를 minus 연산자로 인식하기 때문이다.
  • Java가 아닌 HTMLCSS에서 주로 사용
byte english-score; //케밥 표기법

 

자바에서는 파스칼 & 캐멀 표기법이 메인 표기법이다.

 

코드 컨벤션이란?
코드 컨벤션은 코드를 작성하는 방법에 대한 구성원들끼리의 약속, 규칙이다. 프로젝트 별로 각각 코드 컨벤션이 있기에 그에 맞춰서 코드나 주석을 작성하면 된다.

 

변수와 상수 비교하기

//국어 점수(100점)을 화면에 출력한다고 가정해보자.
int kor = 100;

System.out.println(kor); //국어 점수 출력 > 가독성 높음 > 변수명 = 의미
System.out.println(100); //국어 점수 출력 > 가독성 낮음 > 상수는 데이터 표현 자체로는 의미가 없다.
  1. 변수: 변하는 데이터
  2. 상수: 변하지 않는 데이터 ⇒ 수정할 수 없음
    1. 이름이 있는 상수: final 변수 → 변수명은 대문자로만 작성한다.
    2. 이름이 없는 상수: 순수 데이터 → 리터럴(Literal)
/* 이름이 있는 상수: final 변수 예시 */

final byte KOR = 100;
//이름이 있는 상수(일반적인 상수) 자바는 final이라는 키워드를 앞에 붙이다보니, final 상수, 상수, final 변수 등으로 불린다.
//final 변수 명은 다 대문자로 써야 한다. 대문자로 써야 다른 사람들이 해당 변수 건들지 않도록 약속되어 있기 때문이다. 따라서 절대로 건들면 안되는 값에 final 변수를 사용하고, 보편적으로는 그냥 변수를 사용한다.

 

상수는 데이터 표현 자체로는 의미가 없다. 그렇기 때문에 변수에 집어넣어 작성한다.
변수명의미가 있기 때문이다.

 

리터럴이란?
코드에서 개발자가 직접 적은 100, 10.5, true, 'A', "Hello Java"와 같은 고정된 값을 프로그래밍 용어로 리터럴(literal)이라 한다.

 

리터럴 타입 지정

  • 정수 리터럴은 int를 기본으로 사용한다. 따라서 int 범위까지 표현할 수 있다. 숫자가 int 범위인 약 21억을 넘어가면 L을 붙여서 정수형 리터럴을 long으로 변경해야 한다.(대문자 L, 소문자 l 모두 가능하나 소문자 l은 숫자 1과 착각할 수 있어서 비권장)
  • 실수 리터럴은 기본이 double형을 사용한다. float형을 사용하려면 f를 붙여서 float형으로 지정해야 한다.
  • 문자 리터럴은 1글자만 표현 가능하다.
  • 논리형 리터럴은 true 혹은 false로 표현한다.
  • 문자열 리터럴은 ""(큰따옴표)로 표기하며 안에 Enter 사용이 불가하다.
    • space bar도 글자중에 하나이다. 문자 리터럴 안에 아무것도 없는 것을 빈문자열, Empty String이라고 한다.
//long l1 = 3000000000;
//위와 같이 변수 l1에 값을 대입 시 에러가 발생한다. > The literal 3000000000 of type int is out of range
//long 자료형의 max value가 30억이 넘는데 30억을 대입하지 못하는 이유는? 위에서 서술한바와 같이 정수 리터럴은 int를 기본으로 사용하기 때문에, 뒤에 'L'을 붙여서 정수형 리터럴을 long으로 변경해줘야 한다.
long l1 = 3000000000L;

 

Why? 정수 리터럴은 int가 기본일까?
운영체제가 한번 처리하는 데이터의 양이 int 자료형이 된다.
- 8bit 운영체제: int → 1byte
- 16bit 운영체제: int → 2byte
- 32bit 운영체제: int → 4byte
- 64bit 운영체제: int → 8byte(X) → 여전히 4byte(O)
이런 base 때문에 대대로 정수형 상수가 int로 취급되어왔다.

 

메모리 번지수는 숫자이다. 하나의 공간을 받을 땐 연속적 공간(번지수 연속)으로 잡힌다. 자바와 같은 프로그램이 '번지수'를 '변수명'으로 저장하여 기억한다. 따라서 변수명 = 주소값이라고 생각하면 된다.
하나의 공간에는 하나의 데이터만 입력이 가능하다. 자료형은 이미 크기가 하나로 fix가 되어있기 때문에 데이터가 크던 작던 해당 데이터가 차지하는 크기는 이미 약속되어있다. 따라서 눈에 보이는 데이터가 체감상 작아보인다 하더라도 남은 공간을 사용할 수는 없다.
Why? 하나의 공간에는 하나의 데이터만 입력이 가능하기 때문이다. (남은 공간 사용 시 해당 값이 바뀐다.)

 


숫자형 데이터를 저장할 변수가 필요한 경우, 수치를 기준으로 판단해보자.

  • 수치로서의 데이터: 산술 연산의 대상 → 더하기 빼기
    • 예시) 몸무게
  • 수치가 아닌 데이터: 산술 연산의 대상X → String(단순히 아라비아 숫자로 계산한 데이터인 경우인가?)
    • 예시) 주민등록번호, 학번, 전화번호
//1. 몸무게 > O
int weight;
weight = 70;

//2. 주민등록번호 앞자리(990718) > X
int jumin; // 애초부터 int로 타입을 설정한게 잘못!
jumin = 990718;
System.out.println("주민등록번호: " + jumin);

jumin = 000717; //000718 쓰면 에러나는 이유 -> 8진법을 넘어가서
System.out.println("주민등록번호: " + jumin);

String jumin2;
jumin2 = "000717";
System.out.println("주민등록번호: " + jumin2);

//생긴건 숫자 > 실제로 숫자 취급X
// - 주민등록번호
// - 학번
// - 전화번호

 

자바 기수 표시법

숫자 데이터 표기 → 3개의 기수법을 지원한다.

  1. 10진수 → 10 → 10
  2. 8진수 → 010 → 8
  3. 16진수 → 0x10 → 16
//기수 표현에 상관없이 출력 > 10진수로 출력
System.out.println(10);
System.out.println(010);
System.out.println(0x10);

 

*글 작성에 참고한 내용: 학원 쌤의 열정적인 수업, 인프런 김영한의 자바 입문 수업 자료 중 일부 차용

블로그의 정보

All of My Records

캐떠린

활동하기