자바를 잡아버려 (3)

지니·2022년 4월 23일
1

자바를 잡아버려!

목록 보기
3/4
post-thumbnail

지난 시간에는 변수와 반복문에 대해서 알아봤는데
오늘은 어제 2시간을 날려먹어서 다 못쓴 변수에 대해 조금만 더 알아보고 배열로 넘어가보자

변수의 사용 범위 scope

자바잡 (2) 에서 작성했던 구구단 출력코드를 만들면서 우리는
"i", "j", "result" 라는 변수들을 사용했었는데

아래 코드를 확인해보면

변수는 자기가 선언된 구역에서만 보이고 구역을 벗어난다면 사용할수가 없다

변수를 잘못쓴 예제를 살펴보자

소스 코드

	public static void main(String[] args) {
		
		int i = 2; 
		while(i<=9) { 
		int j = 1; 
		while(j<=9) { 
			int result = i * j;  
				j = j +1; 
				System.out.println(i + "*" + j + "=" + result);
			}
				i = i +1;
		}
		System.out.println(i + "*" + j + "=" + result);
	}

실행 결과

xception in thread "main" java.lang.Error: Unresolved compilation problems: 
	j cannot be resolved to a variable
	result cannot be resolved to a variable

	at javjastudy/javjastudy.main.main(main.java:19)

에러 메세지를 확인 해보면 System.out.println(i + "*" + j + "=" + result);
에서 에러가 발생했고 j 값과 result 값을 이해할수 없다고 알려준다

이 문제를 해결하려면 아래와 같이 변수를 미리 앞쪽에 선언하면 문제가 해결된다

public static void main(String[] args) {
		
		int i = 2;  //추가한 부분
		int j = 0;	//추가한 부분
		int result =0;
		while(i<=9) { 
		j = 1;  //추가한 부분
		while(j<=9) { 
			result = i * j;  //추가한 부분
				j = j +1; 
				System.out.println(i + "*" + j + "=" + result);
			}
				i = i +1;
		}	System.out.println(i + "*" + j + "=" + result);
   }

번경된 점은 j 와 result 를 미리 앞에서 선언 해주고 초기값을 0이라고 지정해두었다
while 문 안에서는 다시 선언 해주지는 않고 변수의 값을 변경해 주었다

배열

배열은 여러개의 변수를 한개로 효과적으로 관리할수 있는 것이 배열인데
예를 들어 교실 학생이 10명이 있고 10명의 영어점수의 평균과 총합을 구하는
예를 생각해보자

소스 코드

public static void main(String[] args) {
			
		int[] engScores = {80,90,30,40,70,95,76,100,98,77}; // 정수 배열 변수 선언
		int sum = 0; 
		double average = 0;
		
		for(int i=0;i<10;i++) {             // 배열 위치 번호 주기, 총합 구하기
			sum = sum + engScores[i];
		}
		System.out.println( sum );      // 총합 출력
		
		average = (double)sum / (double)engScores.length;  // 평균 점수 구하기
		System.out.println( average ); // 평균값 출력
	}
}

실행 결과

756
75.6

int[] engScores = {80,90,30,40,70,95,76,100,98,77}; 이 부분이 engScores 라는 정수형 배열을 선언하고 배열변수 10개의 초기값을 지정해주는 것이다 int[] engScores 같이 대괄호 [] 를 사용하여 변수를 선언하면 단순한 변수가 아닌 배열인 변수로 사용할수있다 engScores.length 에 쓰인 length는 배열변수.length 형태로 배열의 크기를 확인한다

변수를 선언하고 거기에 값을 할당하는 방법은 아래처럼 사용할 수도 있다

int[] engScores = new int[5];
		engScores[0] = 80;
		engScores[1] = 90;
		engScores[2] = 70;
		engScores[3] = 20;
		engScores[4] = 95;
		engScores[5] = 85;

배열의 각 항목에 있는 값은 대괄호 [] 안에 숫자를 입력해서 위치에 맞는 값을 참조할수 있다

정수가 아닌 double형 배열이나 string 배열은 아래와 같이 만들수있다

String[] histring = new String[10];
ouble[] hidouble = new double[10];

요약하자면 배열은 같은 타입의 여러 변수를 하나로 묶어서 사용할떄 유용하다
배열은 변수가 들어가는 10칸짜리 기차를 만드는 느낌 아닐까

형 변환 Type Conversion

위에 소스 코드중에 평균을 구하는 부분을 보면

average = (double)sum / (double)engScores.length;

정수형 변수 sumengScores 의 앞에 소괄호 () 로 실수인 double 로 변환 시킨 부분을 볼수있는데
이렇게 괄호로 변수의 Type을 변환 시키는것을 형 변환 이라고 한다

학생들의 영어 점수 평균값이 75.6 인 실수이니까 형변환을 해줘야 정확한 값이 나온다 안하면 걍 75.0 으로 나옴

이차원 배열

한 학교에 7개의 반이 있다고 생각해보자 한 반에 10명의 학생이 있다면 총 70명의 학생의 점수를 저장하고 계산을 해주어야한다
물론 위에서 배웠던 배열로 int[] engScores = new int[70]; 써서 70개의 배열을 만들수도 있지만 쌉 노가다고
반 과 반 안에 학생을 구분하여 2차원 배열을 사용하는게 더 좋다

사용 예시를 보여주자면

int[] abc = new int[3][4];

뒤에 대괄호를 한번더 추가하면 되는데 이렇게 이차원 배열을 사용하게 되면 아래와 같이 이차원 배열 저장공간이 만들어진다

그냥 배열은 가로만 주어진다면 2차원 배열은 세로를 추가해준거 같다
변수가 들어가는 10칸짜리 기차를 여러개 만들어서 0번기차 1번기차 2번기차 이름을 주는 느낌

이제 70명의 점수의 합과 평균값을 구해보자

소스 코드

public static void main(String[] args) {
			
		int[][] engScores = {
				{10,20,30,40,50,60,70,80,90,10},	
				{100,20,30,40,50,60,70,80,9,10},
				{1,20,3,40,50,60,7,80,9,10},
				{1,2,3,4,50,6,7,8,90,10},          //7개 반의 70명의 점수 선언
				{1,20,3,4,5,6,7,80,9,10},
				{1,2,30,4,50,6,7,8,9,10},
				{1,2,3,40,5,6,70,80,9,100},
		};	
		int sum = 0;
		double average = 0.0;
		
		for(int i=0;i<7;i++) {             
			for(int j=0;j<10;j++) {               // 배열 위치 번호 주기, 총합 구하기
			sum = sum + engScores[i][j];
			}
		
		}
		System.out.println( sum );				 // 총합 출력						
		
		average = (double)sum / 70.0;			// 평균값 구하기
		System.out.println( average );			// 평균값 출력
	}

실행 결과

1978
28.257142857142856

이차원 배열은 위 프로그램에서와 같이 int[][] engScores 이렇게 2중 대괄호를 이용해서 선언하면서 바로 초기값을 줄수도있고
int[][] engScores = new int [7][10] 와 같이 2차원 배열을 선언해서 공간만 만들고 초기값은 나중에 정해줄수도 있다

배열 안의 데이터 차순 정열

앞에서 배운 영어 점수의 1차원 배열을 내림차순 오름차순 으로 정열하는 예제를 만들어 보자

내림차순 정렬

	public static void main(String[] args) {
		
		int[] engScores = {80, 90, 30, 40, 70, 95, 76, 98, 100, 77}; 
		int temp = 0;  // 순서를 변경할때 잠시 사용하는 임시 변수
		for (int i =0; i < engScores.length; i++) {      // 배열에 순서
			for (int j = i +1; j < engScores.length; j++) {  // i 배열보다 한자리 앞에 순서
				if (engScores[i] < engScores[j]) {  // 두개의 크기 비교
					temp = engScores[i];
					engScores[i] = engScores[j];   // 위치 이동 시켜주기
					engScores[j] = temp;
				}
			}
			System.out.println(engScores[i] + " ");
		}
	}	

실행결과

100 98 95 90 80 77 76 70 40 30 

오름차순 정렬
오름차순은 위에 내림차순 코드에 if 문에서 더 작은 값이 앞으로 오도록 부호만 바꿔 주면 된다

if (engScores[i] > engScores[j])

실행결과

30 40 70 76 77 80 90 95 98 100 

배열 데이터 반복 처리 :for each 문

배열은 여러 개의 데이터를 처리할떄 효과적이고 반복문 또한 여러개의 데이터를 처리할떄 꼭 필요한데 배열을 편하게
사용하기 위해서 기존의 for 반복문 외에 for each 반복문을 사용하게 되면 조금 더 편리하게 쓸수있다

for 문 기본 형식

for (초기화식; 조건식; 업데이트식;)
실행부분;

for (int i=0; i<arr.length; i++)
	system.out.print(arr[i]+" ");

위와 같은 반복문을 for each 반복문을 사용해주면 아래와 같이 더 줄여서 쓸수가 있다

for each문 기본 형식

for (뵨수타입 변수이름 : 배열이름)
실행부분;

for(int e: arr)
	System.out.println(e+" ");

사용예시를 보자면

for 문

int arr[] = {1,2,3,4,5,6};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
	sum += arr[i];
}
System.out.println("합계 : "+sum);

for each문

int arr[] = {1,2,3,4,5,6};
int sum = 0;
for(int x : arr)
	sum += x;
System.out.println("합계 : "+sum);

출력결과

합계: 21

출력 결과는 둘다 같다 for each문은 굳이 i변수에 위치번호를 써줄필요없이 바로 변수에다 배열을 집어넣을수 있는걸로 보인다

이제 59쪽 까지 왔는데 점점 이해하기가 빡세지는거 같다
사람살려

profile
대충 살고싶다

0개의 댓글