ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL #6 - 배열 활용 (2)
    프로그래밍/TIL(국비과정) 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);
    
    	}
    
    }
    

     

    '프로그래밍 > TIL(국비과정)' 카테고리의 다른 글

    TIL #7 - 로또 프로그램  (0) 2020.04.02
    TIL #7 - 각종 출력, 입력, 조회 기능  (0) 2020.04.02
    TIL #6 - 배열 활용 (1)  (0) 2020.04.01
    TIL #5 - 배열  (0) 2020.03.31
    TIL #4 - 메소드, 배열 등  (0) 2020.03.30

    댓글

Designed by Tistory.