https://ko.javascript.info/object-copy

 

참조에 의한 객체 복사

 

ko.javascript.info

https://ko.javascript.info/array

 

배열

 

ko.javascript.info

 

알았던 것도 다시 보자!

 

상황

firstFunction() {
	let results = property(code) //[{name: "John", age: 23}] 가 있다고 가정
	...
    secondFunction(results);
}

secondFunction(records) {
	...
    thirdFunction(records);
}

thirdFunction(data) {
	...
    data.unshift({name: "Sandy", age: 25});
}

완전 같은 건 아니지만 이런 상황인 경우..

firstFunction안에서 secondFunction으로 넘겼던 results가 secondFunction을 거쳐 thirdFunction에서 파라미터로 받아져서 객체를 배열에 추가 시킨것... 즉 처음 가져왔었던 property(code)에서 가져온 원래 배열에도 추가가 된 것이다...

 

요약

객체는 참조에 의해 할당되고 복사됩니다. 변수엔 객쳊체가 아닌 메모리상의 주소인 참조가 저장됩니다. 따라서 객체가 할당된 변수를 복사하거나 함수의 인자로 넘길 땐 객체가 아닌 객체의 참조가 복사됩니다. 

그리고 복사된 참조를 이용한 모든 작업(프로퍼티 추가.삭제 등)은 동일한 객체를 대상으로 이뤄집니다. 

 

배열의 내부 동작 원리

배열은 특별한 종류의 객체입니다. 배열 arr의 요소를 arr[0]처럼 대괄호를 사용해 접근하는 방식은 객체 문법에서 왔습니다. 다만 배열은 키가 숫자라는 점만 다릅니다. 

숫자형 키를 사용함으로써 배열은 객체 기본 기능 이외에도 순서가 있는 컬렉션을 제어하게 해주는 특별한 메서드를 제공합니다. length라는 프로퍼티도 제공하죠. 그렇지만 어쨌든 배열의 본질은 객체입니다.

이렇게 배열은 자바스크립트의 일곱 가지 원시 자료형에 해당하지 않고, 원시 자료형이 아닌 객체형에 속하기 때문에 객체처럼 동작합니다.

배열은 객체와 마찬가지로 참조를 통해 복사됩니다. 

'정보 > Language' 카테고리의 다른 글

Kotlin: Functions  (0) 2023.08.02
Kotlin: Control Flow  (0) 2023.07.31
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29
import kotlin.math.PI

//Functions 함수

//함수 선언할때는 fun keyword를 사용한다.
fun hello() {
    return println("Hello, world!")
}

//x, y는 함수의 파라미터이고 Int타입. return타입 또한 Int타입.
/*fun sum(x: Int, y: Int): Int {
    return x + y
}*/
//위의 함수를 Single-expression function으로 바꾸면
fun sum(x: Int, y: Int) = x + y
//이렇게 할 수 있음. 대괄호를 없애고 할당연산자 = 를 통해 함수몸체를 선언한다. 코틀린의 type inference덕분에 return type또한 제거할 수 있다.

//Named arguments, Default parameter values
//파라미터에 이름을 붙이면 코드의 가독성이 좋아짐
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
    println("[$prefix] $message")
}

//Return이 없는 함수
fun printMessage(message: String) {
    println(message)
    // `return Unit` or `reutnr` is optional
    //함수에서 return value가 없으면 그 함수의 return type은 Unit이다. Unit은 오직 하나의 value를 갖는 type이다.
    //함수 몸체 안에 명시적으로 선언할 필요가 없다.
}

fun main() {
    hello()
    println(sum(1, 2))
    printMessageWithPrefix("Hello, world!", "Greeting")
    //named arguments를 통해 직접 할당하게 되면 파라미터의 순서를 바꿀 수 있다.
    printMessageWithPrefix(prefix = "Log", message = "Hello")
    //prefix는 default value를 주어서 파라미터를 안넘기면 기본값이 출력된다.
    printMessageWithPrefix("This is a custom message.")
    //[Info] This is a custom message.

    //return이 없는 함수
    printMessage("This function doesn't have return type.")
}


fun circleArea(radius: Int)  =  radius * radius * PI

https://kotlinlang.org/docs/kotlin-tour-functions.html#lambda-expressions

 

Functions | Kotlin

 

kotlinlang.org

 

'정보 > Language' 카테고리의 다른 글

[Javascript] Object, Array  (0) 2024.01.09
Kotlin: Control Flow  (0) 2023.07.31
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29
//Control flow
//conditional expreesions
//kotlin은 if 와 when을 조건표현으로 제공한다.
fun main() {
    //if를 사용하면 소괄호()안에 조건을 주고 tru일 경우 {}안에 코드를 실행한다.
    val d: Int
    val check = true

    if (check) {
        d = 1
    } else {
        d = 2
    }

    println(d)

    //코틀린에는 3항 연산자는 없다.
    //대신 if를 {}없이 사용할 수 있다.

    val a = 1
    val b = 2
    println(if (a > b) a else b)

    //when은 조건절인데 여러 개의 조건을 비교할 수 있다. 약간 swich같은 느낌
    val obj = "Hello"

    when (obj) {
        "1" -> println("One")
        "Hello" -> println("Greeting")
        //"Hello" -> println("Greeting2") // 이건 실행 안됨
        else -> println("Unknown")
    }
    //만족하는 분기문을 순차적으로 실행하므로 만족한 1개만 실행된다는 것에 유의.

    //when을 이용했을 때 변수에 바로 할당된다.
    val result = when (obj) {
        "1" -> "One"
        "Hello" -> "Greeting"
        else -> "Unknown"
    }
    println(result)

    //Boolean절을 여러 개 체크 하는 경우에도 유용하다.
    val temp = 18

    val description = when {
        temp < 0 -> "very cold"
        temp < 10 -> "a bit cold"
        temp < 20 -> "warm"
        else -> "hot"
    }
    println(description)

    //Ranges
    //가장 일반적으로 범위를 만드는 경우에 ..operator를 사용한다.
    //1..4 는 1,2,3,4와 같다.
    //마지막을 포함하지 않게 선언하고 싶으면 ..<를 사용한다.
    //1..<4 는 1,2,3과 같다.
    //역순으로 선언할 때는 downTo를 사용한다.
    //4 downTo 1은 4,3,2,1과 같다.
    //1이 아닌 증가량의 범위를 선언하고 싶으면 step을 사용한다.
    //1..5 step 2는 1,3,5와 같음
    //Char에서도 사용 가능하다.
    //'a'..'d'는 'a','b','c','d'와 같다.
    //'z' downTo 's' step 2는 'z', 'x', 'v', 't'이다.

    //Loops
    //가장 흔한 loop structures로 for과 while이 있음.
    //for은 반복하면서 action을 수행하는 것이고,
    //while은 특정한 조건이 만족될때까지 action을 수행함.

    //for
    //for loop를 통해 정해진 범위를 반복할 수 있음.
    for (number in 1..5) {
        print(number)
    }
    println()

    //Collection에서도 loop를 통해 반복될 수 있다.
    val cakes = listOf("carrot", "cheese", "chocolate")

    for (cake in cakes) {
        println("Yummy, it's a $cake cake!")
    }

    //while은 두 방법으로 사용될 수 있다.
    //1. 조건절이 참일 경우 실행: while
    //2. 코드블록을 먼저 실행하고 그 다음에 조건절을 체크한다.: do-while
    var cakesEaten = 0
    var cakesBaked = 0
    while (cakesEaten < 3) {
        println("Eat a cake")
        cakesEaten++
    }
    do {
        println("Bakes a cake")
        cakesBaked++
    } while (cakesBaked < cakesEaten)

}

https://kotlinlang.org/docs/kotlin-tour-control-flow.html

 

Control flow | Kotlin

 

kotlinlang.org

 

Exercise 3 Fizz buzz game

fun main() {
    for(number in 1..100){
        val result = when {
            number % 3 == 0 && number % 5 == 0 -> "fizzbuzz"
            number % 3 == 0 -> "fizz"
            number % 5 == 0 -> "buzz"
            else -> number
        }
        println(result)
    }
}

'정보 > Language' 카테고리의 다른 글

[Javascript] Object, Array  (0) 2024.01.09
Kotlin: Functions  (0) 2023.08.02
Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29

https://kotlinlang.org/docs/kotlin-tour-hello-world.html

 

Hello world | Kotlin

 

kotlinlang.org

Top level 선언

main 함수 밖 선언 및 할당.

문자열 template

Kotlin 변수 : var, val 

//변수는 main함수 바깥에서 선언될 수 있는데, 이런 경우에는 top level에 선언되었다고 한다.
val value = 10
//value = 20 //val로 선언했기 때문에 이 후에 재할당이 불가하다.
var variable = 20
//var variable2 //선언만 하면 안되고 초기화까지해야한다.

//fun 으로 function을 선언한다.
fun main() {
    println("Hello, world!")
    println(value)

    variable = 30
    println(variable)

    val customers = 10
    //String templates
    //그냥 해당 값만 출력할거면 $변수명 으로
    println("There are $customers customers")
    //값을 수정한다면 ${}를 사용한다.
    println("There are ${customers + 1} customers")
}

//read-only variables with val 변하지않는 값
//mutable variables with var 할당 후 변할 수 있는 값을 담는 곳
//공식문서에서는 모든 변수를 val로 선언하고 할당 후 변할 수 있는 값은 var로 선언할 것을 추천함.

 

'정보 > Language' 카테고리의 다른 글

Kotlin: Functions  (0) 2023.08.02
Kotlin: Control Flow  (0) 2023.07.31
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29
JavaScript가 뭔가요 ?  (0) 2022.01.17

 

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable

https://docs.oracle.com/javase/8/docs/api/

 

Java Platform SE 8

 

docs.oracle.com

Object를 상속받고 Map<K, V>인터페이스를 구현한 추상클래스 AbstractMap.

 

HashMap은 Map<K, V>, Cloneable, Serializable 인터페이스를 구현하고 AbstractMap<K, V>를 상속받은 클래스이다.

 

더보기

인터페이스와 추상클래스 >>

Hash table이라는 자료구조를 가지고 있다. 

java.util.Hashtable는 동기화를 지원하고, 키, 값에 null을 넣을 수 없지만, java.util.HashMap은 동기화를 지원하지 않고 키, 값에 null을 넣을 수 있다. 

순서가 없다.

기본 연산인 get, put은 해쉬함수를 통해 elements들을 buckets에 넣고 가져오고, 이러한 연산에는 일정한 성능을 보인다. 

HashMap안에 있는 요소들을 보기위한 iteration 성능이 중요하다면 처음 capacity를 (the number of buckets) 너무 크거나 적게 주지 않는 것이 중요하다. -> HashMap 인스턴스의 capacity와 key-value 매핑된 수의 크기의 비례하는 시간을 필요로 하므로.

HashMap은 2개 파라미터를 인스턴스로 갖는데, initial capacity와 load factor은 성능에 영향을 미친다. capacity는 hash table이라는 자료 구조에서 쓰이는 buckets의 수를 말하고, 해당 파라미터의 initial capacity는 hash table이 생성될 시의 capacity를 말함.또 다른 파라미터 load factor은 capacity가 자동으로 증가되기 전에 hash table이 얼마나 차있는지 측정한다.  load factor와 현재 capacity의 곱의 수가 hash table을 초과하면, rehash되고(내부 데이터구조가 다시 재정립되는 것), hash table은 대략 2배의 buckets을 갖게된다.

 

일반적으로 기본 load factor(.75)은 시간과 공간비용 측면에서 적절한 밸런스를 제공한다. 더 큰 값은 공간 오버해드는 줄여주지만 찾는 비용이 늘어난다. (get, put을 포함한 대부분의 operation에 영향을 끼침.) 

따라서 2개의 인스턴스인 initial capacity와 load factor의 값 설정시 rehash operation을 최소화 하기 위해 고려해야한다. load factor로 개체의 최대 개수(데이터 입력할 최대개수)를 나눴을 때 initial capacity가 더 크면 rehash는 일어나지 않는다.-> HashMap의 인스턴스에 많이 저장되야 되면 처음 생성할 때 부터 init capacity를 크게 주면 rehash하지 않아도 되니까 더 효율적일 수 있다.

많은 키를 사용할 때 같은 hashCode()를 사용하는 것은 성능에 좋지 않다. 영향을 개선시키기 위해 키가 Comparable클래스 일 때 comparison order를 사용하면 키들 간의 연결을 끊을 수 있다. // 이 부분은 무슨 말을 하고 싶은지 몰겠음.

 

동기화를 지원하지 않는 클래스이다. Collenctions.synchronizedMap을 통해 감싸(wrapped)져서 동기화(멀티쓰레드 환경)에 안전하게 사용할 수 있음. 

Map m = Collections.synchronizedMap(new HashMap(...));

만약 다른 쓰레드에서 바꾸면 ConcurrentModificationException을 날림. 

 

 

 

https://developer.mozilla.org/ko/docs/Learn/JavaScript/First_steps/What_is_JavaScript

 

JavaScript가 뭔가요? - Web 개발 학습하기 | MDN

MDN의 JavaScript 초급자 과정에 오신 걸 환영합니다! 이 글은 JavaScript를 넓게 보면서 "뭔가요?", "뭘 하나요?"와 같은 질문을 답변하고, 여러분이 JavaScript에 친숙해지도록 도와드립니다.

developer.mozilla.org

위 사이트를 보고 개인적으로 정리하는 게시글입니다.

 

자바스크립트는 주기적으로 내용이 갱신되는 기능이나 능동적인 지도, 변화하는 2D/3D 그래픽, 동영상 등을 웹페이지에 적용할 수 있게 하는 스크립트 혹은 프로그래밍 언어입니다.

동적으로 컨텐츠를 바꾸고, 멀티미디어를 다루고, 움직이는 이미지 그리고 다른 일들을 할 수 있는 스크립트 언어이다.

 

Browser API는 웹 브라우저에 설치된 API들로, 컴퓨터 환경구성으로 부터 데이터를 보이게 하고 복잡한 일들을 하게 한다.

DOM (Document Object Model) API 는 동적으로 페이지의 스타일을 정하는 등 HTML과 CSS를 알맞게 조정하는 역할을 한다.

Geolocation API는 지리적인 정보를 검색하게 해준다. 

Canvas 와 WebGL API는 2D와 3D 그래픽을 만들 수 있도록 한다.

HTMLMediaElement와 WebRTC 같은 Audio and Video API는 음악과 비디오를 웹 페이지 상에서 재생하고, 웹캠으로 캡처하고 다른 컴퓨터에 표시하는 등의 멀티미디어를 활용할 수 있는 재미있는 기술을 지원한다.

 

Third party API 는 브라우저에 기본적으로 설치된 API가 아닌 인터넷에서 개인적으로 정보와 코드를 얻어 프로그래밍한 것을 말한다.

 

브라우저에서 웹페이지를 불러올 때, 실행 환경(브라우저 탭)안에서 HTML, CSS, Javascript 코드가 실행된다. 

자바스크립트는 HTML과 CSS가 결합되고 웹페이지 상에서 올려진 후, 브라우저의 자바스크립트 엔진에 의해 실행된다. 즉, 페이지의 구조와 스타일등을 정해놓고 자바스크립트가 실행된다는 의미.

 

브라우저에서 자바스크립트를 만났을 때 일반적으로 위에서 아래 순서대로 실행된다. (주의해서 코드를 작성해야 한다는 의미!)

 

해석형 언어와 컴파일러형 언어 ?

자바스크립트는 해석형 언어이다. 따라서 코드가 위에서 아래로 순차적으로 실행되고 그 즉시 결과가 반환된다. 브라우저에서 동작하기 전에 다른 방식으로 코드를 변환할 필요가 없다.

반면 컴파일러형 언어는 컴퓨터에 의해 동작되기 전 다른 형식으로 변환하는 언이이다. 예를 들면, C/C++과 같은 언어는 어셈블리어로 컴파일되어 동작된다.

 

서버측 코드와 클라이언트측 코드 ?

클라이언트측 코드란 사용자의 컴퓨터에서 작동되는 코드이다. 웹페이지를 보고자한다면, 클라이언트측 코드가 사용자의 컴퓨터로 다운로드되고 브라우저가 이를 표시한다. 이러한 자바스크립트 모듈을 정확히는 클라이언트측 자바스크립트라고 한다.

 

반면, 서버측 코드는 서버에서 작동되고 그 결과가 사용자의 브라우저에 넘어가 표시된다. PHP, Python, Ruby, ASP.NET등이 서버측 웹 언어의 대표적 예. 물론 자바스크립트도 Node.js란 환경을 통해서 서버측에서 자바스크립트가 사용 가능하다.

 

동적이라는 말은 클라이언트측 서버측 언어 모두를 가르킨다. 서버측 코드는 데이터베이스로부터 데이터를 던지는 등 동적으로 새로운 컨텐츠들을 만든다. 반면에, 클라이언트 측 자바스크립트는 새로운 HTML 표를 만들어 서버에서 요청한 데이터를 뿌려 사용자에게 보이는 등 동적으로 브라우저 안에서 작동된다. 

'정보 > Language' 카테고리의 다른 글

Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29
BufferedReader / BufferedWriter 클래스 알아보기  (0) 2022.01.05
JavaScript : substr /substring 확실히 알아두기  (0) 2022.01.02

우선 버퍼에 대해 알아보자.

https://www.google.com/search?q=buffer&oq=buffer&aqs=chrome..69i57j69i59i433i512j0i512l5j69i61.3195j0j7&sourceid=chrome&ie=UTF-8 

 

buffer - Google 검색

Buffer is an intuitive social media management platform trusted by brands, businesses, agencies, and individuals to help drive social media results.

www.google.com

구글 검색 시

데이터를 한 곳에서 다른 한 곳으로 전송하는 동안 일시적으로 그 데이터를 보관하는 메모리의 영역. 이라고 한다.

버퍼링이란 버퍼를 활용하는 방식, 버퍼를 채우는 동작을 말한다.

 

 

Java Platform SE 8

 

docs.oracle.com

에서 검색해서 찾아보았다. 

 

우선

BufferedReader 클래스의 경우 문자입력으로부터 text를 읽어오는 클래스이다. 문자들을 버퍼에 채워서 문자, 배열 그리고 줄들을 효과적으로 읽도록 제공하는 클래이다.

 

BufferedWriter 클래스의 경우

text를 문자 출력으로 써주는 클래스이다. 문자, 배열 그리고 문자열등을 효율적으로 글쓰도록 도와주기 위해 버퍼에 채울때 사용하는 클래스이다.

 

 

백준에서 문제를 풀 때 썼던 클래스인데, Scanner 클래스를 이용하면 시간초과가 나올 수 있으니까 사용하라고 한 클래스였다. 대충 들어보긴했는데 자세히는 잘 모르겠어서 읽어보았다.

'정보 > Language' 카테고리의 다른 글

Kotlin : Hello, world!  (0) 2023.07.20
Enum을 사용한 메뉴관리  (0) 2022.08.26
java.util.HashMap  (0) 2022.07.29
JavaScript가 뭔가요 ?  (0) 2022.01.17
JavaScript : substr /substring 확실히 알아두기  (0) 2022.01.02

+ Recent posts