본문으로 바로가기

[Java] 자바 객체 배열 (java로 웹개발하기)(day13)

category Java/Java 2021. 8. 11. 15:59
반응형

 

 

이전 포스팅에서는 자바의 객체에 대해서 다뤄봤습니다.

 

객체, 생성자, 필드, 메서드, 객체 예제 등등 여러 가지를 알아보았는데요.

 

 

이번 포스팅에선 객체의 배열에 대해서 다뤄보고자 합니다.

 

 

 

 

 

 

 

먼저 객체 배열이란,,

 

 

객체를 저장하는 배열로,

배열의 자료형을 클래스명(사용자 정의 자료형)으로 지정하여 활용됩니다.

 

 

 

 

 

 

그림으로 보면 위와 같습니다.

 

 

상단의 배열

일반 정수형 배열 변수 intArr을 생성하고, 그 크기는 5만큼 지정해주었는데요.

 

 

하단 배열

정의된 Example객체에 대해 exArr이라는 객체 배열을 생성하고, 그 크기는 5만큼 지정해 주었습니다.

 

 

하나의 객체 자체를 배열의 인덱스로 본 것이죠.

 

 

 

 

 

 

 

 

 

 

 

 

객체 배열 선언은 위와 같습니다.

 

일반 자료형의 배열 선언과 다른 점이 딱히 없죠.

 

자료형 부분에 클래스명을 적어주는 차이만 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

할당은 선언과 같이 

 

자료형을 적는 부분에 클래스명을 적어주고 크기를 설정해줍니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이런 식으로

선언과 동시에 할당도 가능합니다.

 

 

 

 

 

 

 

 

 

 

 

 

이렇게 위와 같이 

 

생성과 동시에 할당 및 초기화가 가능합니다.

 

 

 

 

 

 

 

 

 

 

 

그러면 객체 배열은

메모리 상에서 어떻게 참조가 되고 있느냐,,

 

 

 

 

위를 보면 일반 배열의 참조와 유사합니다.

 

 

차이점은

 

 

일반 배열동일한 자료형으로만 이루어져 있어

heap에 선언된 자료형 크기로 배열을 이루고 있지만,

 

객체 배열다른 자료형들(String, double, int 등등)로 이루어질 수 있기에

각기 다른 자료형 크기로 배열이 이루어져 있습니다.

 

 

 

 

 

 

 

 

 

그럼 본격적으로 객체 배열의 예제를 풀어봅시다.

 

 

 

객체 배열은 앞서 풀어보았던 객체의 예제 풀이를 활용하여 풀어보겠습니다.

 

 

 

 

 

 

 

 


자바 객체 배열  예제


 

 

 

 

 

난이도 ★★☆

 

 

 

예제 1

 

 

Q : 다음 작성된 클래스를 보고 요구사항에 따라 Sample1 클래스를 완성시켜라.

     (모두 같은 패키지에 작성하라)

 

 

  ● 과목과 점수의 정보가 있는 Subject 클래스가 있다.


       // 사용자 입력을 받아서 과학 과목과 점수 85를 입력받아서 배열의 마지막 인덱스에 추가
       // 단, 점수의 경우 0 ~ 100 사이의 입력이 아니면 계속 입력받을 수 있게 한다.

       // 단, 이미 입력된 과목이 있으면 다시 과목명을 입력받는 반복으로 돌아간다.
 

 

 

 

 

과목과 점수의 정보가 있는 Subject 클래스

public class Subject {
	private String name;
	private int jumsu;
	
	public Subject() {}
	
	public Subject(String name) {
		this.name = name;
	}
	
	public Subject(String name, int num) {
		this.name = name;
		this.jumsu = num;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setJumsu(int num) {
		if(this.dblGrade[this.dblGrade.length - 1] <= num && num <= this.dblGrade[0]) {
			this.jumsu = num;
		} else {
			this.jumsu = -1;
		}
	}
	
	public int getJumsu() {
		return this.jumsu;
	}
	
	public boolean isValid() {
		return this.jumsu == -1 ? false : true;
	}
	
}

 

 

 

 

완성시켜야 할 Sample class

public class Sample1 {

	public void ex1() {
		Subject subjects[] = new Subject[3];
		subjects[0] = new Subject("국어",70);
		subjects[1] = new Subject("영어",80);
		subjects[2] = new Subject("수학",90);

		// 사용자 입력을 받아서 과학 과목과 점수 85를 입력받아서 배열의 마지막 인덱스에 추가
		// 단 점수의 경우 0 ~ 100 사이의 입력이 아니면 계속 입력 받을 수 있게 한다.
		
	}
	
	public static void main(String[] args) {
    	ex1();
    }

 

 

 

 

 

 

 


 

 

 

 

풀이 :

 

 

 

public class Sample1 {

	public void ex1() {
		Subject subjects[] = new Subject[3];
		subjects[0] = new Subject("국어",70);
		subjects[1] = new Subject("영어",80);
		subjects[2] = new Subject("수학",90);

		// 사용자 입력을 받아서 과학 과목과 점수 85를 입력받아서 배열의 마지막 인덱스에 추가
		// 단 점수의 경우 0 ~ 100 사이의 입력이 아니면 계속 입력 받을 수 있게 한다.
		System.out.println("===현재 입력된 과목의 정보===\n");
		for(int i=0; i<subjects.length; i++) {
			System.out.println(subjects[i].getName() + " 점수 : " +
								subjects[i].getJumsu());
			System.out.println("등급 : " + subjects[i].getGrade());
		}
		System.out.println("\n========================");
		
		int count=0;
		while(true) {
			System.out.print("추가할 과목을 입력 : ");
			String sub = sc.nextLine();
			
			// for each 문
			for(Subject s: subjects) {
				if(sub.equals(s.getName())) {
					count++;
				}
			}
			

			
			if(count > 0) {
				System.out.println("이미 입력된 과목명이 있습니다.\n");
				count = 0;
				continue;
			}
			
			if(sub.equals("종료")) {
				System.out.println("\n ===과목 입력을 종료합니다.===");
				break;
			}else {
				Subject copysub[] = new Subject[subjects.length+1];
				System.arraycopy(subjects, 0, copysub, 0, subjects.length);
				subjects = copysub;
			}
			
			while(true) {
				System.out.print("추가한 과목에 점수 입력 : ");
				int jumsu = sc.nextInt();  sc.nextLine();
				if(jumsu < 0 || jumsu > 100) {
					System.out.println("점수 0부터 100사이 입력\n");
					continue;
				}else {
					subjects[subjects.length-1] = new Subject(sub,jumsu);
					break;
				}
			}
		
		}
		
		// for each문
		for(Subject s: subjects) {
			System.out.println(s.getName()+ " 점수 : " + s.getJumsu());
			System.out.println("등급 : " + s.getGrade());
		}
		
		
//		for(int i=0; i<subjects.length; i++) {
//			System.out.println(subjects[i].getName() + " 점수 : " +
//								subjects[i].getJumsu());
//			System.out.println("등급 : " + subjects[i].getGrade());
//		}
//		System.out.println();
		
	}
	
	public static void main(String[] args) {
    	ex1();
    }

 

 

 

 

 

 


 




 

 

 

 

 

 

난이도 ★★☆

 

 

 

예제 2

 

 

Q : 아래 생성된 클래스들을 보고 Student 클래스에서 요구되는 메서드들을 작성하여라.

※ 클래스들을 모두 같은 패키지에 작성한다.

 

 

● 요구사항

 

   1. subjects 객체 배열에 과목을 추가하는 addSubject메소드
   
   2. subjects 객체 배열에 저장된 과목들의 총합을 구하는 total메소드


   3. subjects 객체 배열에 저장된 과목들의 평균을 구하는 avg메소드

   4. subjects 객체 배열에 저장된 과목의 점수를 반환하는 getSubjectJumsu메소드
      단, 과목 이름으로 검색하여 반환할 수 있게 한다.(없는 이름이면 -1 반환)

   5. subjects 객체 배열에 저장된 과목의 이름을 반환하는 getSubjectName메소드
      단, 위치 값으로 과목명을 반환할 수 있게 한다. (잘못된 index 번호를 사용하면 null 반환)

 

 

 

 

 

Subject(과목 이름과, 점수를 품은 클래스)

public class Subject {
	private String name;
	private int jumsu;
	
	public Subject() {}
	
	public Subject(String name) {
		this.name = name;
	}
	
	public Subject(String name, int num) {
		this.name = name;
		this.jumsu = num;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	public String getName() {
		return this.name;
	}
	
	public void setJumsu(int num) {
		if(this.dblGrade[this.dblGrade.length - 1] <= num && num <= this.dblGrade[0]) {
			this.jumsu = num;
		} else {
			this.jumsu = -1;
		}
	}
	
	public int getJumsu() {
		return this.jumsu;
	}
	
	public boolean isValid() {
		return this.jumsu == -1 ? false : true;
	}
	
}

 

 

 

 

Student(학생의 정보와, 학생이 수강한 과목들을 품는 클래스)

public class Student {
	private String name;
	private String gender;
	private int age;
	private Subject[] subjects;
	private int index;
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
		this.subjects = new Subject[index];
	}

	public String getName() {
		return this.name;
	}

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

	public String getGender() {
		return this.gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return this.age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	// subjects 객체 배열에 과목을 추가한다.
	public void addSubject(Subject sub) {
	
	}
    
    
	// subjects 객체 배열에 저장된 과목들의 총합을 구한다.
	public int total() {
		
	}
	
	// subjects 객체 배열에 저장된 과목들의 평균을 구한다.
	public double avg() {
		
	}
	
	// subjects 객체 배열에 저장된 과목의 점수를 반환한다.
	// 과목 이름으로 검색하여 반환할 수 있게 한다.(없는 이름이면 -1 반환)
	public int getSubjectJumsu(String subjectName) {
		
	}
	
	// subjects 객체 배열에 저장된 과목의 이름을 반환한다.
	// 위치값으로 과목명을 반환할 수 있게 한다. (잘못된 index 번호를 사용하면 null 반환)
	public String getSubjectName(int index) {
		
	}
}

 

 

 

 

 

실행을 할 main메소드가 담긴 sapmle1 클래스

public class Sample1 {
  public static void main(String[] args) {
          Student std = new Student("홍길동", 30);

          // 과목추가
          Subject sub = new Subject("국어", 70);
          std.addSubject(sub);

          sub = new Subject("영어", 70);
          std.addSubject(sub);

          sub = new Subject("과학", 90);
          std.addSubject(sub);

          System.out.println(std.getName() + " 학생의 총점은 " + std.total());

          System.out.println(std.getName() + " 학생의 국어 점수는 " + std.getSubjectJumsu("국어"));
          System.out.println(std.getName() + " 학생의 사회 점수는 " + std.getSubjectJumsu("사회"));

          System.out.println(std.getName() + " 학생의 2번째 위치의 과목은 " + std.getSubjectName(1));

      }
}

 

 

 

 

 

 

 


 

 

 

 

 

 

풀이 :

 

 

 

요구사항을 충족시킨 Student 클래스

public class Student {
	private String name;
	private String gender;
	private int age;
	private Subject[] subjects;
	private int index;
	
	static Scanner sc = new Scanner(System.in);
	
	public Student(String name, int age) {
		this.name = name;
		this.age = age;
		this.subjects = new Subject[index];
	}

	public String getName() {
		return this.name;
	}

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

	public String getGender() {
		return this.gender;
	}

	public void setGender(String gender) {
		this.gender = gender;
	}

	public int getAge() {
		return this.age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public void addSubject(Subject sub) {
		Subject copySub[] = new Subject[this.subjects.length+1];
		System.arraycopy(this.subjects, 0, copySub, 0, this.subjects.length);
		copySub[copySub.length-1] = sub;
		this.subjects = copySub;
		
		for(Subject s: this.subjects) {
			System.out.print(s.getName() + ":" + s.getJumsu() + ",");
		}
		System.out.println();
	
	}
	
	public int total() {
		int sum = 0;
		for(Subject s: this.subjects) {
			sum += s.getJumsu();
		}
		return sum;
	}
	
	// subjects 객체 배열에 저장된 과목들의 평균을 구한다.
	public double avg() {
		return (double)this.total() / this.subjects.length;
	}
	
	// subjects 객체 배열에 저장된 과목의 점수를 반환한다.
	// 과목 이름으로 검색하여 반환할 수 있게 한다.(없는 이름이면 -1 반환)
	public int getSubjectJumsu(String subjectName) {
		int count = -1;
		

		for(int i=0; i<this.subjects.length; i++) {
			if(subjectName.equals(this.subjects[i].getName())) {
				count = i;
			}
		}
		
		if(count==-1) {
			return -1;
		}else {
			return subjects[count].getJumsu();
		}
		
	}
	
	// subjects 객체 배열에 저장된 과목의 이름을 반환한다.
	// 위치값으로 과목명을 반환할 수 있게 한다. (잘못된 index 번호를 사용하면 null 반환)
	public String getSubjectName(int index) {
		if(index < 0 || index > subjects.length-1) {
			return null;
		}else {
			return this.subjects[index].getName();
		}
	}
}

 

public class Sample1 {
  public static void main(String[] args) {
          Student std = new Student("홍길동", 30);

          // 과목추가
          Subject sub = new Subject("국어", 70);
          std.addSubject(sub);

          sub = new Subject("영어", 70);
          std.addSubject(sub);

          sub = new Subject("과학", 90);
          std.addSubject(sub);

          System.out.println(std.getName() + " 학생의 총점은 " + std.total());

          System.out.println(std.getName() + " 학생의 국어 점수는 " + std.getSubjectJumsu("국어"));
          System.out.println(std.getName() + " 학생의 사회 점수는 " + std.getSubjectJumsu("사회"));

          System.out.println(std.getName() + " 학생의 2번째 위치의 과목은 " + std.getSubjectName(1));

      }
}

 

 

 

 

 

 

실행결과

 

 

 


 

 

 

 

 

 

 

 

 

이상 java의 객체 배열 실습 문제를 마치겠습니다.

 

 

 

 

 

 

다음 포스팅에선 java 상속에 대해 다뤄보고자 합니다.

https://healthdevelop.tistory.com/entry/java14


 

[Java] 자바 상속 | java 상속 예제 | toString | Override (java로 웹개발하기)(day11)

이전 포스팅에서 자바의 객체 배열에 대해서 다뤄봤습니다. 이번 포스팅에서는 객체지향 프로그래밍에서 중요한 자바의 상속에 대해서 다뤄보고자 합니다. 일반적으로 상속이라 하면,, 부모와

healthdevelop.tistory.com

 

반응형