> For the complete documentation index, see [llms.txt](https://docs.sysout.co.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.sysout.co.kr/base-language/java/beginner/data-and-information.md).

# 자료와 정보

## 데이터와 변수

이 문서에서는 `데이터`, `정보`, 그리고 `변수`에 대해서 다룬다.

### 자료(Data)

프로그램의 목적은 `계산`이다. 계산을 하기 위해서는 `값`이 필요하며, 추상적인 값보다 구체적인 값이 필요하다.

다음은 추상적인 값들의 예시이다.

* 맛있다
* 기분이 좋다
* 비가 올 것 같다
* 공기가 깨끗하다
* 분위기 있다

추상적인 값들은 프로그래밍에서 계산할 수 없다. 사람마다 느끼는 정도가 다르며, 수치로 나타낼 수 없기 때문이다.

다음은 구체적인 값들의 예시이다.

* 음식의 가격이 10000원이다
* 강수량이 25mm이다
* 미세먼지 농도가 20㎛이다
* 몸무게가 50kg이다
* 키가 180cm이다

이처럼 수치화가 가능하며, 측정이 가능한 값들을 자료(Data)라고 한다. 하지만 자료를 가지고는 단순한 확인밖에 할 수 없기 때문에 이를 계산을 통해 의미있는 내용으로 변화시켜야 하며, 이를 정보(Information)이라고 부른다.

### 정보(Information)

정보는 **자료를 가공하여 만들어낸 의미있는 결과**를 말한다.

다음은 자료의 예시이다.

* 1주일간 강수량 측정치
* 1주일간 매출액
* 1주일간 일일 공부시간
* 1주일간 미세먼지 농도 변화

다음은 정보의 예시이다.

* 온난화와 강수량 변화의 상관관계
* 전년도와 비교한 매출 변화 및 원인
* 나와 전교 1등의 공부 시간 분석 결과
* 이웃 나라와 우리 나라의 미세먼지 농도 차이

정보는 **의사 결정**을 수행하는데 도움을 주며, 정보의 신뢰성이 높을 수록 좀 더 합리적인 의사결정을 할 수 있다. 따라서 프로그램에서는 자료를 어떻게 수집하여 어떻게 계산할 것인지가 매우 중요한 요소가 된다.

### 자료의 형태

현실세계에서의 자료는 다양한 형태로 존재한다. 크기가 10이라고 해서 모두 같은 값이 아니라는 점에 유의해야 하며, 다음 예시를 통해 살펴본다.

| 값     | 분류 |
| ----- | -- |
| 10원   | 화폐 |
| 10유로  | 회폐 |
| 10달러  | 화폐 |
| 10g   | 무게 |
| 10kg  | 무게 |
| 10cm  | 길이 |
| 10km  | 길이 |
| 10L   | 부피 |
| 10평   | 넓이 |
| 10헥타르 | 넓이 |
| 10데시벨 | 소리 |
| 10Lux | 밝기 |

위에서 언급한 값들은 모두 10이라는 값을 가지고 있지만 다른 형태이다. 이를 형태별로 분류하면 다음과 같다.

| 분류 | 값               |
| -- | --------------- |
| 화폐 | 10원, 10유로, 10달러 |
| 무게 | 10g, 10kg       |
| 길이 | 10cm, 10km      |
| 부피 | 10L             |
| 넓이 | 10평, 10헥타르      |
| 소리 | 10데시벨           |
| 밝기 | 10Lux           |

다음과 같은 계산식이 있다고 가정해본다.

```
10원 + 10유로 = ?
```

우리는 위의 계산식을 계산할 수 있을까? 정답은 `할 수 있다`이다. 물론 있는 그대로는 안되고, 변환을 통해서 가능하다. 만약 환율이 1유로에 1500원이라면, 식은 다음과 같이 변할 수 있다.

* 10원 + 15000원 = ?
* 0.006 유로 + 10유로 = ?

이처럼 `같은 분류`의 값들은 서로 변환을 통해 계산이 가능하다는 것을 우리는 이미 알고 있다.

그렇다면 다음의 계산식을 살펴보자.

```
10g + 10cm = ?
```

위의 식은 계산이 가능한가? 정답은 `할 수 없다`이다. 다른 분류의 값은 어떠한 형태로도 계산이 불가능하다. 단위를 통일할 수 없기 때문이다. 우리는 이미 이러한 사실들을 알고 있으며, 이는 프로그래밍에서도 그대로 적용된다.

### 자바의 자료 형태

자바 뿐 아니라 프로그래밍 언어에서는 다음의 전제조건에 의해 데이터를 구분한다.

* 단위는 계산을 복잡하게 하므로 단위는 생략한다.
* 같은 분류의 값들은 변환을 통해서 계산할 수 있다.
* 다른 분류의 값들은 당연히 계산할 수 없다.
* 프로그래머는 이 사실을 반드시 알고 있어야 한다.

프로그램의 핵심 요소 중 하나는 `속도`이기 때문에 이를 위해 단위는 프로그래머에게 위임하도록 구성되어 있다. 따라서 모든 데이터의 단위를 배제하고 값 자체를 다음과 같이 분류한다.

| 분류  |    | 설명                         | 종류                     |
| --- | -- | -------------------------- | ---------------------- |
| 숫자  | 정수 | 소수점이 없는 숫자                 | byte, short, int, long |
| 숫자  | 실수 | 소수점이 있는 숫자                 | float, double          |
| 문자  |    | 번호가 부여된 글자(ASCII, Unicode) | char                   |
| 논리  |    | 예/아니오 처럼 두 가지 상태를 표현하는 값   | boolean                |
| 문자열 |    | 문장을 표현하는 값                 | String                 |
| 객체  |    | 복잡한 데이터를 표시하기 위한 값         | 사용자 정의 자료형             |

위의 표에 따라 다음 형태의 규칙이 성립하게 된다.

* 숫자끼리는 변환을 통해 계산이 가능하다.
* 그 외의 형태와는 분류가 다르므로 계산이 불가능하다.

우리에게 필요한 능력은 데이터를 봤을 때, 프로그래밍 자료형에서 어느 분류에 해당하는지 파악하는 능력이며 변수를 이용하여 실제 데이터를 저장하고 사용하는 과정은 다음 문서에서 다룬다.

### 예제

다음은 출력 명령을 이용한 간단한 예제이다.

```java
import java.lang.*;

public class SimplePrintExample {
    public static void main(String[] args){
        System.out.println(100);//정수
        System.out.println(3.14);//실수
        System.out.println(true);//논리
        System.out.println('A');//문자
        System.out.println("Hello");//문자열
        
        System.out.println(100 + 3.14);//숫자(정수,실수)의 계산
        System.out.println(5 + 'A');//숫자(정수,문자)의 계산
        //System.out.println("Hello" - 5);//문자열과 정수의 계산(오류 발생)
        //System.out.println(true + 2);//논리와 정수의 계산(오류 발생)
    }
}
```
