수업내용/Java

[2022.09.02. 금] 변수

주니어주니 2022. 9. 2. 12:53

 

 

변수

 

  • 변수명(식별자)은 각각 다 다르게 해야 함 
  • 변수를 생성하기만 하면, 그 이전에 썼던 쓰레기값이 들어가 있기 때문에 반드시 초기화 필요 

 

식별자

  • 다른 것과 구분되는 이름
    예) 클래스명, 메소드명, 변수명
  • 문자, 숫자, _를 조합해서 정한다.
    예) no, name, studentName, totalOrderPrice, IMAGE_SAVED_DIRECTORY, Student, Professor
    예) param1, param2, address1, address2, address3
  • 숫자가 제일 처음에 올 수 없다. 
    예) 1a, 1address, 2address, 3address     //모두 문법 오류

 

식별자 작성 관례(Convention)

  1. 두 단어 이상의 합성어인 경우 두번째 단어의 첫글자를 대문자로 적는다.
    예) studentName, totalOrderPrice
          student_name (언더바 X), IMAGE_SAVED (상수일때만 전부 대문자 + 언더바 O)

  2. 식별자는 소문자로 시작한다. 단, 클래스명은 대문자로 시작한다.

  3. 상수(변하지 않는 값)는 전부 대문자로 적고, 합성일 때는 각 단어들은 _로 구분한다. 
    예) double PI = 3.141592;     // 원주율
          double E = 2.7182818...  // 자연로그 e 
          String PROFILE_IMAGE_SAVE_DIRECTORY = "c:\projects\shopping\resources\images\profile"; 

  4. 클래스명과 변수명은 명사형 이름, 메소드는 동사형 이름으로 정한다. 
    예) 학생정보를 관리하는 클래스: StudentManager
          학생이름을 저장하는 변수: name
          학생성적을 저장하는 메소드: addStudentScore
          제목으로 책정보를 조회하는 메소드: getBooksByTitle

  5. 식별자는 그 의미를 잘 드러내는 이름이어야 한다.
    예) 나쁜 식별자: 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