Java 초급 (46)

반응형

 

배열

 

: 변수를 nm개 선언하고 저장하기엔 코드 낭비가 발생한다. 그렇기에 배열의 형식으로 많은 양의 데이터를 적은 코드로 처리하는 방식을 말한다. 

 

사용법은 아래와 같다.

 

타입[] 변수명 = new 타입[배열크기]; // 객체를 만들 때 new를 사용한다.
타입 변수명[] = new 타입[배열크기];

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method1();
		obj.method2();
	}
	
	public void method1() {
		/*
		 * int 변수 10개 선언 및 저장
		 * 10개 변수 출력 해보기.
		 */
		
		int i1 = 1;
		int i2 = 2;
		int i3 = 3;
		int i4 = 4;
		int i5 = 5;
		int i6 = 6;
		int i7 = 7;
		int i8 = 8;
		int i9 = 9;
		int i10 = 10;
		
		System.out.println(i1);
		System.out.println(i2);
		System.out.println(i3);
		System.out.println(i4);
		System.out.println(i5);
		System.out.println(i6);
		System.out.println(i7);
		System.out.println(i8);
		System.out.println(i9);
		System.out.println(i10);
	}
	
	public void method2() {
		/*
		 * int 변수 10개 선언 및 저장
		 * 10개 변수 출력 해보기.
		 * 
		 * int <- 타입
		 * []  <- 배열 선언
		 * new <- 메모리 할당
		 * int[10] <- 생성 숫자.
		 */
//		int arr[] = new int[10];
		int[] arr = new int[10]; // 객체를 만들 때 new를 사용한다.
		System.out.println(arr);
		for (int i = 0; i < 10; i++) {
			arr[i] = i;
			System.out.println(arr[i]);
		}
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method3();
	}
    
	public void method3() {
		/*
		 * 정수 5개를 저장하고 역순으로 출력.
		 */
		int[] num = new int[5];
		num[0] = 1;
		num[1] = 2;
		num[2] = 3;
		num[3] = 4;
		num[4] = 5;
        
		/*
		 * 배열.length <- 배열의 길이를 나타냄.
		 */
		for (int i = 0; i < num.length; i++) {
			System.out.println(num[num.length-i-1]);
		}
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method4();
	}
    
	public void method4() {
		/*
		 * 배열을 만들어 정수 5개 값을 저장 해보기. 
		 */
		
		int[] num = {1,2,3,4,5};
		
		for (int i = 0; i < num.length; i++) {
			System.out.println(num[i]);
		}
	}
}

 

결과 화면3

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method5();
	}
    
	public void method5() {
		/*
		 * 학생 10명의 점수를 입력하고
		 * 1. 평균, 총점을 구하시오.
		 * 2. 최대값, 최소값.
		 */
		int[] scores = {75,77,43,83,90,65,82,94,55,70};
		int sum = 0;
		double avg;
		int max = scores[0];
		int min = scores[0];
		
		for (int i = 0; i < scores.length; i++) {
			sum += scores[i]; // 총점과 평균
			max = max > scores[i] ? max : scores[i]; // 최대값
			min = min < scores[i] ? min : scores[i]; // 최소값
		}
		avg = (double)sum/scores.length;
		
		System.out.println("평균 : " + avg);
		System.out.println("총점 : " + sum);
//		System.out.printf("총점 : %d 평균 : %f ", sum, avg);

		// 위와 같은 삼항연산 방식으로 해도 문제 없다.
		for(int i = 0; i < scores.length; i++) {
			if(max < scores[i]) {
				max = scores[i];
			}
			if(min > scores[i]) {
				min = scores[i];
			}
		}
		System.out.println("최대값 : " + max);
		System.out.println("최소값 : " + min);
//		System.out.printf("최대값 : %d 최소값 : %d ", max, min);
	}
}

 

결과 화면4

 

 

 

버블 정렬

 

:  서로 인접한 두 데이터를 검사하여 정렬하는 방식이다.
인접한 2개의 레코드를 비교하여 크기가 순서대로 되어 있지 않으면 서로 교환한다.

여러 정렬 중에 가장 느리다.

 

package kr.or.ddit.study05.sec02;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method6();
	}
    
	public void method6() {
//		int a = 7;
//		int b = 3;
//		
//		System.out.println("a : " + a + " b : " + b);
//		
//		/*
//		 * a 값과 b 값을 바꿔 보세요.
//		 */
//		int temp = a;
//		a = b;
//		b = temp;
//		
//		System.out.println("a : " + a + " b : " + b);
		
		/*
		 * 버블 정렬
		 * 원본자료가 n개 일때 n-1차 운행한다.
		 * 각 회차에서 인접한 두 값을 비교하여 
		 * 오름 차순인 경우 작은 값을 앞에 위치시킴
		 * 내림 차순인 경우    큰 값을 앞에 위치시킴
		 */
		int[] scores = {75, 77, 43, 83, 90, 65, 82, 94, 55, 70};
		
		// 정렬 전 출력 구문
		System.out.println("정렬 전");
		for (int i = 0; i < scores.length; i++) {
			int j = scores[i];
			System.out.print(j + "\t");
		}
		System.out.println();
		// 정렬
		for(int i=0; i<scores.length-1; i++) { // 마지막 숫자를 제일 앞에 놓기 위해선 n-1 만큼 실행이 되어야 함
			// j = 0 : 77, 75, 43, 83, 90, 65, 82, 94, 55, 70
			// j = 1 : 77, 75, 43, 83, 90, 65, 82, 94, 55, 70
			// j = 2 : 77, 75, 83, 43, 90, 65, 82, 94, 55, 70
			for(int j=0; j<scores.length-1; j++) { // 작은 수가 앞으로 오는 방법으로 바꿀 시 
				if(scores[j] < scores[j+1]) { // scores[j] > scores[j+1] 로 변경하면 된다.
					int temp = scores[j];
					scores[j] = scores[j+1];
					scores[j+1] = temp;
				}
			}
		}
		// 정렬 후 출력 구문
		System.out.println("정렬 후");
		for(int i=0; i<scores.length; i++) {
			int j = scores[i];
			System.out.print(j + "\t");
		}
	}
}

 

결과 화면5

 

 

 

향상된 버블 정렬

 

package kr.or.ddit.study05.sec02;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method7();
	}
	
	public void method7() {
		int[] scores = {75, 77, 43, 83, 90, 65, 82, 94, 55, 70};
		
		// 정렬 전 출력 구문
		System.out.println("정렬 전");
		for (int i = 0; i < scores.length; i++) {
			int j = scores[i];
			System.out.print(j + "\t");
		}
		System.out.println();
		// 향상된 버블 정렬
		// 1, 2, 3, 4, 6, 5
		for(int i=0; i<scores.length-1; i++) {
			boolean end = true;
			for(int j=0; j<scores.length-1; j++) { 
				if(scores[j] < scores[j+1]) {
					int temp = scores[j];
					scores[j] = scores[j+1];
					scores[j+1] = temp;
					
					// 바뀌는 값이 있을 시 false로 변경
					end = false;
				}
			}
			// 바뀌는 데이터들이 없다면 break 문을 탄다.
			if(end) break;
		}
		// 정렬 후 출력 구문
		System.out.println("정렬 후");
		for(int i=0; i<scores.length; i++) {
			int j = scores[i];
			System.out.print(j + "\t");
		}
	}
}

 

결과 화면6

 

 

package kr.or.ddit.study05.sec02;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method8();
	}
    
	public void method8() {
		/*
		 * 5명의 점수를 스캐너를 통해 입력 받고,
		 * 점수 순으로 정렬해 보시오.
		 * 
		 * 높은 점수가 앞으로.
		 */
		int[] scores = new int[5];
		
		for (int i = 0; i < scores.length; i++) {
			System.out.print("점수 입력해 주세요 : ");
			scores[i] = sc.nextInt();
		}
		System.out.println();
		
		/*
		 * 1. 입력된 점수 출력하기
		 */
		System.out.println("정렬 전");
		for (int i = 0; i < scores.length; i++) {
			int j = scores[i];
			System.out.print(j + "\t");
		}
		System.out.println();
		
		/*
		 * 2. 정렬 하기
		 */
		for (int i = 0; i < scores.length-1; i++) {
			boolean end = true;
			for (int j = 0; j < scores.length-1; j++) {
				if(scores[j] < scores[j+1]) {
					int temp     = scores[j];
					scores[j]    = scores[j+1];
					scores[j+1]  = temp;
					
					end = false;
				}
			}
			if(end) break;
		}
		
		/*
		 * 3. 출력하기
		 */
		System.out.println("정렬 후");
		for (int i = 0; i < scores.length; i++) {
			System.out.print(scores[i] + "\t");
		}
	}
}

 

 

 

 

선택 정렬

 

: 데이터들 중 가장 작은 데이터를 찾아 가장 앞의 데이터와 교환해나가는 방식이다.

 

package kr.or.ddit.study05.sec02;

import java.util.Scanner;

public class ArrayExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		ArrayExample01 obj = new ArrayExample01();
		obj.method9();
	}
	
	public void method9() {
		/*
		 * 선택 정렬
		 * 
		 * 최소값 혹은 최대값으로
		 * 행을 먼저 맞춘 후 바꿈
		 */
		int[] scores = {75, 77, 43, 83, 90, 65, 82, 94, 55, 70};
		
		/*
		 * 향상된 for 문
		 * 
		 * for (배열 혹은 리스트의 타입 i : 배열 혹은 리스트){
		 * 
		 * }
		 */
//		for(int i=0; i<scores.length; i++) {
//			int score = scores[i];
//			System.out.print(score + "\t");
//		}
		// 위의 코드와 같은 방식으로 아래처럼 쓸 수 있다.
		
		for (int score : scores) {
			System.out.print(score + "\t");
		}
		System.out.println();
		
		
		for (int i = 0; i < scores.length - 1; i++) {
			int min = i;
			for (int j = i; j < scores.length; j++) {
				if(scores[j] < scores[min]) {
					min = j;
				}
			}
			
			int temp = scores[min];
			scores[min] = scores[i];
			scores[i] = temp;
		}
		System.out.println("정렬 후");
		for (int i = 0; i < scores.length; i++) {
			System.out.print(scores[i] + "\t");
		}
	}
}

 

결과 화면8

 

 

 

Tip

 

- 향상된 for 문

 

: 처음부터 끝까지 반복하는 경우 사용할 수 있다.

주로 배열을 처음부터 끝까지 출력할 때 사용한다.

 

사용법은 아래와 같다.

 

for(자료형 변수명 : 배열명) {
	실행문;
}

// 배열명의 처음부터 끝까지 출력한다.

 

 

반응형

'자바' 카테고리의 다른 글

[Java 초급] 11장 2차원 배열  (0) 2023.12.12
[Java 초급] 10.5.1장 테스트  (0) 2023.12.11
[Java 초급] 9장 참조 타입  (0) 2023.12.11
[Java 초급] 8장 반복문 while문, do-while문  (0) 2023.12.11
[Java 초급] 7.5장 테스트  (0) 2023.12.08
반응형

 

참조 타입

 

: 객체(object)의 번지를 참조하는 타입을 말한다.

 

데이터 타입

 

기본 타입 변수와 참조 타입 변수 차이점

 

 

 

메모리 사용 영역

 

메모리 영역 설명

 

 

- Stack 영역

 

스택영역은 추후에 삭제된다.

 

 

- Heap 영역

 

 

String의 같은 글자일시 같은 힙 영역을 바라본다.

 

new String

 

위의 그림과 같은 경우 아래의 코드를 사용하여 new를 생성했기 때문에 서로 다른 곳을 바라보는 것이다.

 

String name1 = new String("신용권");
String name2 = new String("신용권");

 

 

+ String 타입의 문자열을 비교할 때는 == 을 사용해서는 안 된다. (== 는 주소값을 비교하는게 된다.)

그대신 equals()를 이용해 문자열을 비교한다.

 

타입 변수명 = 원본문자열.equals(비교문자열);
원본문자열.equals(비교문자열);

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class VarExample {
	static int i = 100;
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		VarExample obj = new VarExample();
		String name1 = "자바"; // String은 객체. 객체의 경우 Heap 영역에 생성이 되고 주소값만 가져옴.
		String name2 = "어렵다"; // 모두 완료 후 주소 값만 사라지고, Heap의 글을 삭제 시켜주지 않음.
		// jvm이 heap 영역에 있는 글씨인 데이터를 삭제 시켜줌.
		obj.method1();
		int i1 = 10;
		int i2 = 15;
	}
	
	public void method1() {
		String name1 = "자바"; // main에 name1의 주소 값을 가져옴 >> 효율적으로 메모리 관리할 수 있음.
		int i1 = 10; // Stack 영역에 쌓였다가 블록을 끝나는 즉시 사라짐.
		int i2 = 15;
	}
}

 

 

package kr.or.ddit.study05;

import java.util.Scanner;

public class StringExample {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		StringExample obj = new StringExample();
		obj.process();
	}
	
	public void process() {
		String str1 = "홍길동";
		String str2 = "홍길동";
		String str3 = "강감찬";
		String str4 = new String("강감찬"); // Heap 영역에 하나 더 생김. str3과의 메모리 주소가 다르게 나옴.
		String str5 = new String("강감찬");
		
		System.out.println(str1 == str2);
		System.out.println(str3 == str4);
		System.out.println(str4 == str5); // class의 경우기에 주소값을 비교함.
		System.out.println(str3.equals(str4)); // 값이 같은지 비교함.
		
		Customer c = new Customer();
		System.out.println(c);
		
		String s1 = ""; // 아래의 코드와는 다른 뜻임.
		String s2 = null; // 객체가 새로 생성되지 않음. or 주소값이 존재하지 않음
//		String s2 = "";
		
		
//		if(s2.equals("") || s2 == null) { // 이 경우 사용이 불가능함. 
		if(s2 == null || s2.equals("") ) { // if는 앞에가 참일 경우 뒤를 비교하지 않음.
		// null 체크는 가장 처음에, 데이터가 비었는지의 여부는 나중에 해야함.
			System.out.println("데이터가 비었음");
		}
	}
}

class Customer {
	String name = "강감찬";
}

 

결과 화면2

 

 

반응형
반응형

 

while 문

 

: 조건이 언제 끝날지 모르겠을 때 주로 사용한다.

 

while 문 로직

 

사용법은 아래와 같다.

 

while(조건식) {
	실행문;
}

 

package kr.or.ddit.study04.sec02;

import java.util.Scanner;

public class WhileExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		WhileExample01 obj = new WhileExample01();
		obj.method1();
	}
	
	public void method1() {
		int i = 0;
		while(true) {
			i++;
			System.out.println(i + "번째 실행.");
			System.out.println(i + "종료 하시겠습니까 y/n");
			String yn = sc.nextLine();
			if(yn.equals("y")) { // String 에서는 == 은 안 되기에 equals을 사용하여 비교해야함.
				break; // 입력한 값이 y면 break가 걸려 종료됨.
			}
		}
	}
}

 

결과 화면1

 

 

package kr.or.ddit.study04.sec02;

import java.util.Scanner;

public class WhileExample01 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		WhileExample01 obj = new WhileExample01();
		obj.method2();
	}
    
	public void method2() {
		int i = 0;
		while(i<10) {
			System.out.println(i + "번째 실행");
			i++;
		}
		
		for(;;) { // 위의 while문과 같다.
			
		}
	}
}

 

결과 화면2

 

 

package kr.or.ddit.study04.sec02;

import java.util.Scanner;

public class WhileExample02 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		WhileExample02 obj = new WhileExample02();
		obj.method1();
	}
	
	public void method1() {
		/*
		 * 커피 메뉴
		 * 1. 아메리카노		: 3000원
		 * 2. 카페라떼			: 4500원
		 * 3. 카라멜 마끼아또		: 4700원
		 * 4. 자바칩 프라프치노	: 4900원
		 * 5. 종료
		 * 
		 * while 문을 이용해 해당 메뉴를 출력 하고,
		 * 5를 입력 할 경우 여때까지 주문한 금액의 총합을 출력하시오.
		 */
		
		int sum = 0;
		String str = "커피 메뉴\n"
					+ "1. 아메리카노                 : 3000원\n"
					+ "2. 카페라떼                    : 4500원\n"
					+ "3. 카라멜 마끼아또	 : 4700원\n"
					+ "4. 자바칩 프라프치노       : 4900원\n"
					+ "5. 종료\n";
		String bill = "*** 영수증 ***\n";
		
		while(true) {
			System.out.println(str);
			System.out.println("메뉴를 선택하세요.");
			int menu = sc.nextInt();
			if(menu == 1) {
				sum += 3000;
				bill += "아메리카노                 : 3000원\n";
			} else if(menu == 2) {
				sum += 4500;
				bill += "카페라떼                    : 4500원\n";
			} else if(menu == 3) {
				sum += 4700;
				bill += "카라멜 마끼아또	 : 4700원\n";
			} else if(menu == 4) {
				sum += 4900;
				bill += "자바칩 프라프치노       : 4900원\n";
			} else if(menu == 5) {
				System.out.println("===========================");
				break;
			} else {
				System.out.println("잘못 입력 하셨습니다.");
			}
			System.out.println("===========================");
		}
		System.out.println(bill);
		System.out.println("총 금액은 " +  sum + "입니다.");
	}
}

 

결과 화면3

 

 

 

do-while 문

 

: while 문과 동일하지만 무조건 한 번은 실행한다.

 

do-while 문 로직

 

사용법은 아래와 같다.

 

do {
	실행문;
} while (조건식);

 

package kr.or.ddit.study04.sec02;

import java.util.Scanner;

public class WhileExample02 {
	Scanner sc = new Scanner(System.in);

	public static void main(String[] args) {
		WhileExample02 obj = new WhileExample02();
		obj.method2();
	}
	
	public void method2() {
		
		end : // 라벨을 붙여 사용할 수 있음.
		while(true) {
			System.out.println(" 전체 와일문");
			while(true) {
				System.out.println(" 안쪽 와일문");
//				break;
				break end;
			}
		}
	}
}

 

 

반응형
1 ··· 8 9 10 11 12 13 14 ··· 16