Kotlin 문법 종합반 #4下. 배열과 컬렉션

·2024년 6월 12일
0

배열과 컬렉션

배열과 컬렉션은 요소들의 모임입니다
[ a , b, c ] 처럼 연속적인 데이터를 기록할 수 있습니다

  • 가장 단순한 형태는 배열 Array 입니다
    • 언제든 요소를 수정 가능합니다
    • 한번 배열을 만들면, 크기 변경이 불가능합니다
  • 배열을 제외한 모든 컬렉션 List, Map, Set은 아래 두가지 특징을 가집니다
    • 기본적으로 요소 수정이 불가능한 "읽기 전용" 입니다
    • 언제든 배열의 크기를 변경할 수 있습니다

1. 배열 (array)

  • 여러 데이터를 순서 (index)와 함께 기록합니다
  • 수정이 가능하고, 크기는 변경할 수 없습니다

배열 생성하기

arrayOf( a, b, c )

var 동물 = arrayOf("개","닭","소")

arrayOf( )에 요소를 담아서 변수에 할당했습니다

개별 출력하기

변수명 [ index ]

print (" ${ 동물[0] } ")
결과 → 개 출력

동물[2] = "호랑이"
결과 → index 2번칸 "호랑이"로 대입

동물[3] = "하이에나"
결과 → 오류. index 3번칸은 사용 불가
  • 변수명에 대괄호 [ index ] 로 해당 순서의 요소를 출력하거나, 변경합니다
  • index는 0부터 0, 1, 2.. 로 카운트합니다

전체 출력하기

Arrays.toString(변수명)

Arrays.toString(동물)
결과 → [ 개 , 닭 , 소 ]
  • 배열 전체를 출력하기 위해, 별도의 코드 Arrays.toString()를 사용합니다
  • 이를 위해 외부 패키지에 있는 Arrays() 클래스를 불러와야 합니다

Arrays() 클래스 불러오기

import java.util.Arrays

2. 배열이 아닌 컬렉션

2-1. 리스트 (list)

  1. 개 , 1. 닭 , 2. 소
  • 순서 (index)와 함께 데이터를 기록합니다.

2-2. 집합 (set)

개, 닭, 소 (순서 없음)

  • index 없이, 집합의 개념으로 데이터를 기록합니다

2-3. 맵 (map)

국어. 88점, 수학. 93점

  • index없이, 키 (key)와 함께 데이터를 기록합니다

컬렉션 생성하기

  • 기본적으로 수정이 불가능한 "읽기 전용" 입니다

listOf ( a, b, c )

var 동물 = listOf<String> ( "개" , "닭" , "소" )
  • <자료형>을 입력해 리스트를 안정적으로 관리할 수 있습니다

setOf ( a, b, c )

var 동물 = setOf ( "개", "닭", "소" )

mapOf ( "A" to 1 , "B" to 2 )

var 성적표 = mapOf<String, Int> ( "국어" to 78 , "영어" to 95 )
  • "~" to 의 형태로 key와 value를 함께 입력합니다
  • 자료형을 명시할 땐 <key자료형, value자료형>으로 2번 입력합니다

가변형 컬렉션 생성하기

mutableListOf ( a , b , c )

var 동물 = mutableListOf( "개" , "닭" , "소" )
  • mutable을 붙이면 요소를 수정할 수 있는 "가변형 컬렉션"이 됩니다

arrayListOf ( a , b , c )

var 동물 = arrayListOf ( 개 , 닭 , 소 )
  • mutable과 동일한 기능입니다

컬렉션 출력하기

개별 출력하기 : [ index ] 또는 [ key ]

동물 [1]
성적표[국어] = 98
  • 변수명에 대괄호 [ index ] 로 해당 순서의 요소를 출력하거나, 변경합니다
  • Map 컬렉션은 대괄호 안에 key를 붙여서 호명합니다

전체 출력하기

print ( 로또번호 )

출력 :: [ 32, 21, 44, 12, 4, 5 ]
  • 배열 array과 달리, "변수명" 만 입력해도 컬렉션 전체가 출력됩니다

3. 컬렉션의 활용

.set( 인덱스 , 값 )

var name = mutableListOf( 용현, 현정 )

name.set(2, 민호)
  • 해당 순서에 값을 대입합니다
  • 변수 [ 인덱스 ] = 값 과 기능이 동일합니다
  • 비어있는 index에도 값을 새로 대입할 수 있습니다

.add ( 값 )

var name = mutableListOf( 용현, 현정 )

name.add(민호)
  • 다음 순서에 값을 새로 대입합니다
  • index를 별도로 호명할 필요가 없어요!

.joinToString()

var name = mutableListOf( 용현, 현정 )

프린트 ㅣ name.joinToString()
출력 → [ 용현, 현정 ] 
  • 컬렉션 전체를 출력합니다
  • Arrays.toString(변수명) 과 기능이 동일합니다
  • 괄호 속에 separator, pre/postfix 를 추가해 커스터마이징 할 수 있습니다

.size()

name.size()
결과 → 2
  • 컬렉션의 크기를 확인합니다

.contains(확인단어)

if ( name.contains(현정) ){
	return ""
}
  • 확인 단어의 포함 여부를 true, false로 뱉습니다

4. for문 활용

for ( 매개변수 in 컬렉션 )

for ( _name in name) {
	println (_name)
}
  • 모든 데이터를 하나씩 순회하며 출력합니다

.withIndex()

for ( (index,_name) in name.withIndex) {
	println (" ${_name}는 {index+1}번이야 ")
}
  • .withIndex( )를 사용하면
    (인덱스, 값) 형태로 for 문을 작성할 수 있습니다

.indices

for ( index in name.indices) {
	println (" ${name[index]}는 {index+1}번이야 ")
}
  • .indices를 사용하면 값 없이 인덱스만으로 for 문을 구성합니다.
  • 값이 필요해지면 [index] 순서를 지정해서 값을 불러옵니다

맵 컬렉션의 for문

for ( (key, value) in 성적표 ) {
	println (" ${key} 과목은 ${value} 점이네 "}
}
  • 맵 컬렉션은 ( 키, 값 ) 형태로 for문을 작성할 수 있습니다

5. set 컬렉션 집합문

set은 순서 없이, 집합을 확인하기 위해 사용하는 컬렉션입니다

.union() 합집합

var A집합 = setOf( 1, 2, 3)
var B집합 = setOf( 3, 4, 5 )

var 합 = A집합.union(B집합) // [ 1, 2, 3, 4, 5 ]

.interest() 교집합

var 교 = A집합.interest(B집합) // [ 3 ]

.subtract() 차집합

var 차 = A집합.subtract(B집합) // [1, 2]

6.class와 컬렉션의 유기적 활용

class 학생정보 (이름, 국어, 수학, 영어){

var 변수선언
init {this.변수 = 파라미터 대입}

fun 성적표전달() {
println(이름과 점수...)
}

}

이름, 국어/수학/영어점수 :: 파라미터 → 프로퍼티로 받아옴
성적표전달() :: 메서드

이렇게 구성된 클래스가 있습니다

fun mian() {

var 학생들_리스트 = mutableListOf<Student클래스>()

이 리스트는 <Student 클래스>만 받습니다

  • <자료형> 칸에 클래스를 넣으면, 해당 클래스의 "인스턴스"만 취급하는 리스트가 됩니다
  • 아직 리스트는 ( ) 비어있습니다
for (inedx in 0..2){
	var 이름, 국어, 수학, 영어 = readLine()!!
    
    var 학생_인스턴스 = Student (이름, 국어, 수학, 영어)
    학생들_리스트.add(학생_인스턴스)
}

[학생추가] 입력받은 값을 인스턴스로 등록하고, 리스트에도 추가합니다

  • readLine으로 받은 값을
    → Strudent클래스의 파라미터에 대입해서 "인스턴스"를 만듭니다
  • .add(인스턴스)로 학생들_리스트에 추가합니다
var 평균값_맵 = mutableMapeOf<String, Int>()

for (inedx in 0..2){
	var 이름, 국어, 수학, 영어 = readLine()!!
    
	var 평균 = (국어+영어+수학)/3
	평균값_맵 [이름] = 평균
}

" 이름, 평균 " 으로 구성된 평균값_맵을 구축합니다

  • 빈 맵을 만듭니다
  • 입력받은 성적으로 "평균"을 구합니다
  • [key]에 입력받은 "이름"을,
    = value 에 계산한 "평균"을 입력하면
    " [이름] 값 " 조합으로 map에 새로운 요소가 등록됩니다
for ( A in 학생들_리스트) {

    A.성적표전달()

	var 평균 = 평균값_맵[A.이름]
	println (" ${평균}이 평균점수 ")

}

[성적전달] for 문으로 리스트를 돌며, A의 class 함수와 map 값을 뽑아냅니다

  • for문으로 모든 학생들 리스트를 순회합니다. (A에는 현재 순회중인 인스턴스가 대입됩니다)
  • A.성적표전달() 으로, class 속 해당 학생의 "성적표전달()" 메서드를 동작합니다
  • 맵[A.이름] 으로, map 속 해당 학생의 "평균"을 찾아냅니다
  • 앞서 찾아낸 "평균" 변수를 println 합니다

아니 이거 너무 어려운데요................
리스트를 클래스랑 섞어 쓰는 게 어딨어.....

profile
디자이너의 개발 창업 도전기

0개의 댓글