//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
import { useState, useRef } from 'react';

function Ref() {
    const { text, setText } = useState('');
    const textRef = useRef();
    // == 는 String Type을 비교한다.
    // === 는 object type을 비교한다. ===를 쓸 것!
    const handleChange = (e, option) => {
        if (option === 1) {
            textRef.current.value = e.target.value;
            setText(e.target.value);
        } else if (option === 2) {
            setText(textRef.current.value);
        }
    }

    return (
        <div>
            <input type="text" value={text} onChange={(e) => handleChange(e, 1)} />
            <br />
            <textarea
                rows={5}
                cols={30}
                ref={textRef}
                onChange={(e) => handleChange(e, 2)}
            ></textarea>

            <button>Ref Info</button>
        </div>
    )
}

onChange에 화살표 함수를 꼭 써야하는 경우에는 이렇게 매개변수를 통해 또 다른 조작을 해야할 경우이다. 

만약 (e) => handleChange(e, 2)가 없으면 해당 이벤트가 정상 동작하지 않음.

 

useRef 를 import하면 직접적으로 돔요소를 건들여야할 때 쓰이는 ref를 통해 이름을 달 수 있다.

 

https://vmpo.tistory.com/66

 

MSSQL 프로시저 테이블 검색하기 (특정 테이블 내용이 포함된 프로시저 찾기)

MSSQL에서 내가 원하는 내용이 포함된 프로시저를 찾는 쿼리 입니다. %와 %사이에 원하는 내용을 입력하시면 됩니다. 예를 들어 특정 테이블 명이 포함된 프로시저를 찾을때 유용합니다. SELECT OBJEC

vmpo.tistory.com

위의 게시글을 참고함.

SELECT OBJECT_NAME(OBJECT_ID),
		OBJECT_DEFINITION(OBJECT_ID)
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%테이블이름%'

%% 사이에 원하는 테이블이름을 넣으면, 해당 테이블이름을 포함하고 있는 SP를 반환해준다.

 

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://gabii.tistory.com/entry/Git-Git-Bash-%ED%95%9C%EA%B8%80-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

[Git] Git Bash 한글 설정하기

이번 포스팅은 Windows에서 Git을 사용하기 위한 Git Bash의 한글 설정을 해보겠습니다. 혹시 Git Bash 설치하는 법이 궁금하신 분들은 아래 포스팅을 먼저 참고해주시면 됩니다. 2018/09/27 - [Program/Install]

gabii.tistory.com

위 게시글 참고 해서 고침

 

Java도 인코딩 다 UTF-8로 설정했는데, 자꾸 git bash 에서 깨져서 나와서 왜그러지 싶었는데,

Local Character set을 eucKR 로 해야지 한글이 나온다.

 

cmd 창에서도 자꾸 한글이 깨져서 자바 프로그램이 실행되서,

(인코딩도 모두 UTF-8로 했는데)

 

레거시 콘솔 사용 에 체크를 주고 실행했더니

한글이 잘 나온다. why..??

https://answers.microsoft.com/ko-kr/windows/forum/all/cmd-%ED%95%9C%EA%B8%80%EA%B9%A8%EC%A7%90/f757fe37-7c1f-456f-9692-3f2133f420bf

이것은 위 게시글 참고했음.

 

 

API란?
API는 어떤 서버의 특정한 부분에 접속해서 그 안에 있는 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구이다. API를 이용하면 두 개의 소프트웨어가 서로 통신을 주고받을 수 있다.

REST API?
네트워크를 통해서 컴퓨터들끼리 통신할 수 있게 해주는 아키텍처 스타일이다.

인터넷 식별자(URI)와 HTTP 프로토콜을 기반으로 한다.
HTTP프로토콜 덕분에 단순함이 핵심이다.
클라이언트-서버 모델로 구축되었다는 것을 의미.
웹에 최적화되어있고 주로 JSON을 사용해 브라우저들 간에 호환성이 좋다. 

- 사용하기 쉽다.
- 배우기 쉽다.
- SOAP는 모든 메시지에 XML을 사용하지만 REST는 JSON을 주로 사용해 가볍다.
- 빠르다.


SOAP API?
그 자체로 프로토콜이며, 보안이나 메시지 전송 등에 있어서 REST보다 더 많은 표준들이 정해져 있기 때문에 복잡하다. 이러한 표준들로 오버헤드가 많지만 보안, 트랜잭션 등을 준수해야 하는 종합적인 기능이 필요한 조직에게는 적합한 방식이다. (기업용 애플리케이션 작업에 이상적) 데이터 포맷으로 XML만을 사용한다.
SOAP 표준에는 성공/반복 실행 로직이 규정되어 있기 때문에 SOAP API를 통해서 통신을 할 때 처음부터 끝까지 신뢰성을 제공한다.

- 언어, 플랫폼, 전송 독립적 (REST는 HTTP가 필요)
- 분산된 기업환경에 적합 (REST는 직접적인 point-to-point 통신)
- 표준화
- WS 표준에 따라 전처리 확장성을 제공한다.
- 빌트인 에러 다룬다.



REST와 SOAP는 각기 다른 두 가지의 온라인 데이터 전송 방식입니다. 둘 다 웹 애플리케이션 간 데이터 통신을 허용하는 애플리케이션 프로그래밍 인터페이스(API)를 구축하는 방법을 정의합니다. REST는 아키텍처 원칙 세트이고, SOAP은 W3c에서 유지관리하는 공식 프로토콜입니다.

REST
1. REST는 웹 서비스와 모바일 애플리케이션 경량화의 필요에 맞춘 아키텍처 원칙 세트.
2. 데이터 요청이 전송될 때 HTTP를 통해 이루어진다. 요청을 수신하면 REST용으로 설계된 API가 HTML, XML, 일반 텍스트, JSON과 같은 다양한 형식으로 메시지를 반환할 수 있다.
JSON은 어떠한 프로그래밍언어로든 읽을 수 있고, 인간과 기계 모두 읽을 수 있고, 경량화되어있기 때문에 선호되는 메시지 형식이다.

RESTful 애플리케이션이 갖춰야 할 요소
1. 클라이언트, 서버, 리소스로 구성된 클라이언트-서버 아키텍처가 필요하다.
2. 요청이 통과하는 서버에 클라이언트 콘텐츠가 저장되지 않는 stateless 클라이언트-서버 커뮤니테이션이 필요하다. (대신 세션의 상태에 대한 정보가 클라이언트에 저장된다.)
3. 일부 클라이언트-서버 간 상호 작용의 필요성을 제거할 캐시 가능 데이터가 필요하다.
4. 애플리케이션 요구 사항별로 표준화된 형식으로 정보를 전송할 수 있도록 구성 요소 간 통합된 인터페이스가 필요하다.
5. 클라이언트-서버 간의 상호 작용을 계층적으로 조정할 수 있도록 계층화된 시스템 제약이 필요하다.
6. 실행 가능한 코드를 전송해 서버가 클라이언트의 기능을 확장할 수 있게 해주는 코드 온디맨드가 필요하다.

SOAP
SOAP는 다른 언어로 다른 플랫폼에서 빌드된 애플리케이션이 통신할 수 있도록 설계된 최초의 표준 프로토콜이다. 프로토콜이기 때문에 복장성과 오버헤드를 증가시키는 빌트인 룰을 적용하므로, 페이지 로드 시간이 길어질 수 있다. 빌트인 컴플라이언스를 제공하므로 기업에서 선호하는 방식. 빌트인 컴플라이언스 표준에는 보안과 트랜잭션 ACID가 포함된다.

웹 서비스 보안 : 토큰이라고 불리는 고유 식별자를 통해 메시지를 보호하고 전송하는 방식을 표준화한다.
WS-ReliableMessaging : 불안정한 IT인프라로 전송되는 메시지 간 오류 처리를 표준화합니다.
웹 서비스 주소지정 WS-addressing : 심층 네트워크에 라우팅 정보를 유지관리하는 대신, SOAP 헤더 내에 메타데이터로 해당 정보를 패키징한다.
웹 서비스 기술 언어 WSDL : 웹 서비스가 무엇을 하는지, 해당 서비스의 시작과 종료 위치를 기술합니다.
데이터에 대한 요청이 SOAP API로 전송되는 겨우 HTTP(웹 브라우저), SMTP(이메일), TCP 등의 다양한 애플리케이션 레이어 프로토콜을 통해 처리될 수 있다. 그러나 요청이 수신되면, 인간과 기계가 모두 읽을 수 있는 마크업언어인 XML 문서 형식으로 반환 SOAP 메시지가 반환된다. SOAP API에 대한 완료된 요청을 브라우저에서 캐시할 수 없으므로, API로 재정송하지않는 한 이후에 액세스할 수 없다.

SOAP - REST 차이
REST는 유연한 구현을 제공하는 가이드라인 세트고, SOAP는 XML 메시징과 같은 특정 요건이 있는 프로토콜이다.

REST API 는 경량화되어 있기 때문에 IoT, 모바일 애플리케이션개발, 서버리스 컴퓨팅과 같이 보다 새로운 컨텍스트에 이상적이다. SOAP 웹 서비스는 많은 기업에서 필요로 하는 기본 보안과 트랜잭션 컴플라이언스를제공하지만, 이로 인해 좀 더 무거운 경향이 있다.

 

 

두 사이트를 참고해서 정리했습니다.

https://www.redhat.com/ko/topics/integration/whats-the-difference-between-soap-rest#%EA%B0%9C%EC%9A%94

 

REST와 SOAP 비교

REST와 SOAP는 웹 애플리케이션 간 데이터 통신을 허용하는 애플리케이션 프로그래밍 인터페이스(API)를 구축하는 방법을 정의합니다.

www.redhat.com

https://www.soapui.org/learn/api/soap-vs-rest-api/

 

SOAP vs REST APIs: Which Is Right For You? | SoapUI

The age old question: what is the difference between SOAP and REST APIs, and which one is right for my project? Just because our name is SoapUI, doesn't mean that we also don't know what we are talking about when it comes to explaining RESTful web services

www.soapui.org

 

+ Recent posts