TIL #42

loci·2024년 6월 11일
0

TIL

목록 보기
40/111

카펫

brown이 yellow를 감싸고 있는 그림의 조건을 구해 그림의 가로와 세로의 길이를 구해 반환한다.
(w + h) * 2 - 4 == brown까지는 구했는데 시간내에 풀지못해 다른 풀이를 참고했다.

  • 전체 타일의 수 w * h = S = brown + yellow
  • 전체 가로의 길이는 brown + yellow 가 h로 나누어지는 수 여야함(약수)
  • yellow는 brown에 무조건 감싸져 있으므로 yellow의 타일수는
    (h - 2) * (w - 2)

class Solution {
    fun solution(brown: Int, yellow: Int): IntArray {
        var answer = intArrayOf()
        for(h in 3..(brown+yellow)){
            if((brown + yellow) % h == 0){
                val w = (brown + yellow) / h
                if((h - 2) * (w - 2) == yellow){
                    return intArrayOf(w, h)
                }
            }
        }
        return answer
    }
}

다른코드

class Solution {
    fun solution(brown: Int, red: Int): IntArray {
        return (1..red)
            .filter { red % it == 0 }
            .first { brown == (red / it * 2) + (it * 2) + 4 }
            .let { intArrayOf(red / it + 2, it + 2) }
    }
}

코틀린 고급문법 문법 강의

기본개념

프로젝트 - 최상단개념으로 모듈, 패키지, 클래스 를 포함한다
모듈 - 프로젝트 아래의 개념 패키지, 클래스를 포함한다.
패키지 - 모듈 아래 개념으로 클래스를 포함한다. (diractory)

접근제한자

  • public : 어디서나 접근 (기본적으로 public)
  • private : 동일한 클래스 내부에서만 접근
  • internal : 같은 모듈 내부에서만 접근
  • protected : 기본적으로 private이지만 상속을 받은 경우 타 모듈에서 접근 가능

필요성

  • 데이터에 무분별한 접근을 막는다.
  • 클래스간 접근하면 안되는 상황을 구분해 유지보수에 용이해짐

예외처리의 활용

  • 프로그램이 실행되기 전에 알수있는 컴파일 에러를 오류라고 함
  • 프로그램을 실행하는 도중에 발생하는 런타임 에러는 예외발생
  • 프로그램실행도중에 예외가 발생하면 프로그램이 비정상적으로 종료(다운됨)
  • 코틀린은 Try-Catch로 예외를 처리

Try-Catch

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

Try-Catch-Finally

try {
	println("나눗셈 결과: $result")
} catch (e: ArithmeticException) {
	println("나눗셈 오류 발생: ${e.message}")
} finally {
	println("나눗셈 연산 완료")
}

finally는 예외처리에 관계없이 항상 실행되는 코드

Throw

fun method1(num1:Int) { if(num1 > 10) { throw 예외종류 } }

지연초기화

  • 코틀린은 클래스를 생성할때 안정성을 위해 변수의 값을 초기화 해야함
  • 초기값을 정의하기 난처할때 필요한 것이 지연초기화
  • 변수(var)는 lateinit, 상수(val)는 lazy를 이용해 지연초기화
  • 저사양에서 메모리를 효율적으로사용할 수 있음

lateinit

  • 선언방법
 lateinit var name: String
  • 초기화 확인
lateinit var name:String

fun displayInfo() {
	if(this::name.isInitialized) {
		println("이름은: ${name} 입니다.") 
	} else { 
		println("name변수를 초기화해주세요.")
	}
}

지연초기화를 사용한 변수가 초기화 되지 않았는데 해당 변수를 사용하면 오류가 발생한다. 그래서 this::name.isInitialized를 이용해 초기화되었는지 체크해 초기화 되었다면 사용되도록 할 수 있다.

lazy

val address: String by lazy { println("address 초기화") "seoul" }

lazy는 변경이 불가능한 값을 지연초기화 하는 것이기 때문에 초기화 값 없이는 lazy를 사용할 수 없다

널 세이프티

  • Null예외는 프로그램의 가용성을 저하시키는 치명적 오류
  • 코틀린은 자료형에 Null여부를 명시
  • Null을 다루는 다양한 키워드 지원 ? !! ?. ?:
  • 강제로 null이 아니라고 하는 !! 사용은 최대한 지양

? : null을 저장할 수 있음
!! : null이 아님을 보장
?. : null일수도있을때 null이 아닐때만 참조하는 메소드를 실행 (null이면 null이 반환됨)
?: : null일때 원하는 출력을 설정해주려 할 때 사용한다.

println("주소의 길이는: ${address?.length ?: "초기화하세요"} 입니다") 
//address가 null이면 "초기화하세요"를 출력하도록 설정
profile
편리한 개발자

0개의 댓글