▶ Data(값) 처리 과정
- 프로그램 실행 시 사용할 값(Data)이 있다면, 그 값은 먼저 메모리에 기록되어야 함
- 메모리에 값을 기록하고 지속적으로 사용하려면 변수부터 만들어야 함
▶ 변수(Variable)
- 메모리(RAM)에 값을 기록하기 위한 공간
- 변수에 기록된 값은 지속적으로 사용 가능
- 공간에 기록되는 값(Data)이 변할 수 있어서 변수라고 함
- 변수 사용의 장점
1) 코드 길이 감소
2) 가독성 증가 (읽기 편해짐)
3) 재사용성 증가 (한 번 만든 변수를 계속 사용)
4) 유지보수성 증가 (코드 수정 간단함)
▶ 변수 사용 목적
1) 변수를 사용하지 않으면
System.out.println( 2 * 3.141592653589793 * 7 );
System.out.println( 3.141592653589793 * 7 * 7 );
System.out.println( 3.141592653589793 * 7 * 7 * 20 );
System.out.println( 4 * 3.141592653589793 * 7 * 7 );
2) 변수를 사용하면
double pi = 3.141592653589793; // 원주율
int r = 7; // 반지름(radius)
int h = 20; // 높이(height)
// "A = B"은 "B에 있는 값을 A로 대입한다."
System.out.println( 2 * pi * r ); // 원의 둘레
System.out.println( pi * r * r ); // 원의 넓이
System.out.println( pi * r * r * h ); // 원기둥의 부피
System.out.println( 4 * pi * r * r ); //구의 겉넓이
▶ 데이터 저장 단위
- 저장 공간이 제한적이기 때문에, 저장 크기에 대한 기준과 CPU가 데이터를 처리할 때 일정한 기준 필요
- 비트 (bit) : 컴퓨터가 나타내는 데이터의 최소 저장 단위로서 2진수 값 하나를 저장할 수 있는 메모리 공간을 의미
- 바이트 (byte) : 데이터 처리 또는 문자의 최소 단위로서 8개의 비트가 모여 하나의 바이트가 구성
▶ 변수의 선언
- 메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것
- 자료형(변수 타입 지정) 변수명(변수명 지정) ;(마침)
// 선언 예시
// 논리형 변수 선언
boolean isTrue;
//타입 변수명;
// 메모리에 논리값(true/false)을 저장할 공간을 1byte 할당하고,
// 할당된 공간을 booleanData라고 부르겠다
// 문자형 변수 선언
char ch;
// 문자열 변수 선언
String str;
// 정수형 변수 선언
byte bNum;
// 메모리에 정수값을 저장할 공간을 1byte 할당하고,
// 할당된 공간을 byteData라고 부르겠다
short sNum;
int iNum;
long lNum;
// 실수형 변수 선언
float fNum;
double dNum;
▶ 자료형(Type)
- 논리형 : boolean (1byte)
- 정수형 : byte (1byte), short (2byte), int (4byte), long (8byte)
- 실수형 : float (4byte), double (8byte)
- 문자형 : char (2byte, 유니코드)
▶ 변수 저장 가능 범위
▶ 변수 명명 규칙
1. 대소문자가 구분되며 길이 제한이 없음
int abcdefghijklmnopqrstuvwxyz;
int abcdefghijklmnopqrstuvwxyZ; // Z 다름
// Duplicate local variable abcdefghijklmnopqrstuvwxyz
2. 예약어를 사용하면 안 됨
ex. true, final, String 등
3. 숫자로 시작하면 안 됨
ex. age1은 가능하지만, 1age는 불가
4. 특수문자는 '_'와 '$'만을 허용
- '$'는 내부 클래스에서 사용
- '_' 사용 시 컴파일 에러는 없지만, 관례상 사용하지 않는 것이 좋음
ex. sh@rp는 불가능하지만, $harp는 가능
int $intNumber; // 문제는 없지만 개발자가 직접 작성하진 않음
int int_number; // 자바는 카멜표기법 사용 int intNumber;
// DB에서는 _ 표기법 사용
5. 여러 단어 이름은 단어의 첫 글자를 대문자로 함.
단, 첫 시작 글자는 소문자로 하는 것이 관례 [ 카멜 표기법 ]
ex. ageOfEmpire, userName
char helloWorldLunchDinner;
6. 변수명은 언어를 가리지 않음
int 정수숫자;
double 실수1번 = 3.14;
// 실수1번에 3.14 리터럴 초기화 시키기
▶ 값 대입과 리터럴
1) 값 대입
- 생성한 변수(저장 공간)에 값을 집어 넣는 것
- 변수는 한 개의 데이터만 보관, 마지막에 대입한 값만 보관
booleanData = true;
// booleanData 변수에 true 값을 집어 넣기(대입)
2) 리터럴
- 변수에 대입되는 값 자체
short shortNumber = 32767;
// 자료형 변수명 = 리터럴
// 리터럴 : 변수에 대입되거나 작성되어지는 값 자체
// 타입에 따라서 리터럴 표기법이 다름
// 정수 자료형의 기본형
int intNumber = 214784=83647; // 변수 선언 및 초기화
long longNumber = 10000000000L; // 또는 소문자 l
// The literal 10000000000 of type int is out of range
float floatNumber = 1.2345f;
// Type mismatch: cannot convert from double to float
double doubleNumber = 3.141592;
// double은 실수형 중에서 기본형
// 리터럴 표기법이 없는 정수 혹은 실수는 기본형인 int 혹은 double로 인식
// 문자형 리터럴 표기법 : ''(홑따옴표)
// -> 문자 하나
char ch = 'A';
char ch2 = 66;
// ** char 자료형에 숫자가 대입될 수 있는 이유
// : 컴퓨터에 문자표가 존재하고 있는데
// 숫자에 따라 지정된 문자 모양이 매핑되어 있고
// 'B' 문자 그대로가 대입이 되면 변수에 숫자 66으로 변환되어 저장
// -> 반대로 생각하면 애초에 변수에 66이라는 숫자를 저장하는 것이 가능
System.out.println("ch : " + ch);
System.out.println("ch2 : " + ch2);
▶ 변수의 초기화
- 변수를 사용하기 전에 처음으로 값을 저장하는 것
→ 지역변수는 반드시 초기화 해야 됨
byte byteData = 127;
// 변수 선언 및 초기화
// 선언된 byteData 변수에 처음으로 127을 집어 넣음
// --> 초기화 : 변수에 처음으로 값을 대입
▶ 상수의 초기화
- 수학에서는 변하지 않는 값을 의미 / 프로그래밍 언어에서는 한 번만 저장(기록)할 수 있는 메모리 의미
- 변수의 한 종류
- 한 번 값이 대입되면 다른 값을 대입할 수 없음
- 자료형 앞에 final 키워드 작성 (마지막 대입되는 값)
- 상수 초기화 방법
1) 선언과 동시에 초기화
ex. final int NUM = 100;
2) 선언 후 초기화
ex. final int NUM;
NUM = 100; - 상수를 사용하는 경우
1) 변하면 안 되는 고정된 값을 저장할 때
2) 특정한 값에 의미를 부여하는 경우
final double PI_VALUE = 3.14;
// PI_VALUE = 1.23; 에러(대입 불가)
final int LEFT_MOVE = -1;
final int RIGHT_MOVE = 1;
▶ 문자열
1) 문자열 표현
- 컴퓨터에서 "기차", "출력하세요" 등과 같이 단어나 문장을 문자열이라고 표현
- " "로 묶여 있으면 문자열로 인식하여 Java에서는 String 객체를 이용하여 저장
- 다른 타입 + "문자열" → 문자열
"문자열" + 다른 타입 → 문자열
▶ 형변환 (casting)
- 값(Data)의 타입을 바꾸는 것 (boolean 제외)
1) 컴퓨터의 값 처리 원칙
- 같은 종류 타입만 대입 가능
- 같은 종류 타입만 계산 가능
- 계산의 결과도 같은 종류의 값이 나와야 함
- → 이러한 원칙이 지켜지지 않은 경우, 형변환이 필요
2) 형변환 예시
// 123456789 --> 123456789.0
// (int) (double)
// 'A' --> 65
//(char) (int)
// 3.14f --> 3
//(float) (int)
▶ 형변환 (casting)
- 값의 자료형을 변환하는 것 (단, boolean 제외)
- 자동 / 강제 형변환이 존재
- 형변환이 필요한 이유 :
컴퓨터는 기본적으로 같은 자료형끼리만 연산 가능. 즉, 다른 자료형과 연산 시 오류 발생
→ 이러한 상황을 해결하기 위해 필요한 기술이 형변환
1) 자동 형변환
- 값의 범위가 큰 자료형과 값의 범위가 작은 자료형의 연산 시
컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
int i1 = 3;
double d1 = i1;
// double은 실수만을 저장할 수 있는 자료형
// 정수가 대입되는 연산이 수행되면
// int -> double 변경 후 대입
System.out.println("i1 : " + i1 ); // 3
System.out.println("d1 : " + d1 ); // 3.0
System.out.println(d1 + doubleNumber); // 5.7
// int -> long 형변환
int i2 = 2_100_000_000; // 21억
long l2 = 10_000_000_000L; // 100억
long result2 = i2 + l2;
// int + long
// long + long
// long
System.out.println("result2 : " + result2); // result2 : 12100000000
// char -> int 형변환
char ch3 = 'P';
int i3 = ch3; // 대입도 연산!
// int 변수 = char 값
// int (자동 형변환)
System.out.println("i3 : " + i3);
// ( 가 > 나 > 갸 > 각 ) 한글은 뒤쪽에 번호 배치
char ch4 = '전';
int i4 = ch4;
System.out.println(i4);
2) 강제 형변환
- 값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환
- 강제 형변환 시 데이터 손실이 발생할 수 있음 → 데이터의 변형, 손실을 감수하고 강제 변환
▶ 데이터 오버플로우
// long -> float 자동 형변환
long l5 = 123456789123456789L;
float f5 = l5 * 100;
// float = long * int
// long * long
// long (결과)
// float = float(자동 형변환)
System.out.println(f5); // -6.1010652E18 (오버플로우)
// 오버플로우 현상은 컴퓨터가 미리 예측할 수 없다.
// -> 개발자가 미리 예측해야 함
int i6 = 2147483647; // int 최대값
long result6 = i6 + 1;
System.out.println(result6);
// i6 + 1 에서 이미 오버플로우 되었기 때문에 long 자료형으로도 int 최소값 출력
▶ 출력 메소드
1) System.out.print( )
- ( ) 안의 변수, 문자, 숫자, 논리 값을 모니터에 출력해주는 메소드
2) System.out.println( )
- print문과 동일하게 출력은 해주지만, 출력 후 자동으로 출력창에 줄바꿈을 해주는 메소드
3) System.out.printf("%형식", 변수 등)
- 정해져 있는 형식에 맞춰서 그 형식에 맞는 값(변수)을 줄바꿈 하지 않고 출력
▶ escape 문자
▶ Scanner
1) Scanner Class
- 사용자로부터 입력되는 정수, 실수, 문자열을 처리하는 클래스
2) import 작성
import java.util.Scanner;
3) Scanner 생성
Scanner sc = new Scanner(System.in);
4) 키보드 입력값 받기
// 1. 정수: sc.nextInt();
// 2. 실수: sc.nextFloat(); 또는 sc.nextDouble();
// 3. 문자열: sc.next(); 또는 sc.nextLine();
// ** next()는 띄어쓰기 입력불가, 띄어쓰기를 구분인자로 인식하여 각각 저장, 줄 구분까진 저장 X
// ** nextLine()은 문자열에 띄어쓰기 가능, 줄 구분까지 저장 O
'Java > 기본 개념' 카테고리의 다른 글
프로그래밍 기초 (0) | 2024.12.16 |
---|---|
컬렉션(Collection) (2) | 2024.11.17 |
스레드(Thread) (0) | 2024.11.17 |
네트워크(Network) (0) | 2024.11.17 |
입출력 (IO_Input / Output) (3) | 2024.11.17 |