동기 프로그래밍 (sync)  vs 비동기 프로그래밍 (async)

비동기 프로그래밍에 대해서 알기 위해선 우선 동기 프로그래밍이 뭔지 먼저 알아야 한다.

 

동기적 프로그래밍은 "순서대로 하나의 작업씩 수행하는 행위"를 의미한다. 단순 반복하는 기계처럼

1 시작 1 끝

2 시작 2 끝

3 시작 3 끝 

................

이런 방식은 순차적으로 작업을 진행하기에 앞선 작업에 필연적으로 영향을 받을 수 밖에 없다.

즉, 1이 시작해서 안끝나면 그 뒤에 작업들은 1이 끝날 때까지 기다릴 수 밖에 없다.

 

이제 일상생활에서의 예를 가지고 이해해보자.

아침에 일어나서 따뜻한 우유와 빵을 같이 먹는다고 가정해보자.

 

그렇다면 해야할 일을 나열해보자.

 

침대정리

냉장고에서 우유꺼내기

머그컵에 우유 붓기

우유가 담긴 머그컵 전자레인지에 넣고 1분 돌리기

(따뜻해진 우유)전자레인지에서 꺼내기

식빵 자르기

잼 바르기

먹기

 

이 일련의 과정을 동기식으로 한다면 위와 똑같을 것이다.

다만, 비동기식으로 한다면 

 

침대정리

냉장고에서 우유꺼내기

머그컵에 우유 붓기

우유가 담긴 머그컵 전자레인지에 넣고 1분 돌리기

식빵 자르기

잼 바르기

(따뜻해진 우유)전자레인지에서 꺼내기

먹기

 

즉, 전자레인지에 요청을 보내놓고 끝날 때까지 기다렸다가 다음 일을 하느냐 아니면 다른 일을 하고 있다가 요청에 대한 결과가 나오면 이어서 일을 하느냐 차이다.

 

그렇다고 이런 동기적 프로그래밍 방식이 비효율적이라는 것은 아니다. 만약 A가 끝나야지만 B가 실행되어야하는

로직의 프로그램이 있다면 동기적으로 처리해야 바람직하게 작동할 것이다. 여기서는 우유를 꺼내오지도 않고 머그컵에 우유를 부으려는 행위가 비유에 맞을거 같다.

 

여기서 알 수 있듯이, 비동기 프로그래밍은 꼭 동기적으로 실행하지 않아도 되는 기능을 보완하기 위해 나온 것을 볼 수 있다. 우유가 다 따뜻해질때까지 굳이 앞에서 아무것도 안하고 기다릴 필요가 없는 것처럼,,

 

비동기 프로그래밍은 요청을 보내놓고 결과값을 받을 때까지 또 다른 일을 수행할 수 있게 즉, 멈추지 않고 계속 일을 할 수 있게끔 프로그래밍해주는 것이다.

Scope Function

자기 자신의 객체를 전달해서 효율적인 처리를 한다.

  Scope에서 접근방식 this Scope에서 접근방식 it
블록 수행 결과를 반환 run, with let
객체 자신을 반환 apply also

 

let function  

// let
var strNum = "10"

    var result = strNum?.let {
        // 중괄호 안에서는 it으로 활용함
        Integer.parseInt(it)
    }

 

 

run function & with function

+ run은 with와 달리 null 체크 가능

+ with는 반드시 null이 아닐 때만 사용 + this생략해서 사용 가능

    // run
    var student = Student("참새", 10)
    student?.run {
        displayInfo()
    }
    
    // with
    var alphabets = "abcd"
    with(alphabets) {
//    	var result = this.subSequence(0,2)
      	var result = subSequence(0,2)
      	println(result)
    }

 

also function & apply function

// also
    var student = Student("참새", 10)
    var result = student?.also {
        it.age = 50
    }
    result?.displayInfo()
    student.displayInfo()
    
// apply
    var student = Student("참새", 10)
    var result = student?.apply {
        student.age = 50
    }
    result?.displayInfo()
    student.displayInfo()

 

https://school.programmers.co.kr/learn/courses/30/lessons/132267

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

아침부터 머리가 안돌아가서 푸는데 40분 걸렸다,, 풀고보니 간단한 문제였다..

 

class Solution {
    fun solution(a: Int, b: Int, n: Int): Int {
        var answer: Int = 0
        var quotient = 0
        var remainder = 0
        var newCola = 0
        var emptyCola = n
        
        while(emptyCola>=a) {
            quotient = emptyCola/a
            remainder = emptyCola%a
            
            newCola = (quotient * b)
            answer += newCola
            
            emptyCola = newCola + remainder
            newCola = 0
        }
        return answer
    }
}

 

while 문을 통해서 빈 병 개수가 최소요구 개수보다 클 때만 코드가 진행되도록 만들었다.

quotient 와 remainder로 몫과 나머지를 따로 빼서 새 병을 얻을 때와 빈 병 개수 처리에 쓸수 있도록 해줬다.

 

상빈이 그 자체인 분이 계셨다,, 완벽한 인라인 코딩,, 다른 분의 코드를 가져와봤다.

class Solution {
    fun solution(a: Int, b: Int, n: Int): Int {
        return (if (n > b) n - b else 0) / (a - b) * b
    }
}

분석해보고 싶으나 머리가 못 따라가겠다,, 다음에 다시오마,,,

문자열을 숫자로 변환해주는 기능

var strNum1 = "10"         // 정수 문자열
var strNum2 = "10.21"      // 실수 문자열

var num1 = Integer.parseInt(strNum1)      //정수 문자열 "10"을 정수 10으로 변환
var num2 = strNum2.toDouble()             //실수 문자열 "10.21"을 실수 10.21로 변환

 

2개 이상의 값을 리턴해주는 기능

fun 메서드명(): Pair<타입, 타입> {     // 반환값 2개
	var 변수명 = Pair("감동란", "맥반석")
    return 변수명
}


fun 메서드명(): Triple<타입, 타입, 타입> {      // 반환값 3개
	var 변수명 = Triple("감동란", "맥반석", 25)
    return 변수
}

 

Single-exprossion function 람다식을 이용한 메소드 간결 정의

var add = {num1:Int, num2:Int -> num1+num2}         //람다 기본구조 변수처럼 이용

fun add(num1:Int, num2:Int) = (num1+num2)           //메소드처럼 이용

 

지연 초기화

클래스 설계할 때 초기의 값을 정의하기 난처하거나 저사양으로 제한되어있는 환경에서 메모리를 효율적으로 사용하려고 할 때 주로 사용된다.

 

lateinit var 변수명 : 타입

 .isInitialized를 통해 값이 초기화되었는지 boolean형태인 true/false로 초기화 여부를알 수 있다.

사용할 때는 값이 아니라 참조형태로 사용해야하기 때문에 this::을 붙인다

if(this::변수명.isInitialized) {
	
}

val 상수명 by lazy {}

lateinit var 변수명 : 변수타입

val 상수명 by lazy {초기화}

 

 


Null Safety

Null Exception 

 

var 변수명:String? = null   // ? 변수가 null일 수 있을 때 null을 갖을 수 있게끔 해준다.

${변수명?.length}       // ?. 변수가 null이 아니라면 length를 반환하고 null일 경우 null을 반환한다.

${변수명?.length ?: "초기화하세요"}    // ?: 앨비스 연산자 null 일 경우 뒤에 문장 실행

 

+ Recent posts