본문 바로가기
Programming/Java

[Java] 변수(Variable)

by AI_Wooah 2020. 10. 26.

1 . 컴퓨터의 구성

컴퓨터는 저장 장치와 산술연산 처리 그리고 입출력 장치로 구성되어 있다.


- 저장 장치

   저장 장치는 대표적으로 주기억장치(RAM)와 보조기억장치(HDD, SSD)가 있다. 램을 통해 보조기억장치와 소통한다.

- 주기억장치(RAM)

- 전기적 신호를 받아서 저장하기 때문에 전기가 끊어지면 휘발되는 특성이 있다. 저장 용량에 비해 비싸다.

- 보조기억장치

- 전기가 아닌 디스크 방식으로 저장된다. 램과 소통(로딩)한다.


- 산술연산

- 처리장치

   CPU가 저장 장치, 입출력 장치와 소통하여 값을 처리한다


- 입출력장치

   모니터, 키보드, 마우스, 조이스틱, 스피커, 프린트 등이 있다.

   입출력을 완료하기까지 홀드해놓은 것이 버퍼


 

2. 변수란?

메모리 공간(RAM)에 숫자, 문자 같은 값을 기록하기 위한 장소(공간)

만들 변수의 자료형을 정하고 이름을 선언한 후 값을 대입해 초기화 한다.(선언과 동시에 초기화 가능)


Stack

생성된 임시 변수를 저장하는 메모리 영역이다. "LIFO"(Last in, First Out) 데이터 구조로 CPU에 의해 관리되고 최적화 되며 매우 빠르다.


heap

포인터를 이용하여 힙의 메모리에 액세스 하기 때문에 읽기와 쓰기가 약간 느리다. 메모리 크기 제한이 없으며 메모리를 관리가 필요하다.

힙에 작성된 변수는 모든 함수에서 액세스 할 수 있다.(전역 변수)


Static

값이 변하지 않는 변수나 메소드 앞에 static 키워드를 붙여서 사용한다.

정적 변수인 static을 사용하면 메모리 할당을 한 번만 하게 되어 메모리 사용이 효율적이다.(정적 변수)


 

3. 변수의 자료형

메모리 공간을 효율적으로 사용하기 위해서 데이터를 저장할 때 얼마만큼의 크기와 공간을 필요로 할지 미리 예측해야 한다.

숫자

정수 : byte(1byte), short(2byte), int(4byte), long(8byte)

  • 정수를 표현하기 위한 자료형

실수 : float(4byte), double(8byte)

  • 실수를 표현하기 위한 자료형

문자

문자 : char(2byte)

  • 문자를 표현하기 위한 자료형

클래스 문자열 : String

  • 문자열을 표현하기 위한 자료형

논리

boolean(1byte)

  • 논리를 표현하기 위한 자료형

 

4. 변수의 선언

자료형 변수명;

선언은 자료형에 참조(포인터)를 통해 메모리를 스택에 저장하기 위한 과정이다.

메소드나 생성자 중괄호 {}안에 선언할 수 있다.

초기화는 값을 최초로 대입하는 행위이며, 변수는 생성과 동시에 바로 값을 대입하여 초기화 시켜줄 수 있다.

 

5. 값 저장 방법과 리터럴

//값 저장 방법 예시
byte bnum = 127;
// 127이 최댓값이며 더 큰 숫자를 넣으면 에러가 나기 때문에 범위 안의 숫자를 대입해야 한다.

short snum = 2;

int inum = 4;

long lnum = 8L(리터럴);

float fnum = 4.0f;

double dnum = 8.0;

char c = 'A';

boolean b = true; or false;

String str = "ABC";

 

6. 변수의 명명 규칙

  1. 대소문자가 구분되며 길이 제한이 없다.
  2. 예약어를 사용하면 안된다.
  3. 숫자로 시작하면 안 된다.
  4. 특수문자는 '_'와 '$'만을 허용한다.
  5. 여러 단어 이름은 단어의 첫 글자를 대문자로 한다.(camel case)

 

7. 변수의 초기화

변수를 사용하기 전에 처음으로 값을 저장하는 것.

지역변수는 반드시 초기화 해야한다.

 

8. 상수

수학에서 변하지 않는 값을 의미하고, 컴퓨터에서는 한번만 저장할 수 있는 공간을 의미한다. 초기화 이후 다른 데이터(값)을 대입할 수 없다.

  • 상수 선언 방법
  • 상수 변수명은 모든 문자를 대문자로 만든다. 여러 단어의 조합은 구분을 위해 언더바(_)를 붙여 사용한다.
final Int AGE_NN;

 

9. 변수 사용 목적

  • 값에 의미 부여
  • 한 번 값을 저장하고 계속 재사용 할 목적
  • 유지보수성을 좋게 하기 위한 목적

형]

 

10. 여러가지 값의 형태 출력

public class B_ValuePrinter {

	public void printValue1() {
		// 여러가지 값의 형태 출력
		
		// 숫자
		System.out.println(123); // 정수
		System.out.println(1.23); // 실수
		
		// 문자
		System.out.println('A'); // 글자 홑따옴표 사용
		System.out.println('A' + 'B');
		
		// 문자열
		System.out.println("안녕하세요"); // 문자들이 나열되어있는 형태 여러개의 문자들의 집합.
		System.out.println("A");
		
		// 값을 직접적으로 연산할 수도 있다.
		System.out.println(123 + 456);
		System.out.println(123 - 456);
		
		// 문자도 숫자로 인식하기 때문에 연산이 가능하다.
		System.out.println('A' + 0);
		System.out.println('a' + 0);
		// System.out.println('65');
		
		// 문자열 + 숫자는 문자열의 결과를 가진다. (=문자열 합치기)
		System.out.println("안녕하세요" + 123); //플러스만 사용 가능
		// System.out.println("안녕하세요" - 123);
	}
	
	
	public static void main(String[] args) {
		// 클래스명 사용할이름 = new 클래스명();
		// 사용할이름.메소드명();
		B_ValuePrinter vp = new B_ValuePrinter();
		vp.printValue1();
	}

}

 

 

11. 여러가지 형태의 값 연산

public class B_ValuePrinter {

	public void printValue1() {
		// 여러가지 값의 형태 출력
		
		// 숫자
		System.out.println(123); // 정수
		System.out.println(1.23); // 실수
		
		// 문자
		System.out.println('A'); // 글자 홑따옴표 사용
		System.out.println('A' + 'B');
		
		// 문자열
		System.out.println("안녕하세요"); // 문자들이 나열되어있는 형태 여러개의 문자들의 집합.
		System.out.println("A");
		
		// 값을 직접적으로 연산할 수도 있다.
		System.out.println(123 + 456);
		System.out.println(123 - 456);
		
		// 문자도 숫자로 인식하기 때문에 연산이 가능하다.
		System.out.println('A' + 0);
		System.out.println('a' + 0);
		// System.out.println('65');
		
		// 문자열 + 숫자는 문자열의 결과를 가진다. (=문자열 합치기)
		System.out.println("안녕하세요" + 123); //플러스만 사용 가능
		// System.out.println("안녕하세요" - 123);
	}
	
	
	public static void main(String[] args) {
		// 클래스명 사용할이름 = new 클래스명();
		// 사용할이름.메소드명();
		B_ValuePrinter vp = new B_ValuePrinter();
		vp.printValue1();
	}

}

 

Mission

  • [ ] 키보드 입출력 테스트
  • [ ] 자료형 변환
  • [ ] 정수의 계산

 

12. 변수 선언

  • java.lang에 있는 클래스는 패키지를 import 하지 않아도 쓸 수 있음.
  • 패키지가 다르면 같은 이름의 클래스도 만들 수 있다. 클래스의 이름은 사실 패키지를 포함한 이름이기 때문에 ex) variable.A_변수선언 <- 이게 클래스의 fullName이다.
public class B_ValuePrinter {
    
    	public void printValue2() {
    		//문자열과 숫자의 '+' 연산
    		System.out.println(9 + 9); //18
    		System.out.println(9 + "9"); //99
    		System.out.println("9" + 9); //99
    		System.out.println("9" + "9"); //99
    		System.out.println(9 + 9 + "9"); //189
    		System.out.println(9 + "9" + 9); //999
    		System.out.println("9" + 9 + 9); //999
    		System.out.println("9" + (9 + 9)); //918
    	}
    	
    	public void printValue3() {
    		System.out.println(100 + 10); // 110
    		System.out.println((100 + 10) * 10); // 1100
    		System.out.println(((100 + 10) * 10) - 10); // 1090
    		System.out.println((((100 + 10) * 10) - 10) / 10 ); // 109
    		
    		// 숫자가 어떤 값을 의미하는지 누구나 쉽게 이해할 수 있도록 변수명에 값을 대입
    		int point = 100;
    		int bonus = 10;
    		int personCount = 10;
    		int fees = 10;
    		
    		// 보너스를 더한 포인트 계산
    		System.out.println(point + bonus); // 110
    		// 보너스를 더한 포인트를 10명에게 준다면 필요한 총 포인트는 몇인지 계산
    		System.out.println((point + bonus) * personCount); // 1100
    		// 보너스를 더한 포인트를 10명에게 줄 때 총 포인트에서
				// 수수료를 10 차감한다면 남는 포인트는 몇인지 계산
    		System.out.println(((point + bonus) * personCount) - fees); // 1090
    		// 위에서 수수료를 차감한 포인트를 10명이 배분 받는다면
				// 각 얼마의 포인트를 받을 수 있는지 계산
    		System.out.println((((point + bonus) * personCount) - fees) / personCount); // 109
    	}
    	
    	
    	public static void main(String[] args) {
    		// 클래스명 사용할이름 = new 클래스명();
    		// 사용할이름.메소드명();
    		B_ValuePrinter vp = new B_ValuePrinter();
    		vp.printValue2();
    		vp.printValue3();
    	}
    
    }

 

13. 키보드 입력 테스트

  • JVM이 자동으로 추가해주는 구문
import java.lang.*;

 

→ 따라서 java.lang 패키지 하위의 모든 클래스는 import 하지 않고 사용할 수 있다.

  • 에러 나있는 곳에 커서 올리거나 ctrl+1누르면 도움창이 뜬다.
  • ctrl+shift+O누르면 한번에 된다.
  • import java.io.*; 하면 java.io의 모든 것을 가져온다.
package variable;

import java.io.*;

public class B_키보드입력테스트 {
	// java.io 패키지에서 제공되는 클래스를 이용한 키보드 입력 테스트
	
	// 키보드 입력을 통해 문자열을 읽어오는 방법
	public void inputTest1() {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// 현재 위치한 패키지 외의 다른 패키지에 속한 클래스를 사용할 때 import를 해줘야 한다.
		
		// println과 print의 차이는 줄 바꿈이다.
		System.out.print("정수 값 한 개를 입력하세요 : ");
		
		// 예외처리, 문자열 형변환 및 연산
		try {
			String value = br.readLine();
			
			// 문자열 값은 계산하지 못하기 때문에 에러 발생
			// System.out.println("계산결과 : " + (value * 3));
			
			// 문자열 형태의 숫자를 숫자 데이터로 변환함 : parsing
			int number = Integer.parseInt(value);
			
			System.out.println("계산결과 : " + (number * 3));
		} catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void inputTest2() {
		// java.util 패키지에 있는 Scanner 클래스 사용하여 키보드 입력을 통해 숫자 읽어옴
		// 이렇게 풀네임을 입력하면 import를 하지 않고 사용할 수 있다.
		// 매 번 입력하는 수고를 줄이기 위해 맨 위에서 import 선언한다. ->시험
		java.util.Scanner sc = new java.util.Scanner(System.in);
		
		// 키보드를 통해 값을 읽어오는 다양한 방법 next~ (char빼고 모든 자료형)
		System.out.println("이름을 입력하세요 : ");
		String name = sc.nextLine();	// 한 줄에 대한 정보를 읽어온다
		System.out.println("나이를 입력하세요 : ");
		int age = sc.nextInt();		// 정수에 대한 값을 읽어온다.
		System.out.println("키(소수점 첫 째 자리까지 입력) : ");
		double height = sc.nextDouble();	// 실수에 대한 값을 읽어온다.
		
		System.out.println(name + "님은 " + age + "세 이며, 키는 " + height + "cm 입니다.");
	}
	
	public static void main(String[] args) {
		B_키보드입력테스트 test = new B_키보드입력테스트();
		//test.inputTest1();
		test.inputTest2();

	}

}

 

14. 변수값 변경 테스트

  • 변수의 초기화와 키보드로 값을 입력받아 변수에 저장된 값을 변경/연산한다.
package variable;

import java.util.Scanner;

public class C_변수값변경테스트 {

	public void changeValue() {
		// 변수 선언과 동시에 초기화
		String name = "dondon";
		char gender = 'F';
		int age = 27;
		double height = 160.3;
		
		System.out.println(name + "님의 개인정보");
		System.out.println("gender : " + gender);
		System.out.println("age : " + age);
		System.out.println("height : " + height);
		
		// 키보드로 값을 입력받아 변수에 저장된 값 변경
		Scanner sc = new Scanner(System.in);
		
		System.out.println("이름을 입력하세요 : ");
		name = sc.nextLine();
		System.out.println("성별을 입력하세요 : ");
		gender = sc.nextLine().charAt(0);
		System.out.println("나이를 입력하세요 : ");
		age = sc.nextInt();
		System.out.println("키를 입력하세요 : ");
		height = sc.nextDouble();
		

		System.out.println(name + "님의 개인 정보");
		System.out.println("gender : " + gender);
		System.out.println("age : " + age);
		System.out.println("height : " + height);
		
	}
	
	public static void main(String[] args) {
		C_변수값변경테스트 test = new C_변수값변경테스트();
		test.changeValue();

	}

}

 

15. 상수 테스트

  • 상수는 final을 붙여 값을 고정시킨다. 초기화 후에는 상수값의 변경이 불가능하다.
package com.kh.variable;

public class D_상수테스트 {
	
	public void testFinal() {
		// 상수 테스트
		int maxAge = 20;
		final int MAX_AGE = 20;
		
		maxAge = 30;
		// MAX_AGE = 30;	// 에러 발생, 상수 값 변경 불가
		
		int age;
		final int AGE;
		
		age = 20;
		AGE = 20;
		
		age = 30;
		//AGE = 30;		// 에러 발생, 초기화 시점 이후부터 값 변경 불가능
		
		
	}

	public static void main(String[] args) {
//		D_상수테스트 test = new D_상수테스트();
//		test.testFinal();
		
		new D_상수테스트().testFinal();

	}

}

 

반응형

'Programming > Java' 카테고리의 다른 글

[Java] java.lang.Math  (0) 2022.03.07
[Java] 연산자  (0) 2022.03.07
[Java] 프로그래밍 기초  (0) 2020.10.26
[Java] 상속을 사용하는 목적과 장점  (1) 2020.10.07
[Java] 객체와 클래스의 정의 및 차이점  (0) 2020.10.05

댓글