Post

JAVA 변수와 자료형

프로그램에서 표현 가능한 데이터와 종류에 대한 이해

JAVA 변수와 자료형

#01. VSCode 설정

1) Extention 설치

이름개발자설명
Extension Pack for JavaMicrosoft자바 개발에 필요한 필수 익스텐션 모음
PlantUMLjebbs클래스 다이어그램 생성 도구
PlantUML PreviewerMebrahtom GueshPlantUML로 작성된 다이어그램 뷰어
PlantUML SyntaxQuido HoekmanPlantUML 문법 강조 도구

2) 프로젝트 생성

  1. Ctrl+Shift+P를 눌러 명령창을 연 후 Java: Create Java Project를 선택한다.
  2. 다음 단계에서 No build tools를 선택한다.
  3. 프로젝트(각 단원별 폴더)가 생성될 작업 디렉토리를 지정한다.
  4. 프로젝트의 이름을 입력한다. (여기서는 02_변수와_자료형)

3) 소스코드 작성

모든 소스코드는 src 폴더 안에서 작성되어야 한다.

4) 코드 실행 및 디버깅

F5를 눌러서 코드를 실행한다.

BreakPoint가 설정되어 있는 경우 디버깅이 진행된다.

5) VSCode 디버깅 단축키

단축키설명
F9중단점 설정/해제
F5디버깅 시작
디버깅 중인 경우
- (다른 중단점이 존재할 경우) 다음 중단점으로 이동
- (다른 중단점이 없을 경우) 나머지 코드 일괄 실행
F10다음 줄 실행
F11메서드 호출 구문에서 해당 메서드 안으로 들어가기

#02. 메모리

데이터를 저장할 수 있는 물리적 장치

1) 휘발성 메모리

전원을 OFF하면 저장되어 있는 데이터가 모두 삭제된다.

  • ex) RAM 카드

2) 비휘발성 메모리

전원을 OFF 하더라도 데이터가 삭제되지 않는다.

  • ex) 하드 디스크, USB

#03. 컴퓨터의 데이터 단위

컴퓨터에 저장될 수 있는 데이터는 이진수 형태이므로 0아니면 1로만 구성된다.

1) bit

이진수 값 하나를 의미.

  • 1bit는 두 개의 정보를 표현할 수 있다. (0 혹은 1)
  • 2bit는 네 개의 정보를 표현할 수 있다. (00, 01, 10, 11)
  • nbit는 2의 n제곱 개의 정보를 표현할 수 있다.
    • 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 …

2) 인코딩

  • 글자를 부호화 하기 위한 규격.
    • ex) 모스부호

ANSI

  • 이진수를 사용해서 알파벳을 부호하 하기 위한 미국 표준 규격
  • 7bit로 알파벳 한 글자를 표현한다.
  • 미국 전용.

확장 ANSI

  • ANSI에서 다른 언어를 표현하기 위한 1bit를 추가하여 8bit로 한 글자를 표현하는 방식
  • 영어 + 1개국어 표현이 가능하기 때문에 언어별로 종류가 나누어진다.
    • ex) euc-kr, euc-jp, euc-ch …
  • 확장 ANSI가 국제표준으로 정해진 후 컴퓨터에서 데이터의 크기의 초소 단위를 8bit로 정하고 이를 1byte라고 부르기 시작함.
  • 영어는 1byte로 한 글자를 표현 가능함.
  • 한국어와 같은 조합형 글자는 두 개 이상의 byte가 모여야 한 글자를 구성할 수 있다.

UTF-8

  • 확장 ANSI가 영어+1개국어 밖에 표현하는 한계를 개선하여 언어 종류에 상관 없이 3byte로 한 글자를 표현하는 방식.
  • 한번에 모든 언어를 표현할 수 있다.
  • 현재 사실상 산업 표준으로 사용되고 있다.

3) 컴퓨터의 용량 단위

  • byte : 최소단위 (이진수 8개)
  • kbyte : 1kb = 1024b
  • mbyte : 1mb = 1024kb
  • gbyte : 1gb = 1024mb
  • tbyte : 1tb = 1024gb

#04. 변수

메모리에 저장된 데이터.

쉽게 생각하면 값을 대입하기 위한 메모리 영역이라고 할 수 있다.

1) 변수 사용하기

변수의 선언

변수에 저장할 수 있는 값의 종류를 명시하고 그 옆에 변수의 이름을 정의한 다음 세미콜론으로 명령을 종료한다.

int는 정수를 의미하고 4byte의 메모리 공간을 차지한다.

1
int num;

값의 할당

대입 연산자 =을 사용해서 선언한 변수에 데이터를 저장하는 것.

항상 오른쪽에서 왼쪽으로 대입된다.

1
num = 100;

선언과 할당의 일괄 처리

1
int num = 100;

2) 데이터 타입 (Data Type)

메모리에 저장되어 있는 이진수들을 해석하기 위한 규칙들.

메모리에 저장할 수 있는 값의 종류를 의미한다.

종류크기설명값 형태
byte1byte-128~127 까지의 범위를 갖는 정수ex) 1
short2bytebyte 보다 큰 범위를 저장할 수 있는 정수ex) 200
int4byteshort 보다 큰 범위를 저장할 수 있는 정수ex) 1234567
long8byteint 보다 큰 범위를 저장할 수 있는 정수생략
float4byte실수ex) 3.14
double8bytefloat 보다 더 정밀하게 소수점 자리를 표현할 수 있는 실수ex) 3.141592…
boolean2byte참/거짓을 표현하는 논리값true / false
char2byte한 글자. 홑따옴표로 감싼다.‘a’

3) 변수 값 할용하기

같은 데이터 타입을 갖는 변수 여러 개를 한 번에 선언하기

1
2
3
int num1, num2;
num1 = 100;
num2 = 200;

이미 값이 할당된 변수는 다른 값으로 변경 가능

1
2
int pay = 100;
pay = 200;

변수 값을 다른 변수에 복사 가능

1
2
3
4
5
int x, y;
x = 50;
y = x;

int z = y;

변수의 이름 규칙

  1. 언더바(_), 숫자, 영어, $기호만 사용 가능하다.
    • 관례상 $는 잘 사용하지 않는다.
  2. 첫 글자는 숫자가 될 수 없다.
  3. 자바에서 사용하는 예약어를 사용할 수 없다.
  4. 첫 글자는 대부분 소문자로 시작한다.

두 개 이상의 단어를 조합하여 이름을 정의하는 경우

  1. 스네이크 표기법 : 띄어 쓰기를 언더바(_)로 표현
1
int my_age;
  1. 카멜 표기법 : 띄어쓰기가 시작되는 단어의 첫 글자를 대문자로 변경
1
int myAge;

문자열

쌍따옴표로 감싸진 문장을 저장할 수 있는 데이터 타입

1
String welcomeMessage = "Hello World";

4) 변수의 제약

선언되지 않은 변수는 사용할 수 없다.

1
2
3
int x;
x = 100;    // 선언된 변수를 사용하므로 ok
y = 200;    // 선언되지 않은 변수에 값을 대입하므로 에러

이미 선언된 변수를 중복 선언할 수 없다.

1
2
3
4
int z;
z = 200;

int z = 300;    // 중복선언 에러

float 타입 사용시 주의사항

double 타입과의 구분을 위해 대입시 F를 적용해야 한다. (필수)

1
float k = 12.345F;

long 타입 사용시 주의사항

int 타입과의 구분을 위해 대입시 L을 적용해야 한다. (권장)

1
long k = 12345678L

변수 값 출력하기

1
2
3
4
int myAge = 100;

System.out.println(myAge);      // 100이 출력된다.
System.out.println("myAge");    // myAge라는 문자열이 출력된다.

#05. 실습예제

📒 Ex01_변수의_사용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Ex01_변수의_사용 {
    public static void main(String[] args) {
        /** 1) 선언(declaration)과 할당(정의,definition)을 분리 */
        // 정수형 변수 a를 선언 --> 메모리의 특정 위치에 4칸을 점유
        int a;
        // a에 100을 할당(기록)
        a = 100;
        System.out.println(a);

        /** 2) 선언과 할당을 통합 */
        // 정수형 변수 b를 선언하고 a에 기록된 내용을 복사
        int b = a;
        System.out.println(b);

        /** 3) 실수형 변수 */
        // double 타입은 메모리의 8칸을 점유하고 소수점을 포함한 값을 저장한다.
        double c = 3.14;
        System.out.println(c);

        /** 4) 논리형 변수 */
        boolean d = true;
        System.out.println(d);
    }
}

📒 Ex02_리터럴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
 * 변수에 할당되기 위한 원초적인 값 형태
 *
 * int a = 100;
 * 위의 코드에서 100이 리터럴
 *
 * 리터럴은 변수에 대입되거나 직접 출력할 수 있다.
 */
public class Ex02_리터럴 {
    public static void main(String[] args) {
        // 정수형태의 리터럴은 int로 인식된다.
        System.out.println(100);

        // 정수의 리터럴은 변수의 datatype에 따라 자동 식별된다.
        int num1 = 100;
        System.out.println(num1);

        double num2 = 100;
        System.out.println(num2);

        // 실수의 리터럴은 값 뒤에 데이터 타입의 첫 글자(리터럴 문자)를 지정해서 구분해 함.
        // --> 지정하지 않을 경우 double로 인식
        // --> 첫 글자는 대소문자 구분 없음
        float num3 = 3.14F;
        System.out.println(num3);

        double num4 = 3.14D;
        System.out.println(num4);

        // `int`형의 리터럴 문자는 없지만 double은 `D`라고 명시하는 것이 가능
        double num5 = 100D;
        System.out.println(num5);
    }
}

📒 Ex03_상수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class Ex03_상수 {
    public static void main(String[] args) {
        /** 1) 변수는 초기화 이후 다른 값으로 변경 가능함 */
        int age = 20;
        System.out.println(age);

        age = 21;
        System.out.println(age);

        /** 2) 상수는 초기화 이후 값을 변경할 수 없는 형태 */
        // 데이터 타입 앞에 `final`키워드를 적용하여 생성
        // 선언과 할당이 통합된 형태로만 생성 가능함
        // 상수의 이름은 모두 대문자로 지정하고 스네이크 표기법을 사용하는 것이 관례
        final double PI = 3.14;
        System.out.println(PI);

        // 상수의 값을 변경하려고 시도 --> 이 위치에서 에러 발생함
        //PI = 3.14159;

        // 에러가 발생하는 위치에서 프로그램이 중단되기 때문에 아래 코드는 실행되지 않음
        //System.out.println(PI);
    }
}

📒 Ex04_문자열

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * 문자열 : 문자(char타입)을 나열한 형태. 쌍따옴표를 사용함 --> 문장
 * 기본 데이터 타입 8가지에 속하지 않음.
 *
 * 원래 문자열은 객체라는 형태의 특수한 변수이지만
 * 아직 설명되지 않은 내용이므로 일반 변수와 구분하지 않는다.
 */
public class Ex04_문자열 {
    public static void main(String[] args) {
        /** 1) 문자열 변수의 선언과 할당 */
        String name;
        name = "자바학생";
        System.out.println(name);

        /** 2) 빈 문자열 */
        // 내용이 없는 문자열 --> 따옴표를 열자마자 닫은 형태
        // 내용은 없지만 메모리 공간은 차지하고 있다는 점에서 존재하는 변수임
        String empty = "";
        System.out.println(empty);

        /** 3) 공백문자열 */
        // 띄어쓰기도 엄연한 글자
        String space = "     ";
        System.out.println(space);

        /** 4) null값 */
        // 나중에 할당하기 위해서 값을 비워 놓은 형태
        // 빈 문자열이나 공백문자열은 메모리를 소비하지만 null은 메모리를 차지하지 않는다.
        String nValue = null;
        System.out.println(nValue);
    }
}
This post is licensed under CC BY 4.0 by the author.