프로그래밍/TIL(국비과정)

TIL #6 - 배열 활용 (2)

양아무개 2020. 4. 1. 20:18

# list vs set vs map

자바에서는 여러가지 '무리' 를 만드는 방법들이 있다. 

무리란, 똑같은 데이터타입이 모여있는 것이고 Collection이라고도 한다. 

1) list

배열과 가장 비슷하다. 

입력한 순서대로 들어가게 된다 

중복값 입력이 가능하다 

예시) 

0~9번의 중복값이 존재하는 int 배열 {1, 2, 3, 3, 1, 2, 4, 5, 6, 6}

2) set

내가 입력한 순서대로 들어가지 않을 수도 있다. 

중복값은 허용되지 않는다 

예시 ) 0~9번의 중복값을 허용하지 않는 int 배열

3) map

맵은 위의 list와 set과는 다르게 index 번호로 관리하는게 아니라 key-value 구조로써 

우리가 key값을 주면 그것과 일치하는 value값을 준다. 

중복된 키는 허용되지 않는다. 

예시 ) {"1학년", 38}, {"2학년", 40}

 

 

# 학생 이름, 국어, 영어, 수학 점수 여러개 받기 

과연 2세대 언어에서는 이 문제를 어떻게 해결했을까? 

>>구조체(Struct)라는 것으로 해결했다. 

구조체란 그들이 직접 데이터타입을 만드는데 그 데이터타입은 작은 데이터타입의 모음집이었다. 

 

지금같은 경우에는 학생이란 커다란 데이터타입을 하나 만들어 그 안에 이름이라는 스트링, 국어점수 int, 수학점수 int, 영어점수 int를 가지고 있게 만든다. 

 

C에서 구조체를 만드는 방법은 아래와 같다 

typedef {

   들어갈 데이터의 종류들

} 구조체 이름

 

하지만 자바에서는... 못만든다!

좀 더 자세하게 말하자면 다른 개념에 흡수되었다고 한다. 

자바에서는 구조체와 해당 구조체가 가지고 있어야 할 기능을 다 합쳐서 '클래스' 라고 부른다. 

필드와 메소드로 구성되어 있는 클래스를 우리가 메소드 없이 필드만 만들어주면 

구조체처럼 쓸 수 있지 않을까 하는 생각을 할 수도 있다. 

Student.java


public class Student {
	// 여기저기서 써야하니까 public
	public String name; 
	public int kor;
	public int math;
	public int eng;
	
}

StructEx.java


import java.util.Scanner;


// 구조체의 배열
public class StructEx {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		
		Student[] students = new Student[3];
	
		for(int i = 0; i < students.length; i++) {
			// 연결할 주소를 가진 Student s를 하나 만들어준다 
			Student s = new Student();
			
			System.out.print("이름 : ");
			String name = scan.next();
			System.out.print("국어 : ");
			int kor = MyScanner.nextInt(scan);
			System.out.print("수학 : ");
			int math  = MyScanner.nextInt(scan);
			System.out.print("영어 : ");
			int eng = MyScanner.nextInt(scan);
			// 입력받은 애들 s에 담아서 배열에 차례대로 넣어주면 된다. 
			
			s.name = name;
			s.kor = kor;
			s.math = math;
			s.eng = eng;
			students[i] = s; // 이 배열안에 입력받은 정보들을 넣는다. 
			
		}
		for(Student s : students) {
			System.out.printf("%s: %03d점\t %03d점\t %03d점\n", s.name, s.kor, s.math, s.eng);
		}
		scan.close();

	}

}

 구조체 배열 만들기는 어렵지 않다. 

일반 배열처럼 데이터타입[] 배열이름 = new 데이터타입[크기] 해주면 된다. 

그렇다면 학생 구조체의 데이터타입은 Student가 되는 것이다. 

 

구조체 배열을 만들어 주고 

배열에 값을 넣을 땐 모든 요소에 대해 new Student를 실행시켜줘야한다. 

상당히 귀찮은 작업이니 입력할 때 마다 임시로 s라는 Student 변수를 만들어 

거기에 값을 넣고 나서 이후에 student[i]에 s를 넣어주자. 

즉 연결할 주소를 가진 student 객체를 하나 만들어 부르는 것이다. 

 

입력을 다 받으면 마지막에 students[i] = s; 로 s의 입력값들을 students 배열에 넣는다. 

다른 클래스에서 사용할 때도 마찬가지로 객체를 생성해 메모리에 자리를 확보해주어야한다. 

public class StructEx2 {

	public static void main(String[] args) {

		Student s = new Student();
		s.name = "양아무개";
		s.kor = 80;
		s.math = 100;
		s.eng = 30;
		
		System.out.println("이름 : " + s.name);
		System.out.println("국어점수 : " + s.kor);
		System.out.println("수학점수 : " + s.math);
		System.out.println("영어점수 : " + s.eng);

	}

}