JAVA-17

이강민·2021년 10월 6일
0

JAVA 기초 1

목록 보기
17/20
post-thumbnail

클래스 배열

클래스 배열은 객체를 여러개 선언해야 하는 경우 배열 타입으로 한번에 선언 후 사용한다.

클래스 배열의 선언

클래스명 [] 배열명 = new 클래스명[길이]
클래스명 [] 배열명 = {
	new 클래스명(),
    	new 클래스명2(),
        ....
  }

클래스 배열의 사용

배열명[index].필드(변수)명
배열명[index].메서드명()

클래스사용과 동일하게 항상
배열클래스명 = new 클래스명(); 으로 초기화 해야 heap메모리에 할당된다.

클래스배열 코드 작성해보기(1)

동물 클래스를 생성하고 동물의 공통 특징을 객체로 생성하여 생성자로 초기화하고 toString 값을 수정한다. 다른 종의 동물을 여러번 받아야 되니 클래스 배열을 이용해보자

편의상 패키지는 생략한다.

  1. ArInstance라는 클래스를 만들어 보자
public class ArInstance{
}
  1. Animal이라는 크래스를 만들고 변수를 만들고 기본 생성자와 생성자를 만들어 보자
class Animal{
  String name;
  int age;
  String feed;
  
  public Animal(){
  //기본생성자
  }
  
  public Animal(String name, int age, String feed){
    this.name = name;
    this.age = age;
    this.feed = feed;
  }
  
  @Override
  public String toString(){
  return "이름" +name + "\n나이 : " + age + "살\n먹이 : " + feed;
  }
}

public class ArInstance{
}
  1. 메인메소드에서 클래스 배열을 선언하고 사용해보자
    총 3번의 입력값을 받고 3마리의 동물의 이름, 나이, 먹이를 출력할 것이다.
    그러기 위해서는 길이가 3인 클래스 배열을 만들자, 또한 입력을 받아야 되니 Scanner도 필요하다.
public class ArInstance {
	public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
        //길이가 3인 Animal의 클래스 배열선언
		Animal [] arAni = new Animal[3];
        //클래스를 초기화 하지 않아서 객체를 다시 초기화 해줘야한다. 
		String name = "";
		int age = 0;
		String feed = "";
        
        //3번 반복해서 입력을 받자 
        for(int i =0; i<arAni.length; i++){
        	System.out.println(i + 1+"번 동물 이름 : ");
		name=sc.next();
            	System.out.println(name + " 나이 : ");
		age=sc.nextInt();
            	System.out.println(name + " 먹이 : ");
		feed=sc.next();
        
        	//i 마다 name, age, feed가 들어가기 위해 new로 초기화한다.
        	arAni[i] = new Animal(name, age, feed);
        }
        //위 결과를 출력한다. 
       for (int i = 0; i < arAni.length; i++) {
		System.out.println(arAni[i]);
    }   
 }

위에서 클래스배열을 선언하고 나서 반드시 입력하거나 사용하기 전에는 반드시 배열명[i]를 newfh 초기화 해줘야한다.

클래스 배열 코드 만들기(2)

가족구성원들을 적어보고 가족구성원들의 이름, 나이, 직업 순으로 출력하는 코드를 작성해 볼 것이다.
원리는 만들기(1)과 같다.

1.먼저 새로운 클래스파일을 만들고 기존 클래스 위에 클래스를 선언한다.

//새로운 클래스
class Family{
}
//아래, 최초 생성하면 자동으로 만들어지는 클래스
public class ArInstance3 {
}
  1. 가족의 공통구성인 이름, 나이, 직업을 초기화 하고 기본생성자와 생성자를 각가 만들어 준다. 생성자의 단축키는 alt+shift+o 이다.
class Family{
	String name;
    int age;
    String job;
   	
    //기본 생성자
    public Family(){
    }
    //생성자를 만들면 자동으로 만들어지는 생성자
    public Family(String name, int age, String job){
    super();
    this.name = name;
    this.age = age;
    this.job = job;
    }
}
  1. toString의 리턴값을 수정하여 따로 result를 만들어 저장공간을 아끼기 위해 초기값을 만들어 주자. (만들지 않으면 나중에 리턴을 주소값으로 리턴함.)
...생략
public String toString() {
		// TODO Auto-generated method stub
	return "이름 : " + name + "\n 나이 : "+age+"\n직업 : "+job;
}	
//위와 같이 만들면 사용하기 편리함.
  1. 메인 클래스 안에 메인메소드를 만들어 사용할 준비를 하자.
    입력을 받는 창을 만들어야 되니 Scanner로 초기화해주고 Family의 가족 구성원은 여려명이니 클래스 배열을 만들어 사용하자.
public class ArInstance3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Family [] fa = new Family[2];
     }
}
  1. 클래스 배열을 초기화 하였으니 기존 클래스에서 받아온 객체들을 다시 초기화 해주자
public class ArInstance3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Family [] fa = new Family[4];
        
        String name = "";
        int age = 0;
        Stirng job = "";
     }
}
  1. for 구문 사용하여 값들을 여러번 받도록 하는데 이때 생성한 클래스배열의 길이만큼 해주자
for (int i = 0; i < fa.length; i++) {
	System.out.println("이름 : ");
	name = sc.next();
	System.out.println("나이 : ");
	age = sc.nextInt();
	System.out.println("직업 : ");
	job=sc.next();
  1. 이렇게 하면 문제가 생기는데 클래스배열을 생성한것이지 클래스를 사용하기위한 new가 아니였다. 따라서 마지막에 클래스를 사용하기 위한 초기화가 필요하다.
    타입은 위에서 초기화 하였으니 타입은 다시 안적어도 된다.
for (int i = 0; i < fa.length; i++) {
	System.out.println("이름 : ");
	name = sc.next();
	System.out.println("나이 : ");
	age = sc.nextInt();
	System.out.println("직업 : ");
	job=sc.next();
    fa[i] = new Family(name, age, job);
  1. 마지막으로 사용하기 위해 for구문으로 fa[i]를 그대로 출력한다. result라는 저장공간 없이 바로 출력할 수 있는 이유는 toString을 재정의 하면서 이제 toString은 주소값이 아닌 각 값들을 리턴 시킬 수 있기 때문이다.
for(int i = 0; i <fa.length; i++){
	System.out.println(fa[i]);
}
  1. 지금까지 작성한 코드는 아래와 같다.
package day17;

import java.util.Scanner;

class Family{
	String name;
	int age; 
	String job;
	
	public Family() {
		// TODO Auto-generated constructor stub
	}

	public Family(String name, int age, String job) {
		super();
		this.name = name;
		this.age = age;
		this.job = job;
	}
	
@Override
	public String toString() {
		// TODO Auto-generated method stub
		return "이름 : " + name + "\n 나이 : "+age+"\n직업 : "+job;
	}	
}


public class ArInstance3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Family [] fa = new Family[4];
		
		String name = "";
		int age  = 0;
		String job = "";
		
		for (int i = 0; i < fa.length; i++) {
			System.out.println("이름 : ");
			name = sc.next();
			System.out.println("나이 : ");
			age = sc.nextInt();
			System.out.println("직업 : ");
			job=sc.next();
			fa[i] = new Family(name, age, job);
		}
		
		
		for (int i = 0; i < fa.length; i++) {
			System.out.println(fa[i]); 
            //주소값을 출력함, 결과는 저장공간에 담아서 출력해야함
	   // 단, toString return 값을 오버라이드 시키면 원하는 결과 출력가능
		}
			
	}
}
profile
AllTimeDevelop

0개의 댓글

관련 채용 정보