변수
- 변수명(식별자)은 각각 다 다르게 해야 함
- 변수를 생성하기만 하면, 그 이전에 썼던 쓰레기값이 들어가 있기 때문에 반드시 초기화 필요
식별자
- 다른 것과 구분되는 이름
예) 클래스명, 메소드명, 변수명 - 문자, 숫자, _를 조합해서 정한다.
예) no, name, studentName, totalOrderPrice, IMAGE_SAVED_DIRECTORY, Student, Professor
예) param1, param2, address1, address2, address3 - 숫자가 제일 처음에 올 수 없다.
예) 1a, 1address, 2address, 3address //모두 문법 오류
식별자 작성 관례(Convention)
- 두 단어 이상의 합성어인 경우 두번째 단어의 첫글자를 대문자로 적는다.
예) studentName, totalOrderPrice
student_name (언더바 X), IMAGE_SAVED (상수일때만 전부 대문자 + 언더바 O) - 식별자는 소문자로 시작한다. 단, 클래스명은 대문자로 시작한다.
- 상수(변하지 않는 값)는 전부 대문자로 적고, 합성일 때는 각 단어들은 _로 구분한다.
예) double PI = 3.141592; // 원주율
double E = 2.7182818... // 자연로그 e
String PROFILE_IMAGE_SAVE_DIRECTORY = "c:\projects\shopping\resources\images\profile"; - 클래스명과 변수명은 명사형 이름, 메소드는 동사형 이름으로 정한다.
예) 학생정보를 관리하는 클래스: StudentManager
학생이름을 저장하는 변수: name
학생성적을 저장하는 메소드: addStudentScore
제목으로 책정보를 조회하는 메소드: getBooksByTitle - 식별자는 그 의미를 잘 드러내는 이름이어야 한다.
예) 나쁜 식별자: no, a1, a2, num1, num2, score1, score2, total, average
좋은 식별자: studentNo, employeeNumber, korScore, totalOrderPrice, reviewAverageScore
package day2;
public class Variable1 {
public static void main(String[] args) {
// 변수의 생성과 초기화
/*
* 변수의 생성
* 자료형 변수명;
* 예시)
* int age; // 정수값을 담는 저장소를 생성하고, 그 저장소의 이름을 age로 지정함
* double weight; // 실수값을 담는 저장소를 생성하고, 그 저장소의 이름을 weight로 지정함
* boolean isSuccess; // 논리값(true/false)을 담는 저장소를 생성하고, 그 저장소의 이름을 isSuccess로 지정함
* char grade; // 문자 하나를 담는 저장소를 생성하고, 그 저장소의 이름을 grade로 지정함
* 변수의 초기화
* 변수 생성 시점에 변수를 초기화하기
* 자료형 변수명 = 초기값;
* 예시)
* int age = 19; // 정수를 담는 저장소 생성, 저장소명을 age로 지정, 19를 저장소에 저장함
* double weight = 69.5;
* boolean isSuccess = false; // 논리값을 담는 저장소 생성, 저장소명을 isSuccess로 지정, 예약어 false가 나타태는 값이 저장소에 저장됨
* char grade = 'B';
*
* 변수 생성 후에 변수를 초기화하기
* 자료형 변수명; // 변수 생성
* 변수명 = 값; // 변수 초기화
* 예시)
* int age;
* age = 10;
*/
// 변수의 생성과 초기화 실습
// 국어점수, 영어점수, 수학점수를 저장하고 출력하기
int korScore = 100;
int engScore = 80;
int mathScore = 90;
// 저장소명이 korScore인 저장소에 저장된 값을 출력하기
System.out.println(korScore);
System.out.println(engScore);
System.out.println(mathScore);
// 저장소명이 korScore인 저장소에 저장된 값, engScore인 저장소에 저장된 값, mathScore인 저장소에 저장된 값을 더하고 그 연산결과를 출력하기
System.out.println(korScore + engScore + mathScore);
System.out.println((korScore + engScore + mathScore)/3);
int 이응수 = 100;
System.out.println("이응수"); // 문자열 "이응수"를 출력
System.out.println(이응수); // 저장소명이 이응수인 저장소에 저장된 값을 출력
}
}
100
80
90
270
90
이응수
100
package day2;
public class Variable2 {
public static void main(String[] args) {
// 각 자료형별 변수 생성과 초기화
// 정수형
byte b1 = 100;
byte b2 = -100;
// byte b3 = 300; // byte 자료형의 범위 초과
short s1 = 10000;
int i1 = -100_000;
int i2 = 1_000_000_000;
// int i3 = 3_000_000_000; // int 자료형의 범위 초과
long l1 = 10000000000L; // 정수리터럴의 기본타입이 int 타입이기 때문에 int의 범위를 벗어나는 정수값을 적을 때는 숫자 끝에 L, l을 적는다.
// 실수형
float f1 = 10.0f; // 실수리터럴의 기본타입은 double 타입이기 때문에 float타입(4byte)은 double타입(8byte)을 저장할 수 없다.
float f2 = -0.5f; // 실수값을 float에 저장할 때는 끝에 F, f를 적는다.
double d1 = 10.0;
double d2 = -0.5;
// 문자형
char c1 = 'A'; // 문자 'A'를 대입한다.
char c2 = 65; // 아스키코드표에서 65에 해당하는 문자 'A'가 대입된다.
char c3 = '\u0041'; // 유니코드표에서 0041에 해당하는 문자 'A'가 대입된다.
System.out.println(c1);
System.out.println(c2);
System.out.println(c3);
/*
* Escape 문자
* 줄바꿈문자 \n
* 탭문자 \t
* 백스페이스문자 \b
* 역슬래시 \\
* 홑따옴표 \' <-- 문자 리터럴의 시작과 끝을 나타내는 '이 아닌 단순한 문자 '를 나타낸다.
* 쌍따옴표 \" <-- 문자열 리터럴의 시작과 끝을 나타내는 "이 아닌 단순한 문자 "를 나타낸다.
*/
char c4 = '\'';
char c5 = '\\';
System.out.println(c4);
System.out.println(c5);
// 논리형
boolean bool1 = true; // boolean, true, false는 예약어
boolean bool2 = false;
// boolean bool3 = "true"; // 문자열 "true", "false"는 논리형 타입의 변수에 저장할 수 없다.
// boolean bool4 = "false";
// boolean bool5 = 1; // 1, 0이 true, false를 나타내지 못한다.
// boolean bool6 = 0;
}
}
A
A
A
'
\
아스키코드 - American Standard 어쩌구라서 알파벳만 있음
유니코드 - 전세계 문자, 기호
- 1bit - 2가지 값 표현
[0]
[1]
- 4bit - 16가지 값 표현 (2^4)
[0][0][0][0] - 0부터
[1][1][1][1] - 15까지 (= 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0 = 8+4+2+1)
0부터 15까지의 16개를 16진수로 표현 가능
16진수 : 0 1 2 3 4 5 6 7 8 9 A B C D E F
- 1byte (=8bit) - 256가지 값 표현 (2^8)
[0][0][0][0] [0][0][0][0]
[0][0][0][0] [0][0][0][1]
[0][0][0][0] [0][0][1][0]
[0][0][0][0] [0][0][1][1]
....
[1][1][1][1] [1][1][1][1]
- 2 byte (=16bit) - 256*256 = 65536가지 값 표현 (2^16) (= 유니코드 타입, char 타입)
[0][0][0][0] [0][0][0][0] [0][0][0][0] [0][0][0][0]
....
[1][1][1][1] [1][1][1][1] [1][1][1][1] [1][1][1][1]
0 0 0 0 부터
[0][0][0][0] [0][0][0][0] [0][0][0][0] [0][0][0][0]
F F F F 까지
[1][1][1][1] [1][1][1][1] [1][1][1][1] [1][1][1][1]
→ 16자리를 4개 문자(16진수 0000~FFFF)로 표현 가능
A
10진수로 65
16진수로 41 (=0041)
0 0 4 1
[0][0][0][0] [0][0][0][0] [0][1][0][0] [0][0][0][1]
가
16진수로 AC00
A C 0 0
[1][0][1][0] [1][1][0][0] [0][0][0][0] [0][0][0][0]
이런 유니코드를 사용해서
페이지 기능들을 일일이 번역하지 않아도 자동 번역 가능
국제화처리(Internationalization) - 유니코드
i18n ( i와 n사이에 18개 문자가 있음 )
연산
1. 연산에 참여한 값의 타입과 연산 결과값의 타입은 동일하다.
정수/정수 -> 정수
실수/실수 -> 실수
10 / 3 -> 3
10.0 / 3.0 -> 3.3333
2. 연산에 참여하는 값의 타입이 서로 다르면 같은 타입으로 변환 후 연산이 수행된다.
※ 변환규칙
작은 크기의 자료형 -> 큰 크기의 자료형
정밀도가 낮은 자료형 -> 정밀도가 높은 자료형
* 실수형의 연산은 내가 예상한 계산과 다를 수 있음
-> 먼저 소수점을 없애서 정수형으로 바꾼 다음에 그만큼 다시 나눔
-> 그래야 내가 예상한 값이 나옴
(특히 돈과 관련된 연산에서는 꼭 이렇게 해야 함!)
package day2;
public class Variable3 {
public static void main(String[] args) {
// 변수의 사용
// 국어점수, 영어점수, 수학점수에 대한 총점, 평균을 출력하기
int korScore = 90;
int engScore = 60;
int mathScore = 80;
int totalScore = korScore + engScore + mathScore;
double scoreAverage = totalScore / 3;
System.out.println(totalScore);
System.out.println(scoreAverage);
// 실수값의 계산
double x = 0.1;
double y = 0.2;
double z = (x*10 + y*10) / 10;
System.out.println(z);
}
}
230
76.0
0.3
package day2;
public class Variable4 {
public static void main(String[] args) {
/*
* 기본 자료형의 형변환
* - 형변환은 값의 타입이 변하는 것이다. (절대로, 변수의 타입은 변하지 않는다.)
* - 형변환의 예시
* 정수 <---> 실수
* 정수 <---> 문자
*
* - 형변환의 종류
* <자동 형변환>
* * 컴파일러가 자동으로 값의 타입을 변환시킴
* 예) 연산에 참여하는 값의 타입이 서로 다를 때 자동으로 형변환
* 조건) 데이터가 손실되지 않는 방향으로의 형변환만 가능
* double x = 3; // 3 -> 3.0 으로 변환 ( 데이터 손실 X, 자동형변환 O )
* int x = 3.14; // 3.14 -> 3 으로 변환 ( 데이터 손실 O, 자동형변환 X ), 오류 발생
*
* <강제 형변환>
* * 개발자가 명시적으로 값의 형변환을 정의
* * 형변환 연산자를 사용해서 명시적으로 형변환을 지정
* 예) int x = (int) 3.14;
*
* int subjectCount = 3;
* int subjectTotalScore = 230;
* double subjectAverage = (double) subjectTotalScore / subjectCount;
*/
// 대입 연산에서 변수의 타입은 double, 값의 타입은 int다.
// 변수의 타입은 변할 수 없으므로, 값의 타입을 변수의 타입과 같은 double로 변환한다.
// 값이 3에서 3.0으로 변환되었다. 데이터의 손실이 발생하지 않았다.
// 자동형변환 완료, 3.0이 number1에 대입된다.
double number1 = 3;
System.out.println(number1);
// 대입 연산에서 변수의 타입은 int, 값의 타입은 double이다.
// 변수의 타입은 변할 수 없으므로, 값의 타입을 변수의 타입과 같은 int로 변환한다.
// 값이 3.14에서 3으로 변환되면, 데이터 손실이 발생한다.
// 데이터 손실이 발생하는 형변환이기 때문에 문법오류가 발생한다.
// int number2 = 3.14; // 문법오류
// 대입 연산에서 변수의 타입은 char, 값의 타입은 정수.
// 변수의 타입은 변할 수 없으므로, 값의 타입을 변수과 같은 char로 변환한다.
// 자바는 유니코드 문자표에서 65번째 문자를 찾아서 'A'로 변환한다.
// 자동형변환이 완료되고, 'A'가 ch1에 대입된다.
char ch1 = 65;
int ch2 = 'A';
System.out.println(ch1);
System.out.println(ch2);
// 개발자가 실수값을 정수타입으로 변환하라고 명시적으로 선언하고 있다.
// 컴파일러는 데이터의 손실이 발생하더라도 3.14를 3으로 변환한다.
// number3 변수에 3이 대입된다.
int number3 = (int) 3.14;
System.out.println(number3);
// 변수명에 형변환 연산자를 사용하면 변수의 타입을 변경하는 것이 아니라
// 그 변수에서 조회한 값을 형변환 연산자에 해당하는 타입의 값으로 바꾸는 것
// 해당 변수에는 여전히 원래값이 저장되어 있다.
int subjectCount = 3;
int korScore = 100;
int engScore = 60;
int mathScore = 70;
int totalScore = korScore + engScore + mathScore;
double average = totalScore / (double) subjectCount;
System.out.println(average);
System.out.println(subjectCount);
}
}
3.0
A
65
3
76.66666666666667
3
- 참조자료형 타입의 변수 설명
기본형 - 저장소에 값이 직접 들어가 있음
참조형 - 별도의 실물을 만들고, 그 객체가 생성된 곳의 주소값을 가짐, 그 주소값이 객체를 참조함
- name에는 실제 값이 아닌, 생성된 객체의 주소값(참조값)이 들어가 있고,
"홍길동"이라는 값은 그 주소값이 가리키는(참조하는) 객체에 들어가 있음
- name ≒ 리모컨
- 객체가 3개일 때
package day2;
public class Variable5 {
public static void main(String[] args) {
/*
* 문자와 문자열
* <문자>
* 변수의 타입: char
* 기본자료형 타입
* 값이 단순함
*
* <문자열>
* 변수의 타입: String
* 참조자료형 타입
* 값이 복잡해서 다양한 기능 필요
* (소문자/대문자변환, 문자열 잘라내기, 특정 문자가 포함 여부,
* 문자열 길이 확인, 특정 문자가 몇번째에 있는지, 특정 위치에 무슨 문자가 있는지 알아내기 등)
* 그래서 설계도(클래스)와 객체 필요한 것
*/
// 자바가상머신이 char타입의 변수(저장소)를 생성하고, 그 저장소에 문자 '가'를 저장한다.
char ch1 = '가'; // 기본 자료형타입의 변수에 직접 저장된 값
// 자바가상머신이 String설계도로 객체를 생성하고,
// 그 객체에 문자열 "가"를 저장한 다음, 그 객체의 주소값을 str1에 대입한다.
String str1 = "가"; // str1이 바라보는(참조하는) 객체에 저장된 값
}
}
'수업내용 > Java' 카테고리의 다른 글
[2022.09.08.목] 배열 (0) | 2022.09.08 |
---|---|
[2022.09.07.수] switch문, 반복문 (0) | 2022.09.07 |
[2022.09.06.화] 제어문과 반복문 (if문, for문) (0) | 2022.09.06 |
[2022.09.05.월] 연산자 (0) | 2022.09.05 |
[2022.09.01.목] 오티 (1) | 2022.09.01 |