오늘은 객체배열에 대해서 공부해보았다.
기본자료형 배열과 참조자료형 배열의 형태는 아래와 같다.
예시로 Book이라는 객체가 들어갈 객체배열을 만들어 보았다.
객체배열을 복사할 때 아래와 같이 얕은복사와 깊은 복사가 있다.
<추가공부>
객체를 배열로 다루기
부모타입의 참조변수로 자녀타입의 객체를 참조하는 것이 가능하다는 것을 지난 시간에 배워 알고 있을것이다.
Car(부모클래스) / Supercar(자녀클래스) 라면,
Car c = new Supercar();
또는
Car c = null;
Supercar sc = new SuperCar();
c = sc;
방법이 있었다.
이번 시간엔 이러한 점을 이용해서 부모타입의 참조변수로 자녀타입 객체를 배열로 다루는 방법을 알아보겠다.
부모 클래스로 Juice가 있고 자녀클래스로 Pokari, Coke, Fanta가 존재하면
Juice j1 = new Pokari();
Juice j2 = new Coke();
Juice j3 = new Fanta();
위 코드를 참조변수 배열로 다루면 아래와 같다.
Juice[] j = new Juice[3];
j[1] = new Pokari();
j[2] = new Coke();
j[3] = new Fanta();
이렇듯 부모타입의 참조변수 배열을 사용하면, 같은 부모를 가진 서로 다른 종류의 객체를 배열로 묶어서 다룰 수 있다. 또는 묶어서 다루고 싶은 객체들의 가장 가까운 공통부모타입의 참조변수 배열을 생성하여 객체를 저장하면 된다.
아래의 소스를 보며 같이 배워보도록 하자!
소스1 - 부모클래스 Product3를 상속받은 자녀클래스 Tv2, Computer2, Audio
먼저
부모클래스 Product3와
자녀클래스 Tv2, Computer2, Audio를 만들었다.
자녀클래스는 인스턴스화 할때 생성자를 통해 부모클래스의 인스턴스변수인 price를 직접 초기화하도록 하였다.
Tv2(){ super(100);} // Tv2 객체가 생성될 때, 부모의 생성자를 통해 Tv2.price는 100의 값을 가짐
Computer2(){ super(200);} // Computer2 객체가 생성될 때, 부모의 생성자를 통해 Computer2.price는 200의 값을 가짐
Audio(){ super(50);} // Audio 객체가 생성될 때, 부모의 생성자를 통해 Audio.price는 50의 값을 가짐
여기서 super()는 부모 클래스로부터 상속받은 필드나 메소드를 자식 클래스에서 참조하는 데 사용하는 참조 변수 다.
소스2 - 구매하는 기능을 가진 Buyer클래스
Buyer클래스에 money, bonusPoint, bonusPointSum 변수를 선언하고 Poduct3 배열인 cart를 추가했다.
Product3[] cart = new Product3[10]; // 길이가 10인 Product3 배열 선언
그리고 buy메소드에 cart[i++]=p;를 추가해줌으로써 물건을 구입하면 배열 cart에 저장하도록 한 모습이다.
모든 제품클래스(Tv2, Computer2, Audio)의 부모인 Product3클래스 타입의 배열을 사용함으로써 구입한 제품을 하나의 배열로 다룰 수 있게 됐다.
소스3 - 구매한 물품에 대한 정보와 적립포인트를 다루는 기능을 가진 summary메소드
Buyer클래스에 구매한 물품의 정보를 요약해서 보여주는 summary메소드를 선언하고, if문을 이용하여 배열에 아무것도 없으면 break가 실행되어 for문을 빠져나가도록 하였다.
구입한 물품의 가격 합계를 구하기 위해 sum += cart[i].price; 를 추가
물품 목록을 출력하기 위해 itemlist += (i==0)?""+cart[i] : "," + cart[i];를 추가하였다.
소스 4 - Buyer클래스를 인스턴스화하여 buy메소드 호출
Buyer클래스를 참조변수 b2로 인스턴스화 한 후,
buy메소드를 호출하여 각각 자녀클래스를 참조하고 마지막은 구입한 물품의 정보를 출력하기 위해 summary메소를 호출하였다.
결과 화면
부모타입의 참조변수로 자녀타입의 객체를 참조하는 것을 이용하여 위와 같은 결과화면을 출력하였다.
이렇듯 부모타입의 참조변수를 이용하여 여러 객체를 다룬다면 번거롭게 클래스 안에서 많은 클래스를 객체화를 시켜주지 않아도 된다.
출처: https://blog.naver.com/201876/222030120359
얕은 복사와 깊은 복사의 차이점
얕은 복사
객체의 주소를 대입합니다.
때문에 하나의 객체의 어떠한 값이 변경되면 값을 대입한 다른 객체의 값 또한
변경됩니다.
UserInfo userInfo = new UserInfo();
UserInfo userInfo1 = userInfo;
깊은 복사
객체의 주소가 아닌 값들을 복사합니다.
때문에 값을 변경함에 있어서 자유롭습니다.
package com.example.jjapstagram_java.util;
import java.io.Serializable;
public class UserInfo implements Serializable, Cloneable {
private String userEmail;
private String userName;
private String disPlayPhotoUri;
private String userNickName;
private String userPhoneNumber;
private String userStatusMsg;
private String userGender;
public UserInfo(){}
public UserInfo(String userEmail, String userName, String disPlayPhotoUri, String userNickName,
String userPhoneNumber, String userStatusMsg, String userGender) {
this.userEmail = userEmail;
this.userName = userName;
this.disPlayPhotoUri = disPlayPhotoUri;
this.userNickName = userNickName;
this.userPhoneNumber = userPhoneNumber;
this.userStatusMsg = userStatusMsg;
this.userGender = userGender;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Cloneable 인터페이스를 구현합니다.
clone() 메소드를 재정의 합니다.
public void setmUserInfo(UserInfo userInfo) throws CloneNotSupportedException {
this.mUserInfo = (UserInfo) userInfo.clone();
}
마지막으로 이렇게 사용하면 됩니다.
출처: https://altongmon.tistory.com/897
패스트캠퍼스 강의:
'언어공부 > JAVA&SPRING' 카테고리의 다른 글
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 15회차 미션 (0) | 2020.08.24 |
---|---|
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 14회차 미션 (0) | 2020.08.23 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 12회차 미션 (0) | 2020.08.21 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 11회차 미션 (0) | 2020.08.20 |
[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 10회차 미션 (0) | 2020.08.19 |
댓글