코딩 이야기/Java

[JAVA의 정석] 자바의 정석 7.객체지향 프로그래밍 [7-2]

dajoonee(다쥬니) 2020. 12. 9. 06:23
728x90
반응형

* 이 글은 2020. 3. 6. 10:20에 작성되었던 글입니다 *

 

 

 

 

자바의 정석 7.객체지향 프로그래밍 [7-1] 포스팅 보러가기

 

[JAVA의 정석] 자바의 정석 7.객체지향 프로그래밍 [7-1]

* 이 글은 2020. 3. 6. 8:43에 작성되었던 글입니다 * 공부하면서 복습도 할 겸 블로그를 다시 시작하기로 했다. 학원을 다니기전에 혼자 공부하며 포스팅한 html, c언어 포스팅을 봤는데......ㅎ.ㅎ

dajoonee.tistory.com

 

자바의 정석 연습문제 7-2

이 문제가 바로 바로 나를 아주 화나게 만든 문제다ㅠㅠㅠ

(내가 바보일지도 모르겠다...)

모범답안보고 헛웃음이 절로 났다는건 비밀...ㅋㅋㅋㅋㅋㅋㅋ

일단 코드를 봐보자.

suffle() 메소드 코드

void shuffle() {
		//cards 배열에 담긴 카드를 섞는 메소드
		class NewSutdaArr {
			//새로운 카드 객체 생성 메서드
			void copy() {
				int j=1;
				int newJ=1;
				for(int i=0; i<CARD_NUM; i++) {
					if(i>=10) {		
						copyCards[i]= new SutdaCard(newJ,false); newJ++;
						continue;
					}
					if(j==1||j==3||j==8) {
						copyCards[i]= new SutdaCard(j,true);
						j++;
					}else {
						copyCards[i]= new SutdaCard(j,false);
						j++;
					}
				}
			}
		};//내부 클래스 종료
		
		NewSutdaArr newArr = new NewSutdaArr();
		newArr.copy();
		
		int i=0;
		//index 검사용 배열
		int check [] = new int[cards.length];
		
		//카드 섞기 시작.
		A:while (i<cards.length) {
			
			//0~19 랜덤
			int index = (int)(Math.random()*cards.length)+0;
			
			//인덱스 체크용
//			System.out.println("인덱스:"+index);
			
			//한 번이상 나온 인덱스인지 검사.
			for(int j=0; j<i; j++) {
				if(i!=0&&check[j]==index) {
//					System.out.println("continue"); //테스트용
					continue A;
				}
			}//for문
			
			//cards에 새로운 데이터 넣기.
			cards[i] = copyCards[index];
			check[i] = index;
			i++;
		}// while문 끝
	}//shuffle 끝

cards 배열을 다른 배열에 복사하고

인덱스를 랜덤으로 돌려 복사한 배열에 있는 값을 cards 배열에 저장했더니

자꾸 복사한 다른배열이 cards에 새로 저장된 값과 똑같아 지더라..;;(설명을 잘 못하겠음;;)

방금 생각난건데 참조변수이기때문인거 같다.

**2020년 3월 19일 (새벽에 음주 후) 추가**

저거는 배열 복사를 제대로 공부하지않고 무턱대고

풀었던지라... 애니웨이 ㅎㅎ

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

배열은 참조 변수다.

즉, 대입된 값을 바로 저장하는 변수가 아니라

대인된 값의 주소를 저장하고 있는 변수이다.

나는 얕은 복제를 시도 했기 때문에!!

그것도 실시간(?)으로 ....

복사하려는 배열의 내용물을 실시간으로 바꿨닿ㅎㅎ

그러니 결과값이 엉망진창 난리법석이 난거디...

고정값으로 있어야 할 원래 카드 배열에..

랜덤으로 뽑힌 카드를 인덱스 0부터 순서대로 그 원래 카드 배열에!! 원래 카드 배열에 !!!!!!!! 대입 시켜버렸던거임

그래서 내가 원래 참조 해야할 배열을 스스로 망치는꼴 ㅎ

(지금 생각하니 그때의 내가 참 얼탱이 없음 ㅋㅋㅋ..;;

지금 주저리주저리 횡설수설 해놓았지만

자고일어난 내가 다시 고칠것임

****************추가 끝*****************

코드설명...간단히 해보자면

suffle 메소드 내에 클래스를 만들어주고 copy()메소드에서 인스턴스 필드인 copyCard 배열을 초기화 하였다.

cards에 초기화 시켜준 값과 똑같다.(sutdaDeck 생성자 코드를 이용)

우선 copyCard의 인데스가 될 index는 랜덤으로 정수를 뽑아내고

중복된 값이 들어가면 안되기 때문에

for문과 if문을 이용하여 해당 인덱스가 이미 cards 배열에 대입이 되었는지 검사를 하였다.

(현재까지 저장된 인덱스 번호는 check 배열에 넣어 두고 대조했음)

만약 같은 인덱스가 check배열에 저장 되어있다면 다시 index를 랜덤을 돌려 새로운 번호를 저장하고,

조건을 통과하면 해당 인데스에 있는 copyCard 배열의 데이터를 cards 배열에 순차적으로 대입을 시켰다.

pick(),pick(int index) 메소드 코드

SutdaCard pick(int index) {
		return cards[index];
	}
	SutdaCard pick() {
		return cards[(int)(Math.random()*cards.length)+0];
	}

이건 뭐..설명할게 없다.

실행결과

그래도 풀었다는게 너무 뿌듯하다.

사람마다 로직이 다 다르다고 하니깐!!!!

암튼 끝 ㅎ.ㅎ

 

 

반응형