2023.11.29(수) TIL

quinones·2023년 11월 29일

오늘은 본캠프2주차 강의영상중, 문법4주차 영상을 시청하며 문법에 대해 더 자세히 알아보았다.

접근제한자

자주 사용되는 두가지만 집중적으로 공부 하려고 한다.
public: 명시하지 않으면 기본적으로 public이다. 어디서든 접근가능하다.
private: 동일한 클래스 내부에서만 접근할 수 있다.

예외처리

프로그램 실행도중에 예외가 발생하면 프로그램이 비정상적으로 종료된다. 이때 발생하는 예외상황에 대해 처리를 해줘야 한다.
나는 try-catch를 이용할 예정이다.

fun method1() {
		try {
			예외가 발생할 가능성이 존재하는 코드
		} catch(예외종류) {
			예외가 발생했을때 처리할 코드
		}
}

이런식으로 원래 작성했던 부분을 try{}로 묶어주고, 나머지 예외상황에 대해서는 catch로 묶어주면 된다.

ex)

		while(true) {
        try {
            var num1 = readLine()!!.toInt()
            println("내가 입력한 숫자는 ${num1}입니다")
            break
        } catch(e:java.lang.NumberFormatException) {
            println("숫자를 입력하세요")
        }
    }

num1에 숫자를 입력받아 출력하려고 한다. 여기서 숫자대신 다른 문자같은게 입력됐다면 catch부분이 출력되고, 다시 try부분으로 돌아와서 숫자를 입력받는다. 만약 숫자를 입력 받았다면 break로 while문의 반복을 빠져나온다.

지연초기화

지연초기화는 저사양으로 제한되어있는 환경에서 메모리를 더욱 효율적으로 사용할 수 있다는 장점이 있다. 사용 방법은 변수 var앞에 lateinit을 붙여주면 된다. 상수val에 대해서는 address라는 상수가 주어진다면

val address:String by lazy{}

이런식으로 뒤에 lazy를 붙여주면 된다.

널 세이프티

NULL예외는 프로그램의 가용성을 저하시키는 오류이다. 이런상황을 위해 자료형에 NULL여부를 명시할 수 있는데,?,!!,?.,?: 이렇게 4가지 종류가 있다.

!!는 절대 null값이 아니라고 사용자가 직접 보장해주는 방식으로, 웬만하면 사용해주지 않는것이 좋다.

?.키워드는 '전 호출연산자' 라고도 불리는데, Null이 아닐때만 참초하는 메소드를 실행하도록 작성해준다. 간단한 예로 들면,

println("주소의 길이는: ${address?.length} 입니다")

여기서 만약 address가 null이라면, "주소의 길이는: null입니다"라고 출력될것이고, address가 "서울"이라면 "주소의 길이는: 2입니다"가 출력될것이다.

만약 여기서, null로 출력되는것을 막고싶다면 ?:키워드인 엘비스 연산자를 사용해주면 된다.

 println("주소의 길이는: ${address?.length ?: "초기화하세요"} 입니다")

이렇게 사용해주면 되고, 만약 null이라면 "주소의 길이는: 초기화하세요 입니다"라고 출력될것이다. 위와 마찬가지로 address="서울"이라는 값이 들어있었다면, "주소의 길이는: 2입니다"가 출력될것이다.

배열

배열을 사용하면 원하는 값들을 묶어서 효율적으로 코드를 작성할 수 있다.

fun main() {
    var kors = arrayOf(90, 94, 96)
    for((idx, kor) in kors.withIndex()) {
        println("${idx}번째 국어 점수는 ${kor}입니다")
    }
}

이런식으로 90,94,96이라는 값이 들어있는 kors배열을 선언해주면, for문을 이용해서 각 값들의 인덱스값과 벨류값을 가져올 수 있다.

컬렉션

컬렉션은 개발에 유용한 자료구조를 제공한다.
컬렉션에는 List, Map, Set 3가지가 있는데, List는

var scores1 = listOf(값1, 값2, 값3)
var scores2 = mutableListOf(값1, 값2, 값3)
scores2.set(인덱스, 값)
var scores3 = ArrayList<자료형>(값1, 값2, 값3)
scores3.set(인덱스, 값)

이런식으로 앞으 mutable이 붙어있지않다면 수정이 불가능한 형태로, 붙어있다면 언제든 수정이 가능한 형태로만들 수 있다.

Map은 키와 값의 쌍으로 이루어진 자료형이다. List와마찬가지로 읽기전용과 수정가능한 종류로 구분 가능한데,

    var scoreInfo1 = mapOf("kor" to 94, "math" to 90, "eng" to 92)
    println(scoreInfo1["kor"])
    
    var scoreInfo2 = mutableMapOf("kor" to 94, "math" to 90)
    scoreInfo2["eng"] = 92
    println(scoreInfo2["eng"])
    
    for((k,v) in scoreInfo2) {
        println("${k}의 값은 ${v}입니다")
    }

""안에 key값을, to ~에서 to뒤에는 value값을 넣어서 선언해줄 수 있다. mutable을 붙여주면 수정이 가능해지고, 마찬가지로 for문을 이용해서 각 값들에 대한 키값과 벨류값을 가져올 수 있다.

Set은 중복을 허용하지 않고 데이터를 관리할 수 있는 자료형이다. 다른 컬렉션 요소들은 요소를 찾는데에 집중했다면, Set은 요소가 존재하는지에 집중한다.

	var birdSet = setOf("닭", "참새", "비둘기")
    println("집합의 크기는 ${birdSet.size} 입니다")

    var findBird = readLine()!!

    if(birdSet.contains(findBird)) {
        println("${findBird} 종류는 존재합니다.")
    } else {
        println("${findBird}는 존재하지 않습니다.")
    }

contains()함수를 이용해서 해당값이 존재하는지 확인할 수 있다.

	// 귀여운 새의 집합
    var birdSet = setOf("닭", "참새", "비둘기", "물오리")

    // 날수있는 새의 집합
    var flyBirdSet = setOf("참새", "비둘기", "까치")

    // 모든 새의 집합 (합집합)
    var unionBirdSet = birdSet.union(flyBirdSet)

    // 귀엽고 날수있는 새의 집합 (교집합)
    var intersectBirdSet = birdSet.intersect(flyBirdSet)

    // 귀여운 새들중에서 날수없는 새의 조합 (차집합)
    var subtractBirdSet = birdSet.subtract(flyBirdSet)

이런식으로 두개의 set집합을 union을 이용해서 합집합을 구할수도 있고, intersect를 이용해서 교집합을 구할수도 있고, subtract를 이용해서 차집합또한 구할 수 있다.

람다식

람다식은 하나의 메소드를 간결하게 표현할 수 있는 방법이다. 사용방법의 예시로

var add = {num1: Int, num2: Int, num3: Int -> (num1+num2+num3) / 3}
println("평균값은 ${add(10,20,30)}입니다")

add변수를 람다식을 이용해서 변수들의 평균을 구해줄 수 있다.

오늘 공부한 문법내용은 앞으로, 알고리즘 문제를 풀던, 코틀린을 이용해서 앱 개발을 하던 어떤 방식으로든 많이 사용될거같은 내용들이였고, 잊지않고 기억하기 위해서 자세하게 공부했던것 같다.

profile
이우진

2개의 댓글

comment-user-thumbnail
2023년 11월 29일

오늘도 고생하셨어요~👍👍

답글 달기
comment-user-thumbnail
2023년 11월 29일

화이팅입니다~!

답글 달기