변수 Variable

Robyn·2023년 4월 22일
0

Java

목록 보기
2/15

변수(Variable)

메모리(RAM)에 값을 기록하기 위한 공간
데이터를 담을 수 있는 하나의 공간

변수를 사용하면

가독성이 좋아진다.
재사용성이 증가한다.
그로 인해 코드량이 감소하고 유지보수가 용이해진다.

변수에 값을 기록하는 이유

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

변수의 선언

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

자료형              변수명;
변수 타입 지정    변수명 지정

  • 선언 예시
//		논리형 변수 선언
		boolean isTrue;
		
//		문자형 변수 선언
		char ch;
		
//		문자열 변수 선언
		String str;
		
//		정수형 변수 선언
		byte bnum;
		short snum;
		int inum;
		long lnum;
		
//		실수형 변수 선언
		float fnum;
		double dnum;

변수 명명 규칙

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

자료형(Type)


String은 참조형 자료형이고 String 빼고는 다 기본자료형이다.
기본자료형 8개 빼고는 전부 다 참조형 자료형이다.

데이터 저장 단위

저장 공간이 제한적이기 때문에 저장 크기에 대한 기준과 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";

오른쪽이 리터럴이다.
오른쪽의 값이 왼쪽에 있는 공간에 들어간다.

메모리 영역

Stack
컴퓨터가 알아서 쓰는 영역

Heap
개발자가 '아 이런 것 좀 메모리에 올리고 싶은데'

Static
처음에 프로그램 시작할 때 공통적으로 써야하는 부분들을 미리 올려놓는 공간

int a;라고 선언하는 순간 Stack에 a라는 이르믕로 공간이 생긴다.
a = 10;은 초기화/값 대입이다.

Heap 영역에 만들고싶으면 new라는 연산자를 사용해야한다.


01_variable이라는 새로운 java project를 만든다.

src 안에 새로운 클래스를 만든다.

package com.kh.variable;

public class A_Variable {	// 기능부 구현, 실행부 분리

	public static void main(String[] args) {	
		test();
	}
	
	public static void test() {
		System.out.println("robyn의 복습");
	}

}

변수의 초기화

변수를 사용하기 전에 처음으로 값을 저장하는 것
-> 지역변수(메소드 안 변수)는 반드시 초기화해야함

선언 후 초기화

//		A. 변수 선언
		
//		1. 논리형
		boolean isTrue;
		
//		2. 문자형
//		2-1. 문자
		char ch;
//		char은 무조건 한 글자, 싱글 쿼테이션으로 감싸야
		
//		2-2. 문자열
		String str;
//		String은 0글자 이상, 더블 쿼테이션으로 감싸야
		
//		3. 숫자형
//		3-1. 정수형
		byte bNum;
		short sNum;
		int iNum;
		long lNum;
		
//		3-2. 실수형
		float fNum;
		double dNum;
		
//		B. 초기화
		isTrue = true;
		
		ch = 'A';
		str = "ABC";
		
		bNum = 1;
		sNum = 2;
		iNum = 4;
		lNum = 8L;
		
		fNum = 4.0f;
		dNum = 8.0;

선언과 동시에 초기화

int age = 100;

상수 Constant

수학에서는 변하지 않는 값 의미
컴퓨터(Java)에서는 한 번만 저장(기록)할 수 있는 메모리 의미
변수에 딱 한 번만 기록이 가능하며 그 후에는 수정이 안 되는 것
앞에다가 final이라는 예약어를 붙여준다.


변경하려니까 빨간 줄이 뜬다. 안된다고 한다.

		age = 30;
		AGE = 30;
//		The final local variable AGE may already have been assigned

상수 선언

final int AGE;

상수 초기화

1) 선언과 동시에 초기화

final int NUM = 100;

2) 선언 후 초기화

final int NUM;		// 상수는 대문자로 표기해주자 라는 약속
NUM = 100;

초기화 이후 다른 데이터(값)를 대입할 수 없다.

문자열

컴퓨터에서 "기차", "출력하세요" 등과 같이 단어나 문장을 문자열이라고 표현
""로 묶여 있으면 문자열로 인식하며 Java에서는 String 객체를 이용하여 저장한다.

다른 자료형 + "문자열" -> 문자열
"문자열" + 다른 자료형 -> 문자열

		String str1 = "기차";
		String str2 = new String("기차");
		String str3 = "기차" + " 칙칙폭폭";
		String str4 = new String("기차" + "칙칙폭폭");
		String str5 = "기차" + 123 + 45 + "출발";	// 기차12345출발
		String str6 = 123 + 45 + "기차" + "출발";	// 168기차출발
   		String str7 = "기차" + (123 + 45) + "출발";	// 기차168출발

오버플로우


오버플로우
127 + 1 -> 128 -> -128

import 단축키
Ctrl + Shift + o


C_Overflow.java

package com.kh.variable;

public class C_Overflow {
	public void overflow() {		
		byte bNum2 = -128;
		bNum2 = (byte) (bNum2 - 1);
		System.out.println("bNum2: " + bNum2);
	}
}

Run.java

package com.kh.run;

import com.kh.variable.C_Overflow;

public class Run {

	public static void main(String[] args) {		
		C_Overflow co = new C_Overflow();
		co.overflow();
	}

}

콘솔

bNum2: 127

위의 건 오버플로우, 밑의 건 언더플로우.

형변환 Casting

값 Data의 자료형을 바꾸는 것 (boolean 제외)

컴퓨터의 값 처리 원칙

같은 종류 자료형만 대입 가능
같은 종류 자료형만 계산 가능
계산의 결과도 같은 종류의 값이 나와야 함
-> 이러한 원칙이 지켜지지 않은 경우에 형 변환이 필요하다.



D_Cast.java

package com.kh.variable;

public class D_Cast {
	public void rule1() {
		int num = 'A';	// 자동 형변환
//		char는 유니코드로 저장 (정수 값 저장)
		System.out.println("num: " + num);
		
		char ch = 97;
		System.out.println("ch: " + ch);
		
		char ch2 = (char) num;
		System.out.println("ch2: " + ch2);
		
		int num2 = -97;
		char ch3 = (char) num2;
		System.out.println("ch3: " + ch3);
	}
}

Run.java

package com.kh.run;

import com.kh.variable.D_Cast;

public class Run {

	public static void main(String[] args) {		
		D_Cast dc = new D_Cast();
		dc.rule1();
	}

}

콘솔

num: 65
ch: a
ch2: A
ch3: ゚

D_Cast.java

	public void rule2() {
		int iNum = 10;
		long lNum = 100;
		
//		int sum = iNum + lNum;
		
//		int sum = iNum + lNum;
//		연산은 큰 자료형으로 자동 형변환 후 연산 처리가 되기 때문에 iNum이 long형으로 바뀌고
//		long형 + long형으로 결과까지 long형이 되었다.
//		long형 + long형으로 결과까지 long형이 되었음
//		long형의 결과 값은 int형에 담길 수 없으므로 컴파일 에러
		
//		해결 1. 수행 결과를 int로 강제 형변환
		int sum1 = (int) (iNum + lNum);
		System.out.println("sum1: " + sum1);
		
//		해결 2. long형을 int로 강제 형변환
		int sum2 = iNum + (int)lNum;
		System.out.println("sum2: " + sum2);
		
//		해결 3. long형으로 결과값을 받음
		long sum3 = iNum + lNum;
		System.out.println("sum3: " + sum3);
	}

Run.java

package com.kh.run;

import com.kh.variable.D_Cast;

public class Run {

	public static void main(String[] args) {		
		D_Cast dc = new D_Cast();
		dc.rule2();
	}

}

콘솔

sum1: 110
sum2: 110
sum3: 110

변수와 메모리 구조

출력 메소드


format의 f


E_PrintMethod.java

package com.kh.variable;

public class E_PrintMethod {
	public void printfMethod() {
		String str1 = "안녕하세요";
		String str2 = "반갑습니다";
		
		System.out.printf("%s, robyn입니다. %s.", str1, str2);
	}
}

Run.java

package com.kh.run;

import com.kh.variable.E_PrintMethod;

public class Run {

	public static void main(String[] args) {		
		E_PrintMethod ep = new E_PrintMethod();
		ep.printfMethod();
	}

}

콘솔 결과

안녕하세요, robyn입니다. 반갑습니다.

Scanner


System.in은 표준 입출력 부분을 뜻한다.
IO쯤 가면 파일, 객체 등의 방법으로 입출력하는 것을 배운다.
콘솔에 값을 입력해서 받아온다. in.
System.out은 출력하겠다는 뜻.
sc안에 담은 것. 메소드를 불러와야 함.

next라는 애가 데이터를 받아오는데, 그리고나선 변수에 담아야한다.

String user = sc.next();

next(), nextInt(), nextFloat(), nextDouble()은 enter값을 읽어오지 않는다.
\n(enter) X

nextLine()은 enter값을 읽어온다.
\n(enter) O

enter는 쏙 빼고 가져감. \n이 남아있다.
nextLine()은 \n을 받아온다. \n가 있네? 가져간다. 끝. 종결.
next()같이 버퍼를 남겨두는 것 밑에 nextLine()을 쓸 수 없겠다.
사용할 수 있는 방법은?

package com.kh.variable;

import java.util.Scanner;

public class F_KeyboardInput {
	
	public void inputScanner1() {
//		이름, 나이, 키(소수점)를 받아와 출력함
//		사용자에게 값을 입력받기 위해 Scanner 사용
		Scanner sc = new Scanner(System.in);
		
		System.out.print("이름을 입력하세요: ");
		String name = sc.nextLine();
		
		System.out.print("나이를 입력하세요: ");
		String stringAge = sc.nextLine();
		int age = Integer.parseInt(stringAge);
		
		System.out.print("주소를 입력하세요: ");
//		String address = sc.next(); 	// 캘리포니아 산타모니카라고 하면 캘리포니아만 나옴(띄어쓰기로 구분짓기 때문에)
//		String address = sc.nextLine();	// nextLine()은 엔터를 받아오기 때문에 nextIne()가 남겨놓은 엔터를 받아오면서 종결로 인지하기 때문에 사용자가 주소를 입력할 수 없음
		String address = sc.nextLine();
		
//		앞에 netLine()을 추가하거나 (age를 받을 때 엔터가 남지 않도록) 나이를 nextLine()로 받고 parseInt(파싱)를 해준다.
//		파싱 parsing이란? 문자열(String)로 받아온 것을 다른 형을 바꾸는 것.
		
		/*
		 * next()
		 * 		띄어쓰기 불가(띄어쓰기를 구분자로 받음)
		 * nextLine()
		 * 		띄어쓰기 가능(띄어쓰기까지 모두 문자열로 받아서 가지고 옴)
		 * */
		
		System.out.print("성별을 입력하세요: ");
		String stringGender = sc.nextLine();
		char gender = stringGender.charAt(0);
		
		/*
		APPLE
		01234
		ZERO-INDEX
		LENGTH: 5
		String str = "APPLE";
		charAt(n) method
		number(zero-index)

		char ch0 = str.charAt(0); ==> 'A'
		char ch1 = str.charAt(1); ==> 'P'
		char ch2 = str.charAt(4); ==> 'E'
		char ch3 = str.charAt(5); ==> StringIndexOutOfException
		*/
		
		System.out.println(name + "(" + age + ", " + gender + ")님이 거주하는 곳은 " + address + "입니다.");
	}
}

0개의 댓글