- 변수 (Variable)
- 자료형
- 상수와 문자열
- 형변환
- 변수와 메모리 구조
- 입출력 메소드
변수를 공부하기에 앞서 데이터 처리 과정에 대해 생각해보자.
프로그램을 실행할 때 사용할 값 (Data) 이 있다면 그 값은 먼저 메모리에 기록 되어야 한다.
프로그램은 키보드나 마우스 또는 파일과 네트워크와 DB 서버 등에서 값을 입력받으면 그 값은 입력 버퍼
에 들어간다.
이후 메모리
에 입력 값을 기록한 뒤 메모리에 기록된 값을 CPU 가 읽어 연산을 처리한다.
출력도 입력과 같은 원리이다. 계산된 결과 값을 메모리에 기록하면 그 값이 출력 버퍼
에 들어가고 이후 출력 장치를 통해 출력되는 것이다.
메모리에 값을 기록하고 지속적으로 사용하려면 변수를 만들어야 한다.
메모리에 값을 저장하기 위한 공간
- 대소문자가 구분되며 길이 제한이 없다.
- 예약어를 사용하면 안 된다.
- 숫자로 시작하면 안 된다.
- 특수문자는 _ 와 $ 만 허용한다.
- 여러 단어 이름은 단어의 첫 글자를 대문자로 한다.
단 첫 시작 글자는 소문자로 하는 것이 관례이다. (camel 표기법)
// 정수형 데이터를 저장할 공간으로, 4byte를 메모리에 할당 후 그 공간을 number1 라고 부르겠다.
int number1;
비트 (bit) : 데이터의 최소 저장 단위로서 2진수 값 하나를 저장할 수 있는 메모리공간
바이트 (byte) : 데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성
자료형
: 변수의 타입
논리형 | 정수형 | 실수형 | 문자형 | 문자열 |
---|---|---|---|---|
boolean (1 byte) | byte (1 byte) short (2 byte) int (4 byte 기본형) long (8 byte) | float (4 byte) double (8 byte 기본형) | char (2 byte) | String (참조형) |
리터럴
: 변수에 대입되는 값 자체
boolean = true 또는 false;
byte = 10;
short s = 32767;
int i = 100;
long l = 10000L; // 리터럴 표기법
float f = 0.123f; // 리터럴 표기법
double d = 3.14;
char c = 'A';
String str = "ABC";
byte 와 short 는 옛날 코드와의 호환을 위해 만들어진 자료형이므로 사용 빈도가 낮아 별도의 리터럴 표기법을 제작하지 않는다.
int iNum1 = 10;
int iNum2 = 4;
float fNum = 3.0f;
double dNum = 2.5;
char ch = 'A';
System.out.println( iNum1 / iNum2 ); // 2
System.out.println( (int)dNum ); // 2
System.out.println( iNum2 * dNum ); // 10.0
System.out.println( (double)iNum1 ); // 10.0
System.out.println( (double)iNum1 / iNum2 ); // 2.5
System.out.println( (int)fNum ); // 3
System.out.println( (int)(iNum1 / fNum) ); // 3
System.out.println( iNum1 / fNum ); // 3.3333333
System.out.println( (double)iNum1 / fNum ); // 3.3333333333333335
System.out.println( (int)ch ); // 65
System.out.println( ch + iNum1 ); // 75
System.out.println( (char)(ch + 10) ); // 문자 K
상수
: 한 번만 저장할 수 있는 메모리로 초기화 이후 다른 값 대입 불가능
// 선언과 동시에 초기화
final int CONSTANT_NUMBER = 100;
// 선언 후 초기화
final int CONSTANT_NUMBER;
CONSTANT_NUMBER = 100;
모두 대문자로 표기하며 단어 구분 시 언더바를 사용한다.
문자열
: 단어나 문장을 문자열이라고 표현하며 쌍따옴표로 묶여있으면 문자열로 인식
String str = "기차";
String str = new String("기차");
String str = "기차" + "칙칙폭폭";
String str = new String("기차" + "칙칙폭폭");
String str = "기차" + 123 + 45 + "출발";
String str = 123 + 45 + "기차" + "출발";
// 사칙 연산 연산 순위 적용
System.out.println(100 + age + name); // 두 정수 합 + 문자열 = 이어쓰기
문자열과 다른 자료형이 합쳐져있으면 문자열로 출력된다.
같은 종류의 자료형끼리만 계산이 가능하기 때문에 초월 번역가인 컴파일러를 통해 자료형을 바꾼다. boolean 연산은 제외하며 형변환은 변수 뿐만 아니라 리터럴 값에도 가능하다.
즉 같은 자료형끼리만 연산이 가능하며 결과도 같은 자료형에 대입해야 한다.
대입 연산 시 값의 범위가 작은 자료형을 큰 자료형에 대입하면 컴파일러가 자동으로 형변환을 진행하지만 값의 범위가 큰 자료형을 작은 자료형에 대입하면 데이터 손실로 인해 에러가 발생한다.
자동 형변환 (묵시적 형변환)
값의 범위가 서로 다른 두 값의 연산 시 컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환한다.
// 10.0 (double) + 2.34 (double) = 12.34 (double)
System.out.println(10 + 2.34);
강제 형변환 (명시적 형변환)
값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환하기 때문에 데이터 손실이 발생할 수 있다. 또한 값의 범위에 상관없이 변수나 값을 원하는 형태의 자료형으로 강제 변환할 수 있다.
int test1 = 290;
byte test2 = (byte)test1;
System.out.println("test1 : " + test1); // 290
System.out.println("test2 : " + test2); // 34
static
static 예약어로 선정된 필드로 메소드가 저장되는 공간이며 클래스 변수 등이 있다.
heap
new 연산자에 의해 동적으로 할당하고 저장되는 공간이며 객체 및 배열 등이 있다.
stack
메소드 호출 시 자동 생성되고 메소드 종료 시 자동 소멸되며 지역변수와 매개변수 및 메소드 호출 스택 등이 있다.
출력 길이가 길어지면 printf 를 사용하는 것을 권장한다.
System.out.print(); // 줄바꿈 X
System.out.println(); // 줄바꿈 O
System.out.printf("패턴이 포함된 문자열", 변수 또는 값); // 줄바꿈 X
// println 또는 print 활용
System.out.println(name + "님은 나이 " + age + "세, 키 " + height + "cm의 " + gender + "성입니다.");
// printf 활용
// %.1f 소수점 아래 한 자리까지 출력
// %3d 3칸 확보하고 오른쪽 정렬
System.out.printf("%s님은 나이 %3d세, 키 %.1fcm의 %c성입니다.", name, age, height, gender);
import java.util.Scanner;
Scanner sc = new Scanner(System.in);
sc.nextInt(); // 정수 입력받기 (개행 문자 무시하고 숫자만 가져옴)
sc.nextFloat(); 또는 sc.nextDouble(); // 실수 입력받기 (개행 문자 무시하고 숫자만 가져옴)
sc.next(); // 한 단어 입력받기 (개행 문자 무시 및 띄어쓰기 불가)
sc.nextLine(); // 한 문장 입력받기 (개행 문자 포함 및 엔터 만나면 종료)
Scanner sc = new Scanner(System.in);
System.out.print("이름 : ");
String inputName = sc.next();