- 객체의 배열

이전에 배운 배열과 같으나, 객체를 배열로 만든다는 것이 차이점이다.

 

 

- 객체의 배열 만드는 법

클래스이름 참조변수 = new 클래스이름[요소의갯수];

 


객체의 배열 사용해보기!

Student 클래스를 만들고, 배열로 3개의 객체를 만들어 세팅하고 출력하기!

 

 

Student 클래스

package day06;

public class Student {
    // 학번, 이름, 전화번호, 국어점수, 수학점수, 영어점수

    private int no;
    private String name;
    private String hp;
    private int kor;
    private int math;
    private int eng;

    Student(){}

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHp() {
        return hp;
    }

    public void setHp(String hp) {
        this.hp = hp;
    }

    public int getKor() {
        return kor;
    }

    public void setKor(int kor) {
        this.kor = kor;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getEng() {
        return eng;
    }

    public void setEng(int eng) {
        this.eng = eng;
    }

    public void info() {
        System.out.println("[학번 : " +no+ ", 이름 : " +name+", 전화번호 : " + hp+ ", 국어점수 : " + kor +
                ", 수학점수 : " + math + ", 영어점수 : " + eng + ", 총점 : " + (kor+math+eng) + ", " +
                "평균 : " +(double)((kor+math+eng)/3) + "]");
    }
}

 

Oop 클래스 (main 메소드)

package day06;

public class Oop1 {
    public static void main(String[] args) {
        // 배열로 3개의 Student 객체만들고 info 출력

        // 배열선언
        Student[] student =  new Student[3];

        // 배열의 0번방 객체생성
        student[0] = new Student();
        student[0].setNo(1);
        student[0].setName("김사과");
        student[0].setHp("010-1111-1111");
        student[0].setKor(80);
        student[0].setMath(98);
        student[0].setEng(88);
        student[0].info();

        student[1] = new Student();
        student[1].setNo(2);
        student[1].setName("이메론");
        student[1].setHp("010-2222-2222");
        student[1].setKor(98);
        student[1].setMath(70);
        student[1].setEng(100);
        student[1].info();

        student[2] = new Student();
        student[2].setNo(3);
        student[2].setName("반하나");
        student[2].setHp("010-3333-3333");
        student[2].setKor(100);
        student[2].setMath(97);
        student[2].setEng(60);
        student[2].info();

    }
}

 

위 코드의 결과


- Object 클래스

java.lang.Object 에 존재하며, 모든 클래스의 최상위 클래스이다.

모든 클래스는 Object클래스의 메소드를 사용할 수 있고, 일부 메소드는 오버라이딩해서 사용한다.

Object 클래스가 들어있는 java.lang 패키지는 컴파일러에 의해 자동으로 import된다.

 

- toStiring() 메소드

객체의 해시코드(주소) 출력

패키지명.클래스명@해시코드로 출력된다.

객체의 정보를 문자열 형태로 표현하고자 할 때 오버라이딩을 해서 사용한다.

 

 

- equals() 메소드

객체의 값이 같은지 연산하는 메소드

비교연산자 (==)와 동일한 결과를 반환한다.

두 객체가 동일한 객체라면 true반환, 그렇지 않으면 false을 반환한다.

 

✔️String 객체에서의 equals() 메소드

String 객체의 주소를 비교하는 것이 아니라 String 문자열이 동일한지 비교한다.

이렇게 사용이 가능한 이유는 String 객체에서 equals()를 재정의해서 "문자열 비교"로 변경했기 때문이다.

 

 

- clone() 메소드

객체의 복사본을 만든다.

clone()은 객체를 복제할 때 private 필드도 복제하기 때문에 은닉성이라는 성질을 위배한다.

 


 

- 상속 (Inheritance)

특정 클래스를 구성 할 때 기존 클래스의 필드와 메소드를 부모 클래스에서 그대로 물려받아 중복적인 코드를 줄이는 것을 의미한다.

하나의 변수 타입으로 여러 종류의 객체를 의미하는 추상화된 방식의 프로그램을 가능하게 해준다.

부모 클래스의 private 접근제어자가 붙은 변수나 메소드의 경우에는 자식클래스에서 사용이 제한 될 수 있다.

 

부모 클래스 (parent class, super class, 상위 클래스) : 상속을 해주는 클래스

자식 클래스 (child class, sub class, 하위 클래스, 파생 클래스) : 상속을 받는 클래스

 

 

- 사용법

접근제어자 class 클래스명 extends 부모클래스 {
	...
}

 


 

- 캐스팅 (Casting)

타입을 변환하는 것  

자바의 상속 관계에 있는 부모와 자식 클래스 간에는 서로간의 형변환이 가능하다.

 

 

- 업캐스팅 ( 상속이 전제 조건)

자식 클래스가 부모클래스로 형변환 되는 것을 의미한다.

  1. 부모 타입의 객체에 자식 생성자 호출
  2. 부모타입의 객체에 자식 객체가 담고 있던 값을 대입 (자식 필드의 주소 값 대입)
  3. 부모 타입의 매개변수에 자식 객체 넘겨주기

 

 

- 다운 캐스팅 (업캐스팅이 전제조건)

부모 클래스 타입에서 다시 자식클래스로 복구 시키는 것을 의미한다.

 

부모 클래스 : Animal
자식 클래스 : Cat

class Animal {

}

class Cat extends Animal {

}

Cat cat = new Cat();
Animal animal = cat;		// 업캐스팅
Animal animal = new Cat();	// 업캐스팅
(Cat)animal				// 다운캐스팅

 

 

- instanceof 연산자

부모를 상속해서 만들어진 자식 객체가 여러 타입인 경우에 특정 클래스가 맞는지 확인하기 위해 사용하는 연산자이다.

 

참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해서 사용한다.

연산의 결과는 boolean 값으로 반환한다.

 

부모 객체 instanceof 부모 클래스 : true

자식 객체 instanceof 자식 클래스 : true

부모 객체 instanceof 자식 클래스 : false

자식 객체 instanceof 부모 클래스 : true

업 캐스팅된 객체 instanceof 부모클래스 : true

업캐스팅된객체 instanceof 자식 클래스 : true

 


과제. 

Student 클래스를 만들어 아래와 같은 프로그램을 만들어보자.
(단, 출력은 toString()을 오버라이딩해서 작성)
몇 명의 학생을 등록할까요? 3

1번째 학생의 번호를 입력하세요. 1
1번째 학생의 이름을 입력하세요. 김사과
1번째 학생의 국어점수를 입력하세요. 100
1번째 학생의 영어점수를 입력하세요. 80
1번째 학생의 수학점수를 입력하세요. 90
2번째 학생의 번호를 입력하세요. 2
...
3번째 학생의 수학점수를 입력하세요. 100

학생리스트
번호:1, 이름:김사과, 국어점수:100, 영어점수:80, 수학점수:70, 총점:250점, 평균:82
번호:2, 이름:반하나, 국어점수:100, 영어점수:80, 수학점수:70, 총점:250점, 평균:82
번호:3, 이름:오렌지, 국어점수:100, 영어점수:80, 수학점수:70, 총점:250점, 평균:82

 

Student 클래스

package day06;

public class StudentList {
    private int no;
    private String name;
    private int kor;
    private int eng;
    private int math;
    private int sum;

    private double avg;

    StudentList() {}

    public StudentList(int no, String name, int kor, int eng, int math, int sum, double avg) {
        this.no = no;
        this.name = name;
        this.kor = kor;
        this.eng = eng;
        this.math = math;
        this.sum = sum;
        this.avg = avg;
    }

    public int getNo() {
        return no;
    }

    public void setNo(int no) {
        this.no = no;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getKor() {
        return kor;
    }

    public void setKor(int kor) {
        this.kor = kor;
    }

    public int getEng() {
        return eng;
    }

    public void setEng(int eng) {
        this.eng = eng;
    }

    public int getMath() {
        return math;
    }

    public void setMath(int math) {
        this.math = math;
    }

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

    public double getAvg() {
        return avg;
    }

    public void setAvg(double avg) {
        this.avg = avg;
    }

    @Override
    public String toString() {
        return "번호 : " + no +
                ", 이름 : " + name +
                ", 국어 점수 : " + kor +
                ", 영어 점수 : " + eng +
                ", 수학 점수 : " + math +
                ", 총점 : " + sum +
                ", 평균 : " + avg;
    }
}

 

 

Oop 클래스 (main 메소드)

package day06;

import java.util.Scanner;

public class Oop2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("몇 명의 학생을 등록할까요?");
        int num = sc.nextInt();

        StudentList[] students = new StudentList[num];

        for(int i = 0; i < num; i++) {
            students = new StudentList[i];
        }

        for(int i = 0; i < num; i ++) {
            System.out.print(i+1 + "번째 학생의 번호를 입력하세요. ");
            students[i].setNo(sc.nextInt());
            System.out.print(i+1 + "번째 학생의 이름을 입력하세요. ");
            students[i].setName(sc.next());
            System.out.print(i+1 + "번째 학생의 국어점수를 입력하세요. ");
            students[i].setKor(sc.nextInt());
            System.out.print(i+1 + "번째 학생의 수학점수를 입력하세요. ");
            students[i].setMath(sc.nextInt());
            System.out.print(i+1 + "번째 학생의 영어점수를 입력하세요. ");
            students[i].setEng(sc.nextInt());

            int kor = students[i].getKor();
            int eng = students[i].getEng();
            int math = students[i].getMath();

            students[i].setSum(kor+eng+math);
            students[i].setAvg(students[i].getSum()/3.0);

        }

        System.out.println("🧑‍🎓 학생 리스트 🧑‍🎓");
        for(StudentList s : students) {
            System.out.println(s);
        }
    }
}

 학생 등록전에 for문으로 num만큼 studentList[] 생성자를 통해 students 객체를 생성해준다.

 

위 코드의 결과

 

복사했습니다!