Chapter 2 변수와 자료형

15194 단어 JavaJava

1. 컴퓨터는 데이터를 어떻게 표현할까?

1-1 컴퓨터에서 수를 표현하는 방법

  • 사람은 다른 사람과 대화하기 위해 언어를 사용하고 그 언어를 이해함으로써 의사 소통을 할 수 있습니다.
  • 우리가 사용하는 모든 데이터는 컴퓨터 내부에서 0과 1로 이루어져 있습니다.
  • 컴퓨터 내부를 구성하는 반도체가 데이터를 0과 1로만 표현할 수 있기 때문입니다.
  • 0 또는 1로 표현할 수 있는 최소 단위를 비트(bit)라고 하며, 8비트가 모이면 1바이트(byte)가 됩니다.

10진수와 2진수

  • 우리가 일상 생활에서 사용하는 숫자는 0부터 9까지 한 자릿수이고 10부터는 두 자릿수가 되며, 이를 10진수라고 합니다.
  • 컴퓨터 내부에서는 모든 데이터를 0과 1로 표현해야 하며, 이를 2진수라고 합니다.
  • 2진수란 0과 1 두 개로만 표현되는 수를 말합니다.

2진수, 8진수, 16진수

  • 자바 프로그램에서는 2진수, 8진수, 16진수를 사용할 수 있습니다.
  • 2진수는 비트 값을 그대로 표현할 수 있지만 길이가 너무 길어서 불편하므로 8진수나 16진수로 바꿔서 사용하면 간단하게 표현할 수 있습니다.
  • 8진수를 2진수로 표현하기 위해 3개의 비트가 필요하고 16진수는 4개의 비트가 필요합니다.
  • 0부터 16까지 수를 10진수, 2진수, 8진수, 16진수로 나타내면 아래와 같습니다.
  • 위의 표에서 보듯 8진수는 2진수 3비트를, 16진수는 4비트를 합쳐서 간단하게 표현할 수 있습니다.
  • 프로그램에서 2진수를 사용할 때 앞에 0B를 붙이고, 8진수를 사용할 떄는 0, 16진수를 사용할 때는 0X를 붙입니다.

1-2 부호 있는 수를 표현하는 방법

  • 컴퓨터는 숫자를 0과 1로만 표현할 수 있기 때문에 부호 또한 0과 1로 표현합니다.
  • 부호를 나타내는 비트는 맨 앞에 붙이며 부호 비트(Most Significant Bit : MSB)라고 부릅니다.
  • 부호 비트가 0이면 양수, 1이면 음수를 나타냅니다.
  • 8비트로 5라는 숫자를 표현하면 아래와 같습니다.

2의 보수란?

  • 보수는 말 그대로 보충해 주는 수입니다.
  • 어떤 특저한 10진수 N이 있을 때 3에 대한 N의 보수라고 하면 3과 어떤 수를 합하여 N이 되는 수를 의미합니다.
  • 컴퓨터 내부에서는 숫자뿐아니라 문자나 기호 등 모든 값은 2진수로 표현할 수 있음. 따라서 컴퓨터 내부에서 값을 어떻게 표현하는지 알아두는게 좋습니다.

2. 변수란 무엇일까?

  • 프로그래밍에서 변하는 값을 '변수'라고 합니다.
  • 변수는 말 그대로 변하는 수입니다.

2-1 변수 선언하고 값 대입하기

  • 변수는 값을 넣을 수 있는 빈 그릇과 같습니다.
  • 변수를 사용하기 위해 어떤 형태의 자료를 저장할 것인지를 정해야합니다.
  • 사람의 나이를 저장 하려면 정수 형태를 써야하고, 사람의 이름을 저장하려면 문자 형태를 써야합니다.
  • 이 형태를 변수의 '자료형'이라고 합니다.
  • 변수의 자료형을 선택하고 변수의 이름을 정하는 것을 '변수를 선언한다'라고 합니다.

예제 2-1 변수 선언하여 사용하기

public class Variable1 {
	public static void main(String[] args) {
		// 정수형 변수 level을 선언
		int level;
		// level 변수에 값 10을 대입
		level = 10;
		// level 값 출력
		System.out.println("level : " + level);
	}
}

  • 위 코드에서 int는 정수를 나타내는 자료형이고, level은 게임 레벨을 의미하는 변수 이름입니다.
  • = 기호는 수학에서 오른쪽과 왼쪽이 같다는 의미이지만 프로그램에서는 '오른쪽 값을 왼쪽에 대입한다'는 의미로 사용합니다.
  • 위 코드에서 두 문장을 해석하면 'level이라는 이름의 변수를 정수 자료형으로 선언한다. 선언한 level 변수에 값 10을 대입한다'입니다.
  • 변수를 선언하면 변수에 값을 넣을 수도 있고, 변수 이름을 사용하여 변수에 들어 있는 값을 가져올 수도 있습니다.

2-2 변수 초기화하기

예제 2-2 변수 초기화하기

public class Variable2 {
	public static void main(String[] args) {
		// level 변수 선언과 동시에 값을 대입(초기화)
		int level = 10;
		// level 값 출력
		System.out.println("level : " + level);
	}
}

  • 변수를 선언할 때 변수 값을 바로 대입할 수도 있습니다.
  • 변수에 처음 값을 대입하는 것을 '초기화'라고 합니다.

2-3 변수 이름 정하기

  • 자바에서 변수 이름은 용도에 맞게 지으면 되지만, 아래와 같은 제약 사항이 있습니다.
  • 변수 이름은 프로그램에서 계속 사용하기 때문에 사용 목적에 맞게 의미를 잘 부여해서 만드는 것이 좋습니다.
  • 변수 이름 길이에 제한이 없으므로 줄임말보다는 의미를 풀어서 쓰는 것이 프로그램을 작성하고 이해하는데 편리합니다.
  • 변수 이름은 대부분 소문자로 시작하여 여러 단어로 변수 이름을 만들 경우 중간에 다른 뜻의 단어가 등장할 때 첫 글자를 대문자로 사용하는 것을 카멜 표기법(camel notation)이라 합니다.

3. 변수가 저장되는 공간의 특성, 자료형

3-1 변수와 메모리

  • 변수는 컴퓨터 내부의 메모리 공간에 저장됩니다.
  • 메모리는 프로그램이 실행되는 작업 공간입니다.
  • int level; 문장을 선언하면, 메모리에 4바이트(int형) 크기의 공간이 level이라는 이름으로 할당됩니다.
  • 이후에 level 변수를 연산에 사용하거나 값을 출력할 일이 있으면 이 공간에 있는 값을 가져와야 합니다.
  • 변수를 선언한다는 것은 선언한 변수 이름으로 어떤 위치에 있는 메모리를 얼마만큼의 크기로 사용하겠다는 뜻입니다.

3-2 기본 자료형의 종류

  • 자바에서 제공하는 자료형은 기본 자료형참조 자료형이 있습니다.
  • 기본 자료형은 자바 라이브러리에서 기본으로 제공하며, 얼마만큼의 메모리를 어떻게 사용할 것인지가 아래와 같이 정해져 있습니다.

3-3 정수 자료형

  • 정수 자료형은 양수, 음수, 0을 나타내는 데 사용하는 자료형입니다.
  • 정수는 byte형, short형, int형, long형 4가지 자료형으로 나타낼 수 있습니다.
  • 각 자료형은 메모리에서 사용하는 바이트 수와 용도가 다릅니다.

byte 형

  • 1바이트는 8비트입니다.
  • 바이트 단위의 정보를 저장하거나 통신할 때 주로 사용합니다.
  • 범위를 초과하는 값을 대입하면 오류가 발생합니다.

short 형

  • 2바이트로 정수를 표현하는 자료형입니다.

int 형

  • 정수를 표현할 때 가장 많이 사용하는 자료형입니다.
  • 정수 자료형으로 가장 많이 사용하는 이유는 컴퓨터에서 정수로 연산을 할 때 4바이트 단위로 처리하는 것이 가장 효율적이기 때문입니다.

long 형

  • 자바에서 정수를 표현하는 가장 큰 단위의 자료형입니다.
  • int형 범위를 넘어서는 정수를 사용할 때 long형을 사용합니다.
  • 컴파일러는 기본적으로 모든 정수 값을 int형으로 처리하기 때문에 long형을 사용할 때는 long형을 나타내는 식별자인 L이나 l을 사용하려는 숫자 뒤에 붙여야 합니다.

3-4 문자 자료형

  • 컴퓨터는 0과 1로만 표현할 수 있으므로 문자 역시 컴퓨터 내부에서 표현할 때 0과 1의 조합으로 나타내야 합니다.
  • 어떤 문자를 컴퓨터 내부에서 표현하려면 특정 정수 값으로 정하자고 약속합니다.
  • A를 얼마로 표현할 것인지 약속하는데, 이런 코드 값을 모아 둔 것은 '문자 세트'라고 합니다.
  • 문자를 정해진 코드 값으로 변환하는 것을 '문자 인코딩(encoding)'이라고 합니다.
  • 코드 값을 다시 문자로 변환하는 것을 '문자 디코딩(decoding)'이라고 합니다.
  • 가장 기본이 되는 문자 인코딩은 아스키(ASCII) 코드입니다.
  • 아스키 코드는 영문자, 숫자, 특수 문자 등을 나타내는 문자 세트입니다.
  • 아스키 코드는 1바이트만 사용하며, 2바이트 이상을 사용하는 각 언어의 표준 인코딩을 정의해 놓은 것은 유니코드(unicode)입니다.

예제 2-3 문자형 연습 1

public class CharacterEx1 {
	public static void main(String[] args) {
		char ch1 = 'A';
		// 문자 출력
		System.out.println("ch1 : " + ch1);
		// 문자에 해당하는 정수 값(아스키 코드 값) 출력
		System.out.println("ch1의 아스키 코드 값 : " + (int)ch1);
		
		char ch2 = 66;
		// 정수 값 대입
		System.out.println("ch2 : " + ch2);
		
		int ch3 = 67;
		// 문자 정수 값 출력
		System.out.println("ch3 : " + ch3);
		// 정수 값에 해당하는 문자 출력
		System.out.println("ch3의 아스키 코드 값 : " + (char)ch3);
	}
}

  • 프로그램에서 문자를 사용할 때는 항상 작은따옴표(' ')를 사용합니다.
  • 문자를 여러 개 이은 문자열을 사용할 때는 큰따옴표(" ")를 사용합니다.
  • 문자열은 "Hello"처럼 여러 개의 문자를 큰 따옴표로 감싸 표현하고 기본 자료형으로는 표현할 수 없습니다.
  • 문자열 끝에는 항상 문자열의 끝을 나타내는 널 문자('\0')가 있습니다.
  • 자바에서 문자열을 다룰 때는 String 클래스를 사용합니다.

예제 2-4 문자형 연습 2

public class CharacterEx2 {
	public static void main(String[] args) {
		char ch1 = '한';
		char ch2 = '\uD55C';
		
		System.out.println("ch1 : " + ch1);
		System.out.println("ch2 : " + ch2);		
	}
}

  • \uD55C는 '한'이라는 글자의 유니코드 값이고 16진수로 나타내고 있습니다.
  • 16진수 숫자 하나가 4비트를 사용하므로 한글 '한'이라는 글자를 표현하는데 4비트 4개, 즉 2바이트를 사용합니다.

문자형 변수에 숫자를 저장한다면?

  • char형은 문자 자료형이지만 다른 자료형과 마찬가지로 컴퓨터 내부에서는 정수 값으로 표현되기 때문에 정수 자료형으로 분류하는 경우도 있습니다.
  • 다른 정수 자료형과 차이점은 char형은 음수 값을 표현할 수 없다는 것입니다.

예제 2-5 문자형 연습 3

public class CharacterEx3 {
	public static void main(String[] args) {
		int a = 65;
		int b = -65;
		
		char a2 = 65;
		// 문자형 변수에 음수를 넣으면 오류가 발생하므로 주석 처리함
		// char b2 = -65;
		
		System.out.println("a : " + (char)a);
		System.out.println("b : " + (char)b);	
		System.out.println("a2 : " + a2);		
	}
}

  • char형으로 선언한 변수에 음수 값을 대입하면 오류가 발생합니다.
  • 음수 값을 대입한 정수형 변수 b를 char형으로 출력해 보면 글자가 깨지는데, 알 수 없는 문자라는 의미입니다.

3-5 실수 자료형

  • 컴퓨터에서는 실수는 정수와는 조금 다른 방식으로 표현해야 합니다.

부동 소수점 방식

  • 실수를 가수 부분(1.0)과 지수 부분(-1)을 나누어서 실수를 나타내는 방식을 부동 소수점 방식이라고 합니다.
  • 이 방식을 사용하면 실수를 좀 더 세밀하게 표현할 수 있습니다.

float형과 double형

  • 실수 자료형에는 float형과 double 형이 있습니다.
  • float형은 부호 1비트, 지수부 8비트, 가수부 23비트로 총 32비트(4바이트)를 사용합니다.
  • double형은 부호 1비트, 지수부 11비트, 가수부 52비트로 총 64비트(8바이트)를 사용합니다.
  • 자바에서 실수는 double형을 기본으로 사용합니다.
  • float형(4바이트)에 비해 double형(8바이트)이 더 정밀하게 실수를 표현할 수 있습니다.

예제 2-6 실수형 연습

public class DoubleEx1 {
	public static void main(String[] args) {
		double dNum = 3.14;
		// float형은 식별자인 f를 붙여줘야 함
		float fNum = 3.14F;
				
		System.out.println("dNum : " + dNum);
		System.out.println("fNum : " + fNum);	
	}
}

  • 3.14는 double형으로 컴퓨터 내부에 저장되어 dNum 값에 대입됩니다.
  • float형은 long형처럼 식별자인 F 또는 f를 숫자 뒤에 붙여서 식별해줘야 합니다.

3-6 논리 자료형

  • 논리 자료형은 어떤 변수의 참(true), 거짓(false)의 값을 나타내는데 사용합니다.
  • 종류는 boolean형 한 가지뿐입니다.
  • 논리 자료형의 선언 형식은 아래와 같습니다.
  • boolean형 변수는 1바이트로 값을 저장하며, true(참), false(거짓) 두 가지 값만 가집니다.

예제 2-7 논리형 연습

public class BooleanEx {
	public static void main(String[] args) {
		// boolean 변수를 선언하고 초기화
		boolean isMarried = true;
		
		System.out.println("isMarried : " + isMarried);
	}
}

  • 위 예제는 boolean형 변수 하나를 선언하고 출력해보는 예제입니다.
  • boolean형 변수는 true나 false만 대입할 수 있고 그 결과 값도 true, false로 출력됩니다.

3-7 자료형 없이 변수 선언하기

  • 자바 10부터 생긴 문법이므로 생략하겠습니다.

4. 상수와 리터럴

4-1 상수 선언하기

  • 프로그램에서는 변하지 않는 수도 필요합니다.
  • 예를 들어 원의 넓이를 구할 때 사용하는 원주율이나, 1년은 12개월이라는 값은 변하지 않습니다.
  • 이렇게 항상 변하지 않는 값을 '상수(constant)'라고 합니다.
  • 자바에서는 final 예약어를 사용해 선언합니다.
  • 아래와 같이 상수 이름은 대문자를 주로 사용하고, 여러 단어를 연결하는 경우에 _ 기호를 사용합니다.
  • 한 번 선언한 상수는 변하지 않기 때문에 선언과 동시에 값을 지정하는 것이 좋습니다.

예제 2-8 상수 사용하기

public class Constant {
	public static void main(String[] args) {
		// 선언과 동시에 초기화
		final int MAX_NUM = 100;
		final int MIN_NUM;
		
		// 사용하기 전에 초기화. 초기화하지 않으면 오류 발생
		MIN_NUM = 0;
		
		System.out.println("MAX_NUM : " + MAX_NUM);
		System.out.println("MIN_NUM : " + MIN_NUM);
		
		// 오류 발생. 상수는 값을 변경할 수 없음
		// MAX_NUM = 1000;
	}
}

  • 상수는 값을 가져와서 사용할 수 있을 뿐, 한 번 대입한 값을 변경하려고 하면 오류가 발생합니다.

4-2 상수를 사용하면 편리한 이유

  • 프로그램 내부에서 반복적으로 사용하고, 변하지 않아야 하는 값을 상수로 선언하여 사용하면 좋습니다.
  • 값을 변경해야하는 경우 상수로 선언해 사용했다면 상수를 선언한 부분의 값만 변경해주면 됩니다.

4-3 리터럴

  • 리터럴(literal)이란 프로그램에서 사용하는 모든 숫자, 문자, 논리값(true, false)을 일컫는 말입니다.
  • 위에서 사용한 'A', 10, 3.14와 같은 문자와 숫자를 '리터럴' 혹은 '리터럴 상수'라고 합니다.
  • 리터럴은 프로그램이 시작할 때 시스템에 같이 로딩되어 특정 메모리 공간인 상수 풀(constant pool)에 놓입니다.
  • 숫자가 변수에 대입되는 과정은 일단 숫자 값이 어딘가 메모리에 쓰여 있고, 이 값이 다시 변수 메모리에 복사되는 것입니다.

5. 형 변환

5-1 형 변환이란?

  • 정수와 실수는 컴퓨터 내부에서 표현되는 방식이 전혀 다릅니다.
  • 정수와 실수를 더한다고 할 때 그대로 연산을 수행할 수 없고 하나의 자료형으로 통일한 후 연산을 해야 합니다.
  • 이 때 형 변환(type conversion)이 이루어짐
  • 위 문장에서 변수 n은 int형이고 변수 dNum은 double형입니다.
  • 형 변환은 각 변수의 자료형이 다를 때 자료형을 같게 바꾸는 것을 말합니다.
  • 형 변환은 크게 묵시적 형 변환(자동 형 변환)명시적 형 변환(강제 형 변환) 두 가지로 구별해서 생각할 수 있습니다.
  • 아래는 형 변환의 기본 원칙입니다.
  • 기본 원칙과 반대로 형 변환을 하려면 강제로 변환해야 합니다.
  • long형이 8바이트이고 float형이 4바이트인데 자동 형 변환이 되는 이유는 실수가 정수보다 표현 범위가 더 넓고 정밀하기 때문입니다.
  • 기본 원칙에 맞게 형 변환이 이루어질 때는 자료 손실이 없지만, 그 반대인 경우에는 자료 손실이 발생할 수 있습니다.

5-2 묵시적 형 변환(자동 형 변환)

바이트 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우

  • 아래는 크기가 작은 자료형에서 큰 자료형으로 대입하는 경우입니다.
  • byte의 크기는 1바이트고 int의 크기는 4바이트로 byte를 int에 대입하면 byte 의 값이 자료 손실 없이 int에 모두 저장됩니다.
  • 남은 3바이트에는 0으로 채워지게 됨

덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우

  • 아래는 덜 정밀한 자료형에서 더 정밀한 자료형으로 대입하는 경우입니다.
  • 두 변수의 크기가 같은 4바이트라도 float형인 fNum이 더 정밀하게 데이터를 표현할 수 있으므로 실수형인 float형으로 변환됩니다.

연산중에 자동 변환되는 경우

  • 아래는 연산중에 자동 변환되는 경우입니다.
  • 위와 같은 경우에는 dNum = fNum + iNum에서 두 번의 형 변환이 일어납니다.
  • fNum + iNum 연산에서 int형이 float형으로 변환되고, 두 변수를 더한 결과 값이 dNum에 대입되면서 double형으로 변환됩니다.
  • 바이트 크기가 작은 수에서 큰 수로, 덜 정밀한 수에서 더 정밀한 수로 자료형이 변환되는 경우에 자동 형 변환이 일어납니다.

예제 2-9 묵시적 형 변환

public class ImplicitConversion {
	public static void main(String[] args) {
		byte bNum = 10;
		// byte형 값이 int형 변수로 대입됨
		int iNum = bNum;
		
		System.out.println("bNum : " + bNum);
		System.out.println("iNum : " + iNum);
		
		int iNum2 = 20;
		// int형 값이 float형 변수로 대입됨
		float fNum = iNum2;
		
		System.out.println("iNum2 : " + iNum2);
		System.out.println("fNum : " + fNum);
		
		double dNum;
		dNum = fNum + iNum;
		
		System.out.println("dNum : " + dNum);
	}
}

5-3 명시적 형 변환(강제 형 변환)

  • 묵시적 형 변환과 반대의 경우로 생각할 수 있습니다.

바이트 크기가 큰 자료형에서 작은 자료형으로 대입하는 경우

  • byte형은 1바이트로 int형보다 크기가 작기 때문에 자료 손실이 발생할 수 있습니다.
  • 프로그래머가 반환할 자료형을 명시적으로 써 주어야 하며 이를 강제 형 변환이라고 합니다.

더 정밀한 자료형에서 덜 정밀한 자료형으로 대입하는 경우

  • 실수 자료형에서 정수 자료형으로 값이 대입되는 경우에도 형 변환을 명시적으로해 해줘야 합니다.
  • 위와 같은 경우에는 실수의 소수점 이하 부분이 생략되고 정수 부분만 대입됩니다.

연산 중 형 변환

예제 2-10 명시적 형 변환

public class ExplicitConversion {
	public static void main(String[] args) {
		double dNum1 = 1.2;
		float fNum2 = 0.9F;
		
		// 두 실수가 각각 형 변환되어 더해짐
		int iNum3 = (int)dNum1 + (int)fNum2;
		// 두 실수의 합이 먼저 계산되고 형 변환됨
		int iNum4 = (int)(dNum1 + fNum2);
        
		System.out.println("iNum3 : " + iNum3);
		System.out.println("iNum4 : " + iNum4);
	}
}

  • iNum3와 iNum4의 연산 결과가 다른 것을 알 수 있습니다.
  • 같은 연산이라도 형 변환이 언제 이루어졌는지에 따라 그 결과 값이 다르게 나타날 수 있습니다.

좋은 웹페이지 즐겨찾기