변수 (Variable)

김찬희·2023년 2월 10일
0

KH정보교육원

목록 보기
2/27

▶ Data(값) 처리 과정(참고)

프로그램 실행 시 사용할 값(Data)이 있다면 그 값은 먼저 메모리에 기록되어야 함

▶ 변수 (Variable)

메모리(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개의 비트가 모여 하나의 바이트가 구성됨

▶ 변수의 선언

메모리 공간에 데이터를 저장할 수 있는 공간을 할당하는 것

▶ 자료형 (Type)

▶ 변수 저장 가능 범위

▶ 변수의 명명 규칙

  1. 대소문자가 구분되며 길이 제한이 없다.
  2. 예약어를 사용하면 안 된다.
    ex) true, final, String 등
  3. 숫자로 시작하면 안 된다.
    ex) age1은 가능하지만 1age는 불가능
  4. 특수문자는 '_'와 '$'만을 허용한다.
    ㆍ $는 내부 클래스에서 사용
    ㆍ __사용 시 컴파일 에러는 없지만 관례상 사용하지 않는 것이 좋음
    ex) sh@rp는 불가능하지만 $harp는 가능
  5. 여러 단어 이름은 단어의 첫 글자를 대문자로 한다.
    단, 첫 시작 글자는 소문자로 하는 것이 관례이다.
    ex) ageOfVampire, userName

▶ 주요 예약어

▶ 값 대입과 리터럴

√ 값 대입
생성한 변수(저장 공간)에 값을 대입하는 것

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); // 정수 + 정수 + 문자열
		                                      // = 두 정수 합 + 문자열 (이어쓰기)

	}
	
}

▶ 형변환 (casting)

값(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 : 논리형

정렬방법

  • %5d : 5칸을 확보하고 오른쪽 정렬
  • %-5d : 5칸을 확보하고 왼쪽 정렬
  • %.2f : 소수점 아래 2자리까지만 표시
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");
	}
}

▶ escape 문자

▶ Scanner

√ 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);
	}
}

▶ 깃(GIT)

Working Directory 이클립스 작업 저장(git add(save)) ->
Staging Area 스테이지 준비 공간(변한 코드) 깃에 올리는 것(commit)->
Local Repository Git 다시 가져오는 것(merge) / 학원에 올린다(push)
Remote Reposiotry GitHub Git 으로 다시 주는 것(fetch)

profile
김찬희입니다.

0개의 댓글