배열 복사하기
배열 복사하는 방법 하나는 기존 배열과 배열 길이가 같거나 더 긴 배열을 만들고 for문을 사용하여 각 요소 값을 반복해서 복사하는 방법, 둘 System.arraycopy() 메서드를 사용하는 방법이 있음
System.arraycopy(src, srcPos, dest, destPos, length)
src 복사할 배열 이름
srcPos 복사할 배열의 첫 번째 위치
dest 복사해서 붙여 넣을 대상 배열 이름
desPos 복사해서 대상 배열에 붙여 넣기를 시작할 첫 번째 위치
length src에서 dest로 자료를 복사할 요소 개수
package arrary;
public class ArrayCopy {
public static void main(String[] args) {
int[] array1 = {10,20,30,40,50};
int[] array2 = {1,2,3,4,5};
System.arraycopy(array1, 0, array2, 1, 4);
//System.arraycopy(array1, 0, array2, 0, 0);
// (복사할 배열, 복사할 첫위치, 대영 대상, 붙여 넣은 첫위치, 복사할 요소 개수)
for(int i = 0; i < array2.length; i++) {
System.out.println(array2[i]);
}
}
}
array1에서 array2로 요소 값을 복사, array1 배열의 요소 0부터 4개를 복사해서 대상 배열 array2의 요소 1부터 붙여넣는다
복사할 대상 배열의 전체 길이가 복사할 요소 개수보다 작다면 오류가 발생
객체 배열 복사하기
package arrary;
public class ObjectCopy1 {
public static void main(String[] args) {
Book[] bookArray1 = new Book[3];
Book[] bookArray2 = new Book[3];
bookArray1[0] = new Book("수학의 정석", "홍성대");
bookArray1[1] = new Book("하늘과 바람과 별과 시", "윤동주");
bookArray1[2] = new Book("소나기", "황순원");
System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
for(int i = 0; i < bookArray2.length; i++) {
bookArray2[i].show();
}
}
}
얕은 복사
package arrary;
public class ObjectCopy2 {
public static void main(String[] args) {
Book[] bookArray1 = new Book[3];
Book[] bookArray2 = new Book[3];
bookArray1[0] = new Book("수학의 정석", "홍성대");
bookArray1[1] = new Book("하늘과 바람과 별과 시", "윤동주");
bookArray1[2] = new Book("소나기", "황순원");
System.arraycopy(bookArray1, 0, bookArray2, 0, 3);
for(int i = 0; i < bookArray2.length; i++) {
bookArray2[i].show();
}
bookArray1[0].setBookName("나무"); //bookArray1 배열의 요소값 책 이름 변경
bookArray1[0].setAuthor("박완서"); //bookArray1 배열의 요소값 책 저자 변경
System.out.println("bookArray1");
for(int i = 0; i < bookArray1.length; i++) {
bookArray1[i].show();
}
System.out.println("bookArray2");
for(int i = 0; i < bookArray2.length; i++) {
bookArray2[i].show(); //bookArray2 배열 요소 값도 변경되어 출력
}
}
}
객체 배열의 요소에 저장된 값은 인스턴스 자체가 아니고 인스턴스의 주소 값이기 때문에 배열이 복사됨.
따라서 객체 배열을 복사할 때 인스턴스를 따로 생성하는 게 아니라 기존 인스턴스의 주소 값만 복사함.
결국 두 배열의 서로 다른 요소가 같은 인스턴스를 가리키고 있으므로 복사되는 배열의 인스턴스 값이 변경되면
두 배열 모두 영향을 받음
깊은 복사
객체 배열을 복사하면 항상 인스턴스 주소가 복사됨.
인스턴스를 따로 관리하고 싶다면 직접 인스턴스를 만들고 그 값을 복사해야 함
package arrary;
public class ObjectCopy3 {
public static void main(String[] args) {
Book[] bookArray1 = new Book[3];
Book[] bookArray2 = new Book[3];
bookArray1[0] = new Book("수학의 정석", "홍성대");
bookArray1[1] = new Book("하늘과 바람과 별과 시", "윤동주");
bookArray1[2] = new Book("소나기", "황순원");
bookArray2[0] = new Book(); //디폴트 생성자로 bookArray2 배열 인스턴스 생성
bookArray2[1] = new Book(); //디폴트 생성자로 bookArray2 배열 인스턴스 생성
bookArray2[2] = new Book(); //디폴트 생성자로 bookArray2 배열 인스턴스 생성
for(int i = 0; i < bookArray1.length ; i ++) {
bookArray2[i].setBookName(bookArray1[i].getBookName());
bookArray2[i].setAuthor(bookArray1[i].getAuthor());
} //bookArray1 배열 요소를 새로 생성한 bookArray2 배열 인스턴스에 복사
for(int i = 0; i < bookArray2.length; i++) {
bookArray2[i].show();
}
bookArray1[0].setBookName("나무"); //bookArray1 첫 번째 배열 책 이름 수정
bookArray1[0].setAuthor("박완서"); //bookArray1 첫 번째 배열 책 저자 수정
System.out.println("bookArray1");
for(int i = 0; i < bookArray1.length ; i++) {
bookArray1[i].show();
}
System.out.println("bookArray2");
for(int i = 0; i < bookArray2.length ; i++) {
bookArray2[i].show();
}
}
}
복사할 배열에 인스턴스를 따로 생성한 후 요소 값을 복사.
복사한 배열 요소는 기존 배열 요소와 서로 다른 인스턴스를 가리키며 기존 배열의 요소 값이 변경되어도 영향을 받지 않음
향상된 for문과 배열
for(변수 : 배열)
{ 반복 실행문;
}
배열 요소 값을 순서대로 하나씩 가져와서 변수에 대입함
package arrary;
public class EnhancedForLoop {
public static void main(String[] args) {
String[] sa = {"HTML", "CSS", "java", "DB", "Cloud"};
for(String study : sa) {
System.out.println(study);
}
}
}
다차원 배열
이차원 이상으로 구현한 배열
이차원배열
자료형[][] 배열이름 = new 자료형[행 개수][열 개수];
ex)
int[][] a = new int[2][2]; → 2행 2열
int[][] b = new int[2][3]; → 2행 3열
package arrary;
public class TwoDimensionArray {
public static void main(String[] args) {
int[][] array = {{1,2,3,},{7,8,9}}; //배열 선언과 동시에 초기화
for(int i = 0; i < array.length; i++) {
for(int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
위의 코드에 아래 코드를 추가해주면 이차원 배열의 길이를 출력할 수 있다.
System.out.print(array.length+"행 ");
System.out.print(array[0].length+"열");
ArrayList 클래스
만약 기존 배열에서 배열 길이를 변경해야할 일이 있다면 배열 요소 위치를 변경해야하는데,
이 과정은 요소가 많으면 많을수록 몹시 힘든 일이 될 것이다.
그래서 사용하는 것인 ArrayList 클래스이다.
ArrayList 클래스는 객체 배열을 관리할 수 있는 멤버 변수와 메서드를 제공함
ArrayList 클래스의 주요 메서드
boolean add(E e) : 요소 하나를 배열에 추가. E는 요소의 자료형을 의미
int size() : 배열에 추가된 요소 전체 개수를 반환
E get(int index) : 배열의 index 위치에 있는 요소 값을 반환
E remove(int index) : 배열의 index 위치에 있는 요소 값을 제거하고 그 값을 반환
boolean isEmpty() : 배열이 비어 있는지 확인
ArrayList 클래스 활용
ArrayList를 사용하는 기본 형식
ArrayList<E> 배열이름 = new ArrayList<E>();
※<E> 제네릭 자료형을 이야기함
package arrary;
import java.util.ArrayList; //ArrayList 클래스 import
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Book> library = new ArrayList<Book>(); //ArrayList 선언
//add() 메서드로 요소 값 추가
library.add(new Book("하늘과 바람과 별과 시", "윤동주"));
library.add(new Book("소나기", "황순원"));
library.add(new Book("토지", "박경리"));
library.add(new Book("광장", "최인훈"));
//배열에 추가된 요소 개수만큼 출력
for(int i = 0; i < library.size(); i++) {
Book book = library.get(i);
book.show();
}
System.out.println("-----------");
for(Book book : library) {
book.show();
}
}
}
배열 응용 프로그램
package arrary;
//Subject 클래스 구현
public class Subject {
//Subject 클래스의 멤버 변수
private String name; //과목이름
private int scorePoint; //과목 점수
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getScorePoint() {
return scorePoint;
}
public void setScorePoint(int scorePoint) {
this.scorePoint = scorePoint;
}
}
package arrary;
import java.util.ArrayList;
//Student 클래스 구현
public class Student {
//Student 클래스의 멤버 변수
int studentID;
String studentName;
ArrayList<Subject> subjectList; //ArrayList 선언
//생성자
public Student(int studentID, String studentName) {
this.studentID = studentID;
this.studentName = studentName;
subjectList = new ArrayList<Subject>();//ArrayList 생성
}
//학생이 수강하는 과목을 subjectList 배열에 하나씩 추가하는 메서드
public void addSubject(String name, int score) {
Subject subject = new Subject(); //Subject 생성
subject.setName(name); //과목 이름 추가하기
subject.setScorePoint(score); //점수 추가하기
subjectList.add(subject);
}
public void showStudent() {
int total = 0;
for(Subject s : subjectList) {
total += s.getScorePoint(); //총점 더하기
System.out.println(studentName + "의 " + s.getName() + "과목 성적은 "
+ s.getScorePoint());
}
System.out.println(studentName + "의 총점은 " + total);
}
}
package arrary;
//학생 성적 출력
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student(1,"김");
s1.addSubject("WEB", 100);
s1.addSubject("Java", 50);
Student s2 = new Student(2,"이");
s2.addSubject("WEB", 70);
s2.addSubject("Java", 60);
s2.addSubject("DB", 80);
System.out.println("김의 점수");
s1.showStudent();
System.out.println("이의 점수");
s2.showStudent();
}
}
상속과 다형성
상속
클래스의 상속
상위 클래스 A, 하위 클래스 B.
A 클래스가 B 클래스에게 상속한다., B 클래스가 A 클래스에게 상속받는다.
상위 클래스는 super calss, base class, parent class, 하위 클래스는 subclass, derived class, child class로 표현
상위 클래스
↑
하위 클래스
클래스 간 상속을 표현할 때는 위와 같이 표현. 상속받는 클래스(하위 클래스)에서 상속하는 클래스(상위클래스)로
화살표가 이동.
상속을 구현할 때는 extends 예약어를 사용
A가 가지고 있는 속성 및 기능을 추가로 확장하여 B 클래스에 구현함.
class B extends A{
}
B 클래스가 A클래스를 상속받는다.
상속 클래스가 하위 클래스보다 일반적인 개념이고, 하위 클래스는 상위 클래스보다 구체적인 클래스가 됨
'KDT > Java' 카테고리의 다른 글
231218 Java (0) | 2023.12.18 |
---|---|
231214 Java (0) | 2023.12.14 |
231211 Java (0) | 2023.12.11 |
231207 Java (0) | 2023.12.07 |
231206 Java (0) | 2023.12.06 |