[개발] - Java/Mega
<보충> Day19. Has 관계 두 번째 예제 설명 슬라이드 파보기
완벽한 장면
2023. 4. 25. 00:22
230411
HasTest2
package mega.backend_onemore.Day19.HT2;
class B {
}
class C {
B[] b = new B[5]; //멤버변수 has 관계 (변수만 있으면 Has관계 가능하다)
// 그러면 당연히 배열도 가능한 것이다.
}
class D {
//has 관계?? 아니다!
// 멤버변수로 갖는 거랑 메서드로 부르는 거랑 차이가 있으므로
// 내가 실제로 가지고 있어야 한다.
B make(B[] b) {
b[2] = new B();
return b[2];
}
}
class E {
D[][] d = new D[3][3];
/*
D[][] sendD(D[][][] d, int i, int j, int k) {
return d[0];
// 자료형으로 받고 싶은 만큼 뒤에서부터 소거(->리턴 부분에 적어준다)
}
*/
D[] sendD(D[][] d, int i, int j) {
d[i][j] = new D();
return d[i];
}
public class HasTest2 {
public static void main(String[] args) {
C c = new C();
D d = new D();
D[][] d1 = new D[3][3];
B b = d.make(c.b);
E e = new E();
e.sendD(d1, 2, 0);
// 이렇게 해주면 d[0][2]에만 객체가 있는 것이고 나머지에는 없는 것.
// d1[2][0]은 객체가 있을까요 없을까요?
// 있다 => d1 배열에 인덱스로 2,0에 매개변수로 넣어서 객체를 만들어줬으니까.
// 그럼 d1[0][2]에는?
// 없다!
// 다시
/*
e.sendD(d1, 0, 2); 여기서 d1이 넘어가면 D[3][3]; 이게 넘어간 것이다.
d1은 2차원 배열
그리고 그 속에 있는 0행 2열에 객체 만들어 넣은 것*함수콜 의의
그럼 뒤에 3열은 남겨놓고 앞에 3열은 먼저 가있는 상태가 되겠지.
D[] d2 = e.sendD(d1, 0, 2);에서 객체에 있는 것을 출력하려면 어떻게 해야 되냐?
일단 i를 보냈으니까 d[0] 보낸 것.
d2[2]; 하면 된다.
지금 d2가 d[0]으로 치환된 것.
*/
}
}
}
관련된 설명
오른쪽 코드부터 보면
d1은 2차원 배열이고
sendD가 뭔지는 모르겠지만, 의 리턴 결과가 1차원 배열이다.
인자로 2차원 배열을 넘기면 결과로 1차원 배열을 주는 애.
그리고 왼쪽 코드를 보니까, sendD()에서는 2차원 배열을 그대로 받았다.
그리고 그것의 [0][2] 즉 첫 번째 행의 세 번째 열 // 여기에 객체를 만든 것.
그래서 빨간색으로 0,2에 D가 생겨있음.
지금 전부 자료형이 클래스 타입(참조형)이니까, d1만 했을 때는 9개의 칸이 모두 null
그럼 sendD에서 하는 일을 보니까, i와 j를 받아서 그 행과 열에 새로운 객체를 꽂아주는 것을 함.
그런데 여기서 주의
2차원 배열이니까 대괄호 2개를 쓰면 하나의 원소를 의미한다.
그런데 리턴값에서 대괄호 하나만 썼지.(d[0])
이것의 의미는??
- 1개의 행!!!
1개의 행이란?
=> 하나의 행에는 여러 열들이 있지.
즉, 1차원 배열! 을 의미
(d1이 2차원 배열일 때만 가능한 이야기이다.)
즉, return으로 d에 1행을 반환한다는 이야기(인덱스 차이 주의)
오른쪽에서 d2라고 해도, d2는 변수명일 뿐이고, d2에 첫 번째 행이 담긴 것!!!
앞서 말한 것처럼 첫 번째 행은 1차원 배열이니까,
1차원 배열에게 세 번째 칸(인덱스: 2)이 null인지 묻고 있는 것.
여기서는 newD() 해줬으니까 null 이 아니므로 else에 걸리겠지.
그래서 "객체가 있습니다" 가 출력된다.
728x90
반응형