Backend/JAVA

JAVA의 변수 - JAVA에서 변수를 사용하는 이유 + 변수, 선언, 초기화, 호출

쏠솔랄라 2023. 1. 31. 17:50

 

상수

 

: 데이터를 변경할 수 없는 공간

- 리터널상수, 심볼릭상수(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("모르겠어")

}

 

 


 

Exercise 1

 

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();

}

 

}