JAVA의 변수 - JAVA에서 변수를 사용하는 이유 + 변수, 선언, 초기화, 호출
상수
: 데이터를 변경할 수 없는 공간
- 리터널상수, 심볼릭상수(static final...)
* 리터널상수
데이터 그 자체
일정한 형식의 공간이 만들어지고 자동으로 그 공간에 저장
공간을 구별할 수 있는 방법이 없다
공간을 다시 이용할 수가 없다
단발성 데이터
e.g. 10 + 20 + 30
- 일정한 형식의 공간들이 만들어지고 각각 저장된다
- 변동성이 없다
-> 상수만 사용해서는 프로그램을 만들 수 없다
그래서 변수를 사용한다
* 데이터를 저장하고 관리하는 공간들(변수, 배열, 객체, ...)
데이터를 저장하고 관리하는 공간
직접 일정한 형식의 공간을 만들어서 저장해야 한다
공간을 구별할 수 있는 이름이 존재한다
이름을 통해 그 공간을 다시 이용할 수가 있다
지속성 데이터
변수
: 데이터 하나를 저장하고 관리하는 공간
직접 일정한 형식의 변수공간을 만들어서 저장해야 함
변수공간을 구별할 수 있는 변수명이 존재
변수명을 통해서 그 공간을 다시 이용할 수 있다
지속성 데이터
선언
: 메모리에 일정한 형식의 변수공간을 만들고 그 공간에 변수명을 붙이는 작업
선언의 형식
: 자료형, 변수명
자료형 : 어떠한 데이터를 담을지 정하는 부분
변수명 : 변수공간을 대표하는 이름(공간을 호출할 때 사용하는 이름)
참조형 변수 선언
자료형[] 변수명; String name or Scanner
자료형 변수명[]; c언어의 잔재로 잘 사용하지 않음
인스턴스 공간 선언
new 자료형[갯수];
new 자료형[] { 데이터 데이터 더이터, 데이터...}

* null은 참조형 변수의 디폴트값이다
* 모든 인스턴스 공간은 new 를 통해 선언된다
* 인스턴스 공간은 기본적으로 만들어질 때 디폴트 값으로 자동으로 초기화가 진행된다
* arr.length : 배열의 갯수를 알려주는 기능(멤버 변수)
자료형
: 어떤 데이터를 담을지 정하는 부분 ; 데이터의 틀
자료형의 특성
데이터의 형태(정수, 실수, 문자)를 구분
데이터의 범위나 부호의 사용여부 등을 결정하는 키워드
공간의 형식을 정의한 키워드(틀)
컴퓨터 ; 기계어 ; 2진법
정수와 실수가 저장되는 공간이 다름
정수 ; 123456
실수 ; 10^-31
자료형의 종류(java background)
* 기본형(원시형)
: 데이터를 저장하는 공간
정수 ; byte, short, int, long
실수 ; float, double
문자 ; char
논리: 참과 거짓을 저장하고 관리하는 자료형 ; boolean
* 참조형(객체형)
: 실제 데이터가 저장되는 공간(인스턴스instance 공간)과 그 공간의 정보를 저장하는 변수 공간(참조형 변수 공간)이 함께 있는 형태
어떠한 대상을 표현하기 위한 정보 공간(데이터 공간; 인스턴스 공간)과, 그 공간을 컨트롤 할 수 있는 기능(메소드)이 함께 있음
ex. 파이썬(파이썬은 모든 데이터 공간이 참조형임)
기본형을 제외한 모든 자료형 ; 무한정 infinity
class형
string ; 문자열
배열
instance 실제 데이터가 저장되는 공간
instance vs 객체
참조형으로 어떤 공간을 사용하게 되면 실제 데이터가 저장되는 인스턴스 공간이 만들어짐
이 인스턴스 공간을 저장하는 하나의 공간이 더 있다
-> 참조형 변수 공간
보통 같이 만들어지긴 하지만 실질적으로는 한 번만 쓰고 더 이상 쓰지 않는 실질 인스턴스 공간만 만들어 쓰는 경우도 있다
배열
배열(Array) ; 참조형
데이터 여러개를 저장하는 공간
같은 형태의 데이터 공간들을 연속적으로 할당 받아 하나의 이름으로 사용하는 것
같은 형태와 같은 성격의 데이터들을 보다 쉽게 관리하기 위해서 사용
연속적인 공간을 할당받아 인덱스값을 통하여 순차적인 접근이 가능하여
다량의 데이터를 처리하기 좋다
1차원 배열의 배열 : 0
2차원 배열
중첩적인 구조를 가지는 배열
행과 열 차원의 배열
* 다자원 배열을 사용하는 이유
개념적 사용
사람이 표현하기 편하게 하기 위해 사용
ex.
게임 프로그램에서의 맵구성(예제)
그래픽에서의 좌표 표현
DB로 표현될 수 있는 프로그램(성적표)
2차원 배열의 참조형 변수 선언
자료형[][] 변수명;
자료형 변수명[][]; (x)
ex.
import java.util.Scanner;
public static void main(String[] args) {
Scanner sc = null;
System.out.println(sc);
String name = null; // 널 값이 들어가지면 참조형, 안 들어가지면 기본형
System.out.println(name);
int[] arr = null;
int[] arr = new int[5];
arr[2] = 30;
int[] arr = new int[] {1,2,3,4};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// int i=3;
// arr = new int[i]; // 실행이 될 때 공간이 만들어짐
// int[] arr = new int[5]; 5개의 정수를 저장하는 참조형 변수 arr을 만들었다
변수명
: 변수공간의 이름
변수명 작명규칙
영문자, 숫자, _(언더바)로 구성
숫자로 시작할 수 없다 ; 데이터로 쓰는 것을 그냥 쓰기로 하고 코드에서 구분짓는다
대소문자 구별함
이름은 중복 불가
공백이나 특수 기호 사용 불가($를 제외하면 다른 프로그램에서 언어로 사용)
예약어는 사용 불가
변수명에 대한 암묵적인 규칙
데이터의 성격이 연상되는 단어로 명명
변수명은 소문자를 권장
초기화
: 할당받은 변수공간에 값을 처음 넣는 작업
할당받은 공간은 항상 쓰레기값으로 채워져 있다
초기화를 진행하지 않으면 데이터를 이용하려 할 때 에러 발생
JAVA는 자동으로 초기화 되는 경우가 많음
** 우리가 알 수 없는 값 = 쓰레기값 ; 전에 사용하던 데이터의 찌꺼기 때문에 항상 가지게 된다
a + 10 = ?
초기화의 형식
1. 선언과 동시에 초기화
[자료형 변수명 = 값;]
2. 선언 후 초기화
[자료형 변수명;]
[변수명 = 값;] ; 첫번째는 선언 후 초기화
[변수명 = 값;] ; 두번째는 변수공간을 호출해서 값을 넣은 것 뿐
[=]: 대입연산자
우측 공간의 값을 좌측 공간에 대입하는 연산자
호출
: 할당받은 변수공간을 불러오는 작업
배열의 요소 공간을 불러오는 작업 ; 데이터가 아닌 공간을 불러옴
각각의 요소 공간을 불러오기 위해 인덱스값을 통해 호출하면 된다
* 인덱스 : 요소 공간을 구분하기 위해 순차적 넘버링
항상 0부터 시작하고 마지막 요소는 length보다 1이 작다
형식: 변수명
변수가 쓰인 곳은 모두 호출
형식
변수명[인덱스][인덱스] {
System.out.println("모르겠어")
}
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
Scanner sc = null;
System.out.println(sc);
String name = null; // 널 값이 들어가지면 참조형, 안 들어가지면 기본형
System.out.println(name);
int[] arr = null;
int[] arr = new int[] {1,2,3,4};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// int i=3;
// arr = new int[i]; // 실행이 될 때 공간이 만들어짐
// int[] arr = new int[5]; 5개의 정수를 저장하는 참조형 변수 arr을 만들었다
Exercise 2
주사위를 10번 던진 결과를 저장하려고 합니다
배열을 이용해 저장을 구현하고 아래의 결과를 출력하세요
[1] 전체 주사위 기록을 출력
(예) 1번째 : 5, 2번째 : 5, ...
[2] 짝수 주사위 기록을 출력
[3] 주사위 값들의 합계 출력
int[] arr = new int[10];
for (int i=0; i < arr.length; i++) {
arr[i] = (int)(Math.random() * 6 + 1);
}
// [1] 전체 주사위 값 출력
System.out.println("[1] 전체 주사위 기록 출력");
for(int i = 0; i < arr.length; i++) {
if(i % 5 == 4) {
System.out.println(i + 1 + "번째 : " + arr[i]);
}else {
System.out.print(i + 1 + "번째 : " + arr[i] + " , ");
}
}
System.out.println();
// [2] 짝수 주사위 값 출력
System.out.println("[2] 짝수 번째 주사위 기록 출력");
int cnt=0;
for (int i=0; i < arr.length; i++) {
if (arr[i]%2==0) {
if(cnt%5 !=0) {
System.out.print(", ");
}
if(cnt%5 == 4) {
System.out.print(i+1 + "번째 값 : " + arr[i]);
} else {
System.out.print(i+1 + "번째 값 : " + arr[i]);
}
cnt++;
}
if(cnt%5 !=0 && arr.length-1 == i) {
System.out.println();
}
}
System.out.println();
System.out.println("[2-1] 짝수 값 주사위 기록 출력");
for (int i=0; i < arr.length; i++) {
if(arr[i]%2 == 0) {
System.out.println(i+1 + " 번째 주사위 값 : " + arr[i]);
}
}
System.out.println();
// [3] 주사위 값의 합계
int sum = 0;
for (int i=0; i < arr.length; i++) {
sum+=arr[i];
}
System.out.println("[3] 던져진 주사위의 총합 : " + sum);
출력화면

Exercise 3
선택장애 치료 프로그램
사용자에게 n가지 항목을 입력받아 배열에 저장
무작위로 1가지를 추첨하여 화면에 출력
예)
항목: 김밥
항목: 라면
항목: 떡볶이
항목: 자장면
항목: 순대국
추첨중입니다...
추첨된 항목은 떡볶이입니다
public static void main (String[] args) throws InterruptedException {
Scanner sc = new Scanner(System.in);
System.out.println("회식메뉴 갯수 입력");
int su = sc.nextInt();
String[] arr = new String[su]; // arr.length의 개수를 사용자에게 입력받을 수 있다
sc.nextLine();
for(int i=0; i< arr.length; i++) {
System.out.println("항목 입력 : ");
arr[i] = sc.nextLine();
}
System.out.println("추첨중");
for (int i=0; i < 3; i++) {
Thread.sleep(1000);
System.out.print(".");
}
System.out.println();
int ran = (int)(Math.random()* su);
System.out.println("추첨된 메뉴는 " + arr[ran] + " 입니다." );
sc.close();
}
Exercise 4
주사위를 1000번 던져서 각각의 값이 나온 횟수를 세보려고합니다.
아래와 같이 결과가 나올 수 있도록 배열을 이용한 적절한 코드를 구현
(예상 결과) 주사위값 1 나온 횟수 : 170번
주사위값 2 나온 횟수 : 180번 ...
주사위값 6 나온 횟수 : 155번
public static void main(String[] args) {
int[] arr = new int[6];
for(int i =0; i<1000; i++) { // 주사위 돌린 횟수 : i
int su = (int)(Math.random()*6) + 1; // 주사위 돌려서 나온 값 : su
arr[su-1]++;
}
for(int i = 0; i <arr.length; i++) {
System.out.println(i+1 + " 나온 횟수 : " + arr[i]);
}
}
}
Exercise 5
public static void main(String[] args) {
int[][] arr = new int[][]{{1,2,3},{4,5,6,7},{8,9,10,11,12},{13,14,15}};
for (int i=0; i<arr.length; i++) {
for(int j=0; j < arr[i].length; j++) {
System.out.print(arr[i][j] +"\t");
}
System.out.println();
}
}

// array 개념이 이해 안 가서 만들어 본 예시
// arr[j]의 흰색 공간은 생성되지 않음 ; 지정한 값만 생성됨
출력화면
Exercise 6
아래의 형태가 되도록 2차원 배열을 구성하여 값을 대입 후 출력
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
선언과 동시에 초기화 금지
public static void main (String[] args) {
int[][] arr = new int[5][5];
for (int i=0, cnt=1; i<arr.length; i++) {
for(int j=0; j<arr[i].length; cnt++, j++) {
arr[j][i] = cnt;
}
}
for (int i=0; i<arr.length; i++) {
for(int j=0; j<arr[i].length; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
//or ; 첨에 하도 코드 생각이 안 나서.. 저세상 코드로 작성해본 것..일단 출력값은 같음
int[] arr = new int[]{1,2,3,4,5};
for(int i = 0; i < arr.length; i++){
System.out.printf("%d %d %d %d %d \n",
arr[i], arr[i] + 5, arr[i] + 10, arr[i] + 15, arr[i] + 20, arr[i] + 25);
}
Exercise 7
5x5 빙고판 만들기
1부터 25까지의 숫자를 5*5 크기의 빙고판에 무작위 배치
모든 자리에 숫자가 랜덤으로 배치될 수 있도록 코드 구현
public static void main (String[] args) {
int[][] arr = new int[5][5];
for(int i=1; i<=25; i++) {
int a=(int)(Math.random()*5);
int b=(int)(Math.random()*5);
if(arr[a][b] == 0) {
arr[a][b] = i;
} else {
i--;
}
}
for(int i = 0; i < arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
// or
public static void main(String[] args) {
int[][] arr = new int[5][5];
int ran;
for(int i=0; i <arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
arr[i][j] = i*arr.length+j +1;
}
}
for(int i=0; i<arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
int x = (int)(Math.random()*5);
int y = (int)(Math.random()*5);
ran = arr[i][j];
arr[i][j] = arr[x][y];
arr[x][y] = ran;
}
}
for(int i = 0; i < arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
// or
public static void main(String[] args) {
int[][] arr = new int[5][5];
int ran;
for(int i=0; i <arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
arr[i][j] = i*arr.length+j +1;
}
}
for(int i=0; i<arr.length; i++){
for(int j = 0; j < arr[i].length; j++){
int x = (int)(Math.random()*5);
int y = (int)(Math.random()*5);
ran = arr[i][j];
arr[i][j] = arr[x][y];
arr[x][y] = ran;
}
}
for(int i = 0; i < arr.length; i++){
for(int j = 0; j <arr[i].length; j++){
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}