본문 바로가기

Java

[IT국비지원교육_코딩_비전공자] 배열의 활용 + 객체지향언어의 특징

Arrays클래스로 배열 다루기

> 배열의 비교와 출력

equals( ), toString( )

int[] arr = {0,1,2,3,4};
int[][]arr2D = {{11,12}, {21,22}};

System.out.println(Arrays.toString(arr));  // [0,1,2,3,4]
System.out.println(Arrays.deepToString(arr2D);  // [[11,12] , [21,22]]

String[][]str2D = new String[][]{{"aaa","bbb"}, {"AAA","BBB"}};
String[][]str2D2 = new String[][]{{"aaa","bbb"}, {"AAA","BBB"}};

System.out.println(Arrays.equals(sta2D, str2D2));  // false
System.out.println(Arrays.deepEquals(sta2D, str2D2));  // true

 

> 배열의 복사

copyOf( ), copyOfRange( )

int[] arr2 = Arrays.copyOf(arr, arr.length);  // arr2 = [0,1,2,3,4]
int[] arr3 = Arrays.copyOfRange(arr, 2,4)  // arr3=[2,3] "4는 불포함"

 

배열의 활용
public class ArrayEx6 {

	public static void main(String[] args) {        
		int [] score = {79,88,91,33,100,55,95};   //점수 중 최대값과 최소값을 구하라
		                                          //순차탐색
		int max = score[0]; //0번 인덱스값 79
		int min = score[0]; //0번 인덱스값 79

		for(int i = 1; i < score.length; i++)   //반복문 시작을 1로 함 (시작위치를 0으로 하면 79와 79 본인을 비교하므로 제외함)
			if(score[i] > max) {                // 91과 88의 값이 참 
				max = score[i];                 // 반복 횟수 => 6번   
			} else if(score[i] <min) {          
				min = score[i];
			}
		System.out.println("최대값 :" + max);
		System.out.println("최소값 :" + min);
	} 
		
	}

 

public class ArrayEx7 {

	public static void main(String[] args) {
		int[] numArr = new int[10];
		
		for (int i = 0; i< numArr.length ; i++) {
			numArr[i] = i;
			System.out.print(numArr[i]);
			
		}
		System.out.println();

		for (int i = 0; i < numArr.length ; i++) {   //반복횟수 10번
			int n = (int)(Math.random() *10);   // 0~9사이의 값 1개 나옴
			int tmp = numArr[0];
			numArr[0]= numArr[n];
			numArr[n] = tmp;
			
		}
		for (int i = 0; i < numArr.length; i++)
			System.out.print(numArr[i]);
	}

}
// 카드 48장을 절반으로 나누고 아래있는 카드를 위로 올린다
// > 24장을 절반으로 나누고 아래 카드를 위로 ... 규칙으로 셔플
public class ArrayEx8 {

	public static void main(String[] args) {
		int[]ball = new int[45];
		
		for(int i = 0; i < ball.length; i++) {
			ball[i] = i+1;
		}
			System.out.println(Arrays.toString(ball));
		
		int temp = 0;
		int j = 0;
		
		for(int i =0; i < 6; i++) {
			j = (int)(Math.random() *45);
			temp	= ball[i];
			ball[i] = ball[j];
			ball[j] = temp;
		}
		
		System.out.println(Arrays.toString(ball));
		
		for(int i =0; i < 6; i++)
			System.out.printf("ball[%d] = %d%n" ,i, ball[i]);
		
	}

}
// lotto 의 규칙 활용 - 45개의 공 중 '임의로' 6개의 공을 뽑는 것
package a220112;

public class ArrayEx10 {

	public static void main(String[] args) {
		// O(n^2) : 
		// 버블(bubble) 정렬 > 상호비교를 통해 정렬을 하는 것 
		int[] numArr = new int[5];
		
		for(int i = 0; i < numArr.length; i++) {
			System.out.print(numArr[i]= (int)(Math.random() * 10));
		}
		System.out.println();
		//[8,9,1,5,4] 
		// [89154] > [81954] > [81594] > [81549]  ((1회차 끝))
		// 9와 9를 비교해서 그 차이를 가지고 서로 자리를 상호간에 교환하는 것
		//9와 9의 차이가 없음 > 그다음 9와 1을 비교하기 위해 자리를 교차한다[9,1,9,5,4]
		// 그다음 바뀐 [9,1,9,5,4]에서 9와 5을 비교한다 [9,1,5,9,4]
		//그다음은 [9,1,5,4, 9]를 비교하는데 여기까지가 1회차 비교이다
		// >>> 아래의 i포문 비교가 끝난 상황   (회차안의 비교를 4번함)
		// =============================================================
		// i = 0 일때 둘사이의 
		// 오름차순 정렬의 목적을 가지고 있음 > 15499를 만들기 위함

		// 버블정렬의 특징 : 회차당 마지막 인덱스값부터 정렬이 완료되는 것
		// 제일 뒤에 인덱스값부터 최대값이 된다
		
		
		// 2회차 시작
		// i = 1 일때
		// [1,8,5,4,9] 
		// [1,5,8,4,9]
		// [1,5,4,8,9] > 각 회차별 완결 숫자 
		// =====> 2회차 끝  (8이 계속 뒤로 밀리고 최종적으로 8과 9가 확정이다)
		
		// 3회차 시작
		// i = 2 일때
		// [1,5,4,8,9]   확정인 8,9를 제외한 3개를 비교
		// [1,4,5,8,9] > 각 회차별 완결 숫자   
		// ======> 3회차 끝   (3회차에 확정값은 총 3개 /5가 뒤로 밀리고 최종적으로 5와 8과 9가 확정)
		
		// 4회차 시작
		// [1,4,5,8,9] > 각 회차별 완결 숫자  
		// =========> 4회차 끝 (그다음 회차 비교는 할 필요가 없음)
		
		
		
		
		for (int i=0; i < numArr.length ; i++) {
			boolean changed = false;  // 자리 이동을 하지 않는 false가 기본값
			// changed에 break가 없을 경우 4번 출력한다 / 더이상 자리이동이 없으니까 정렬할 필요가 없어서 break  
			
			for(int j =0; j < numArr.length-1-i ; j++) {
											// 인자 길이는 5개 이지만 4번 비교하는 것이므로 -1 (나와 그 다음것을 비교하니까 -1을 해야함)
											// -i는 없어도 됨 (각 회차별 반복횟수를 매번 4번씩 해도 되지만 
				                            // 불필요한 연산이므로 그러한 불필요 연산을 빼기 위해 i를 빼는 것이다)	
				if(numArr[j] > numArr[j+1]) {
					int tmp = numArr[j];
					numArr[j] = numArr[j+1];  // [j+1] 가 [j]보다 크기 때문에 자리 이동을 하면서 비교를 하지만 
					numArr[j+1] = tmp;        // 더이상 비교할 필요가 없어지면 break
					changed = true;           // 자리이동을 하게 되면 기본값 false가 true로 바뀌면서 조건문 탈출!
					
				}
			} 
			
			if(!changed) break;
			
			for(int k=0; k<numArr.length; k++)
				System.out.print(numArr [k]);
			System.out.println(" " + (i+1) + "회차" );
		}

	}

}

// 과제 1)
// 선택정렬의 규칙과 방법 알아오기
// 선택정렬 : 선택해서 위치를 정렬하는 것
// 중간과정은 혼자 독학해서 이해해오기
// 회차가 끝날때마다 앞에있는 작은수가 확정이 됨

*** String 객체(문자열)은 읽을수만 있을 뿐 내용은 변경할 수 없다 (매우 중요!!)ㄹ

 

객체지향언어 

- 데이터 : 저장해야 할 것

- 함수 : 해야 할 것

→ 91년 인터넷(WWW)이 처음 나옴

→ C++ != C언어

 

특징 : 코드 재사용성이 좋고 코드간의 관계를 규정하는 언어이므로 관리가 용이함

       => 개발과 유지보수 비용을 획기적으로 개선함

 

public class TvTest {
    // 메인메서드가 있는 클래스와 동일하게 파일 이름 설정해야함
	public static void main(String[] args) {
		int[] arr = new int[3];
		
	Tv t;  //시작점  (=> Tv t = new Tv();) 
	t = new Tv();    // new Tv()가 인스턴스이고 인스턴스에 담긴 주소가 T에 담기는 것
	t.channel = 7;   // TV와 t.는 class와 instance의 관계   
	t.channelDown();
	t.모양 = "별모양"
;	System.out.println("현재 채널은 " + t.channel + "입니다");

		// 클래스의 설계 >> 사용자가 정의한 자료형
		// 자료를 저장하기 위해 사용하는 방법  >> 자료구조
		// 변수(하나의 메모리에 한개의 데이터밖에 저장할 수 없어서) > 배열(각각의 저장공간에 접근하기 위해 인덱스를 사용해 구분) > 구조체
		// 구조체 : 각각의 저장공간을 이름을 통해 구분함. 기능은 없고 데이터를 저장하기 위한 공간만 있는 것
        // 클래스 = 구조체 + 기능
	}

}

class Tv {
	String 모양;
	String color;
	boolean power;
	public int channel;
	
	void power( ) {
		power = ! power;
		
	}
	void channelUp( ) {
		++channel;
	}
	public void channelDown( ) {
		--channel;

	}	
}