프로그램 실행 시 사용할 값(Data)이 있다면 그 값은 먼저 메모리에 기록되어야 함
메모리(RAM)에 값을 기록하기 위한 공간
√ 변수를 사용하지 않으면
System.out.println(2 * 3.141592653589793 * 10);
System.out.println(3.141592653589793 * 10 * 10);
System.out.println(3.141592653589793 * 10 * 10 * 20);
System.out.println(4 * 3.141592653589793 * 10 * 10);
√ 변수를 사용하면
double pi = 3.141592653589793;
int r = 10;
int h = 20;
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개의 비트가 모여 하나의 바이트가 구성됨
메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것
√ 값 대입
생성한 변수(저장 공간)에 값을 대입하는 것
int age;
age = 10;
age = 20;
※ 변수는 한 개의 데이터만 보관, 마지막에 대입한 값만 보관
√ 리터럴
변수에 대입되는 값 자체
short s = 32767;
int i = 100;
long l = 10000L;
float f = 0.123f;
double d = 3.14;
char c = 'A';
String str = "ABC";
변수를 사용하기 전에 처음으로 값을 저장하는 것
→ 지역변수는 반드시 초기화 해야 된다.
√ 선언 후 초기화
int age;
age = 100;
√ 선언과 동시에 초기화
int age = 100;
package edu.kh.variable;
// class : 자바 코드 작성 영역
public class VariableEx2 {
// main method : 자바 코드 실행을 위한 구문
public static void main(String[] args) {
//System.out.println("확인"); // 한 줄 출력
// 실행 : ctrl + F11 또는 Run 버튼
// 변수 : 메모리에 값을 저장하기 위한 공간
// 변수 선언 : 메모리에 값을 저장할 공간을 생성(할당)
// 자료형 : 변수의 종류 지정(크기, 형식별로 다름)
// 기본 자료형 8가지
/* 논리형 : boolean (1byte)
*
* 정수형 : byte (1byte)
* short (2byte)
* int (4byte, 정수 기본형)
* long (8byte)
*
* 실수형 : float (4byte)
* double (8byte, 실수 기본형)
*
* 문자형 : char (2byte, 유니코드(UTF-16))
* */
// 자료형 변수명
boolean booleanData;
// 논리형 데이터(true/false)를 저장할 공간
// 1byte를 메모리(RAM)에 할당하고
// 그 공간을 booleanData라고 부르겠다.
int number1;
// 정수형 데이터를 저장할 공간
// 4byte를 메모리에 할당하고
// 그 공간을 number1이라고 부르겠다.
double number2;
// 실수형 데이터를 저장할 공간
// 8byte를 메모리에 할당하고
// 그 공간을 number2라고 부르겠다.
char ch;
// 문자형 데이터를 저장할 공간
// 2byte를 메모리에 할당하고
// 그 공간을 ch라고 부르겠다.
/* 변수에 값 대입하기 */
// -> 생성한 변수에 값을 저장(대입)하는 것
// 변수명 = 값;
// = 기호 : 대입 연산자(오른쪽 값을 왼쪽 변수에 저장)
booleanData = true;
// number1 = 123456789.123;
// Type mismatch: cannot convert from double to int
// int형 변수 number1에 실수를 저장할 수 없다.
number1 = 123456789;
number2 = 9.87654321;
// ch = 'AA'; // char 자료형은 '' 안에 문자 하나만 작성 가능
ch = 'A';
System.out.println("[값 대입 결과 확인]");
System.out.println(booleanData);
System.out.println(number1);
System.out.println(number2);
System.out.println(ch);
/* 변수에 대입된 값 변경 */
ch = '하';
System.out.println("[ch 값 변경]");
System.out.println(ch);
/* 리터럴 */
// - 직접 작성한 값 또는 변수에 대입되는 값
// ** 자료형별로 리터럴 표기하는 방법이 별도 존재 **
// int : 10, - 50, 0 (기본 정수 표기법)
// long : 2147483648L, 0L, -10L (l, L)
// double : 3.14, -123.456, 0.0 (기본 실수 표기법, 모두 실수 형태로 작성)
// float : 3.14F, -123.456F, 0.0F (f, F)
// boolean : true, false
// char : '가', 'Z' (홑따옴표)
// 또는 0 ~ 65535 사이 정수
// byte, short : 10, 0, -312 (int와 동일)
// 왜 int와 동일할까?
// -> byte, short는 옛날 코드와의 호환을 위해 만들어진 자료형
// --> 사용 빈도가 낮아서 별도의 리터럴 표기법을 제작 X
// --> 임시로 int 표기법 사용
long number3 = 10000000000L; // 100억
// L을 붙이지 않으면 int 표기법으로 인식되어
// 100억이 int로 해석되어짐
// -> int의 범위 약 21억을 초과하여 오류 발생
float number4 = 1.23F;
// 1.23은 double의 표기법으로 인식되어
// float형 변수에 저장할 수 없어서 오류 발생
// -> F를 붙여서 해결
byte number5 = 100;
short number6 = 200;
// byte, short는 int 표기법 사용
System.out.println("[리터럴 확인]");
System.out.println(number3);
System.out.println(number4);
System.out.println(number5);
System.out.println(number6);
// 출력 시 리터럴 표기법은 생략된다.
// char 자료형의 특징 (p.52 참고)
// - char 자료형은 정확히는 정수를 저장하는 정수형
// 다만, 정수를 저장하고 있다가
// 화면에 출력 시 문자표에 대응되는 문자가 출력된다.(인코딩)
// char 변수 선언과 동시에 초기화
char test1 = 'A';
char test2 = 65;
System.out.println("[char 특징 확인]");
System.out.println(test1);
System.out.println(test2);
}
}
수학에서는 변하지 않는 값 의미
컴퓨터(Java)에서는 한 번만 저장(기록)할 수 있는 메모리 의미
√ 상수 선언 방법
final int AGE;
√ 상수 초기화 방법
1) 선언과 동시에 초기화
final int NUM = 100;
2) 선언 후 초기화
final int NUM;
NUM = 100;
※ 초기화 이후 다른 데이터(값)을 대입할 수 없다.
package edu.kh.variable;
public class VariableEx3 {
public static void main(String[] args) {
// 변수 : 메모리에 값을 저장할 수 있는 공간
// 저장된 값은 변할 수 있다.
// 상수 : 메모리에 값을 저장할 수 있는 공간
// 한번 저장된 값은 변할 수 없다.
// 상수 예약어 : final
// 변수 값 변경 확인
int num1 = 100;
num1 = 200;
// 상수 값 변경 확인
final int num2 = 99;
// num2 = 999;
// The final local variable num2 cannot be assigned.
// It must be blank and not using a compound assignment
// -> 한 번 값이 저장된 상수 num2에 다른 값을 저장하지 못함
/* 상수 명명 규칙 및 활용법 */
// - 명명규칙 : 모두 대문자 표기, 단어 구분 시 _ 사용
final int CONSTANT_NUMBER = 0;
// - 활용법
final double PI = 3.14;
double result = PI * 10 * 10; // 314.0
System.out.println(result);
final int UP = 5;
final int DOWN = -5;
final int INIT = 0; // 초기화(처음으로)
System.out.println("-------------");
int result2 = INIT;
System.out.println(result2); // 0;
// 대입 연산자(=) 기호를 기준으로
// 오른쪽부터 해석
result2 = result2 + UP;
System.out.println(result2); // 5
result2 = result2 + DOWN + DOWN;
System.out.println(result2); // -5
// ** 변수 명명 규칙 (반드시 지키세요!) **
// 1. 대소문자 구분되며 길이 제한 X
int apple;
// int apple; // Duplicate local variable apple (변수명 중복)
int applE;
int freeTradeAgreement;
int showMeTheMoney;
int asenlsrlsllsjelnvioolllewjlelanlewlkewajflaweflweajfwjeafjwe;
// 2. 예약어 사용 금지
// int int;
// double char;
// boolean final;
// 3. 숫자로 시작 금지
// long 100number; // 에러
long number100;
// 4. 특수문자는 $, _만 사용 가능
float $number;
float _num_ber;
// float @num#ber; // 에러
// 5. 카멜 표기법
// - 변수명 첫 글자는 소문자
// - 연결된 단어의 첫 글자는 대문자
int studentAge;
char helloWorld;
// 참고) 변수명에 언어 제한이 없음
int 정수1번;
double 실수1번;
char 車;
}
}
√ 문자열 표현
컴퓨터에서 "기차, "출력하세요"등과 같이 단어나 문장을 문자열이라고 표현
""로 묶여 있으면 문자열로 인식하면 Java에서는 String 객체를 이용하여 저장
√ 문자열 초기화
String str = "기차";
String str = new String("기차");
String str = "기차" + "칙칙폭폭";
String str = new String("기차" + "칙칙폭폭");
String str = "기차" + 123 + 45 + "출발";
String str = 123 + 45 + "기차", "출발";
다른 자료형 + "문자열" → 문자열
"문자열" + 다른 자료형 → 문자열
package edu.kh.variable;
public class VariableEx4 {
public static void main(String[] args) {
// String(문자열)
// - 문자열을 저장하는 자료형
// - 기본 자료형 X
// - 참조형 O
// 문자열 리터럴 표기법 : "" (쌍따옴표)
String str1 = "hello";
System.out.println(str1);
// 출력하고자 하는 값의 리터럴 표기법을 작성
System.out.println("안녕하세요?");
System.out.println("------------");
String name = "김찬희";
int age = 29;
char gender = '남';
System.out.println(age + 1); // 정수 + 정수 = 두 수의 합
System.out.println(name + "입니다."); // 문자열 + 문자열 = 이어쓰기
System.out.println(name + age); // 문자열 + 정수 = 이어쓰기
System.out.println(name + age + gender); // 문자열 + 정수 + 문자형 = 이어쓰기
// 김찬희님은 29세 남성입니다.
System.out.println(name + "님은 " + age + "세 " + gender + "성입니다.");
// 사칙연산 연산 순위 적용(왼쪽 -> 오른쪽)
System.out.println(100 + age + name); // 정수 + 정수 + 문자열
// = 두 정수 합 + 문자열 (이어쓰기)
}
}
값(Data)의 자료형을 바꾸는 것 (boolean 제외)
√ 컴퓨터의 값 처리 원칙
같은 종류 자료형만 대입 가능
같은 종류 자료형만 계산 가능
계산의 결과도 같은 종류의 값이 나와야 함
→ 이러한 원칙이 지켜지지 않은 경우에 형변환이 필요함
√ 형변환 예시
→ 형변환 하고자 하는 값과 자료형의 표현 범위 차이에 따라 형변환 방법이 나뉨(자동 형변환, 강제 형변환)
값의 범위가 큰 자료형과 값의 범위가 작은 자료형의 연산 시
컴파일러가 자동으로 값의 범위가 작은 자료형을 값의 범위가 큰 자료형으로 변환
값의 범위가 큰 자료형을 값의 범위가 작은 자료형으로 변환
강제 형변환 시 데이터 손실이 발생할 수 있음 → 데이터의 변형, 손실을 감수하고 강제 변환
double temp;
int name = (int)temp;
√ 데이터 손실
package edu.kh.variable;
public class VariableEx5 {
public static void main(String[] args) {
/* 형변환(Casting) : 값의 자료형을 변환하는 것
*
* 형변환은 왜 필요한가?
* -> 컴퓨터의 값 처리 원칙을 위배하는 경우를 해결하기 위해 필요
* (같은 자료형끼리 연산, 결과도 같은 자료형)
*
* [자동 형변환]
* - <값의 범위>가 서로 다른 두 값의 연산 시
* <컴파일러(번역기)>가 자동으로
* <값의 범위>가 작은 자료형을 큰 자료형으로 변환
* */
// 자동 형변환 확인 1
int num1 = 10;
long num2 = 100L;
System.out.println("num1 + num2 = " + (num1 + num2));
// int + long
// 10 + 100L
// long + long
// 10L + 100L
// 자동 형변환 확인 2
int num3 = 300;
double num4 = 12.3;
// 연산 결과를 예상해서 저장할 변수의 자료형을 선택
double result1 = num3 + num4;
// 300(int) + 12.3(double)
// -> 300.0(double) + 12.3(double)
// -> 312.3(double);
System.out.println(num3 + " + " + num4 + " = " + result1);
// 자동 형변환 확인 3
// char -> int 자동형변환
char ch5 = 'g';
// = : 대입 연산자 (대입도 연산이다!)
int num5 = ch5; // int = char
// -> int = int (자동 형변환)
System.out.println(ch5 + "'s Unicode Number : " + num5);
System.out.println("-----------");
/* [강제 형변환]
* - 값의 범위가 큰 자료형을 작은 자료형으로 강제 변환
*
* + 변수나 값을 원하는 형태의 자료형으로 강제 변환
* (값의 범위 상관 X)
*
* */
// 강제 형변환 확인 1 : 데이터 손실 확인
int test1 = 290;
byte test2 = (byte)test1; // Type mismatch: cannot convert from int to byte
// 변환 시키고자 하는 자료형을 명시해서 강제 변환
System.out.println("test1 : " + test1);
System.out.println("test2 : " + test2);
// ctrl + alt + 방향키 위/아래 : 라인 복사
// 화면 뒤집힐 경우!
// -> 인텔HD그래픽 -> 그래픽 옵션 -> 바로가기 키 -> 사용 안함
// 강제 형변환 확인 2 : 소수 버림
double test3 = -1.3;
int test4 = (int)test3;
System.out.println("test3 : " + test3);
System.out.println("test4 : " + test4);
// 강제 형변환 확인 3 : 값의 범위 관계없이 변환
int test5 = 1;
int test6 = 2;
System.out.println(test5/test6);
// 1 / 2 = 0.5 (double)
// int / int = int <┘ (컴파일러가 강제 형변환)
// 자동 형변환 + 강제 형변환
System.out.println((double)test5/test6);
// 강제 형변환
// -> 1.0(double) / 2(int)
// -> 2.0(double) 자동 형변환
// 1.0 / 2.0 = 0.5
System.out.println("------------------");
// 강제 형변환 기타 등등...
// - 변수에만 강제 형변환이 가능한 것은 아니다!
System.out.println( (double)65 ); // 65.0
System.out.println( (char)65 ); // A
System.out.println( (int)'B' ); // 66
// 데이터 오버플로우
byte bNum = 126;
System.out.println(bNum); // 126
bNum = (byte)(bNum + 1);
// (byte)((int)127)
System.out.println(bNum); // 127
bNum = (byte)(bNum + 1);
// (byte)((int)128)
System.out.println(bNum); // -128 (오버플로우 발생)
// 오버플로우 확인
int iNum1 = 1000000000; // 10억
int iNum2 = 2000000000; // 20억
int iNum3 = iNum1 + iNum2; // 30억이 나와야 되지만...
// 해결 방법
// long iNum3 = (long)iNum1 + iNum2;
System.out.println(iNum3);
// ** 값의 범위를 잘못 예측한 경우 오버플로우가 발생함!! **
}
}
√ System.out.print()
() 안의 변수, 문자, 숫자, 논리 값을 모니터에 출력해주는 메소드
√ System.out.println()
print문과 동일하게 출력은 해주지만 출력 후 자동으로 출력창에 줄바꿈을 해주는 메소드
√ System.out.printf("%형식", 변수 등)
정해져 있는 형식에 맞춰서 그 형식에 맞는 값(변수)을 줄바꿈 하지 않고 출력
%d : 정수형
%o : 8진수
%x : 16진수
%c : 문자
%s : 문자열
%f : 실수(소수점 아래 6자리)
%e : 지수형태표현
%g : 대입 값 그대로
%A : 16진수 실수
%b : 논리형
정렬방법
package edu.kh.variable;
public class PrintEx {
public static void main(String[] args) {
// 출력 메서드
// System.out.print();
// -> () 안의 내용을 출력 (끝나고 줄바꿈 X)
// System.out.println();
// -> () 안의 내용을 출력 (끝나고 줄바꿈 O)
System.out.println(1);
System.out.println(2);
System.out.println(3);
// System.out.printf("패턴이 포함된 문자열", 변수 또는 값);
// -> "패턴이 포함된 문자열" 출력 시
// 패턴 자리에 뒤에 작성된 변수 또는 값을 순서대로 대입
String name = "홍길동";
int age = 30;
char gender = '남';
double height = 185.8;
// 홍길동님은 나이 30세 키 185.8cm의 남성입니다.
// println()
System.out.println(name + "님의 나이 " + age + "세, 키 " + height +
"cm의 " + gender + "성입니다.");
// printf()
// %s : 문자열
// %d : 10진 정수
// %f : 실수(기본 소수점 6자리)
// -> %.1f 소수점 아래 1자리까지 표시
// -> %.2f 소수점 아래 2자리까지 표시
// %c : 문자형
// %b : 논리형
System.out.printf("%s님의 나이 %d세, 키 %.1fcm의 %c성입니다.",
name, age, height, gender);
// printf()는 출력 후 줄이 바뀌지 않는다!!
// 해결방법 1) System.out.println(); 작성
// 해결방법 2) 탈출(escape) 문자 \n 작성
System.out.println("\nHello\t\t\t World \u0050");
}
}
√ Scanner Class
사용자로부터 입력되는 정수, 실수, 문자열을 처리하는 클래스
√ import 작성
import java.util.Scanner;
√ Scanner 생성
Scanner sc = new Scanner(System.in);
√ 키보드 입력값 받기
1. 정수 : sc.nextInt();
2. 실수 : sc.nextFloat(); 또는 sc.nextDouble();
3. 문자열 : sc.next(); 또는 sc.nextLine();
next()는 띄어쓰기 입력불가, 띄어쓰기를 구분인자로 생각하여 각각 저장, 줄 구분까지 저장하지 않음
nextLine()은 문자열에 띄어쓰기 가능, 줄 구분까지 저장
package edu.kh.variable;
import java.util.Scanner;
public class ScannerEx {
public static void main(String[] args) {
// Scanner : 프로그램 실행 중 입력을 받는 객체
// 1) class 선언부 위쪽에
// import java.util.Scanner; 구문 추가
// 2) Scanner 객체 생성
Scanner sc = new Scanner(System.in); // System.in : 키보드
// 3) Scanner를 이용해서 키보드 입력 값 얻어오기
System.out.print("정수 입력 1 : ");
int input1 = sc.nextInt();
// sc.nextInt() : 다음 입력되는 정수를 얻어옴
// System.out.println(input1);
System.out.print("정수 입력 2 : ");
int input2 = sc.nextInt();
System.out.printf("%d + %d = %d", input1, input2, input1 + input2);
}
}
package edu.kh.variable;
import java.util.Scanner;
public class ScannerEx2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// sc.next() : 다음 입력되는 한 단어를 얻어옴 Hello World 에서 Hello 띄어쓰기로 구분
// sc.nextInt() : 다음 입력되는 정수를 얻어옴
// sc.nextDouble() : 다음 입력되는 실수를 얻어옴
System.out.print("이름 : ");
String inputName = sc.next();
System.out.print("나이 : ");
int inputAge = sc.nextInt();
System.out.print("키 : ");
double inputHeight = sc.nextDouble();
// 홍길동님은 25세, 키 174.5cm 입니다.
System.out.printf("%s님은 %d세, 키 %.1fcm 입니다.", inputName, inputAge, inputHeight);
}
}
Working Directory 이클립스 작업 저장(git add(save)) ->
Staging Area 스테이지 준비 공간(변한 코드) 깃에 올리는 것(commit)->
Local Repository Git 다시 가져오는 것(merge) / 학원에 올린다(push)
Remote Reposiotry GitHub Git 으로 다시 주는 것(fetch)