개요 C, Java, Kotlin에 이어 4번째로는 Go를 공부해보려고 한다. 필자는 이전에 공부했던 3개의 언어를 기반으로 Go를 새로 배우는 입장이라, Java나 C와 비교하며 이해해보자. 특징 Go는 C와 C++, Java, Python 등의 장점을 뽑아 개발되었는데, 다시 말하면 절차지향 언어와 객체지향 언어의 특징을 모두 가지고 있다. Go가 가지는 대표적인 특징들은 다음과 같다. - 적은 키워드 (25개의 키워드 - Java의 절반 수준)- 정적 타입 (자료형에 타입이 정해져 있음)- 명시적 형변환 (명시적 타입 캐스팅 필요)- 안전성 (타입, 메모리 안전성)- 병행성 (스레드와 비슷한 고루틴이라는 개념을 사용하여 스레드 개수를 빡빡하게 관리하지 않아도 됨)- 가비지 컬렉션 (Go Runt..
개요 자바에는 데이터의 그룹(자료구조)을 나타내기 위한 Collection 인터페이스가 존재한다. Collection 인터페이스에는 List, Set, Queue가 존재하며, 해당 인터페이스들을 구현하는 다양한 구현체들이 존재한다. + Collections라는 클래스도 존재하는데, 여기에는 Collection과 그 하위 클래스들을 조작하기 위한 static 메서드들이 존재한다. 다양한 컬렉션 인터페이스들(+Map)을 살펴보고, 각 인터페이스를 구현하는 구현체의 특징과 자료구조, 시간복잡도 등에 대해서 정리해보겠다. 1. List List는 순서를 보장하는 컬렉션 인터페이스이며, 중복을 허용한다. 1-1. ArrayList - [배열 기반의 리스트]public class ArrayList extend..
개요 자바에서 일반적으로 사용되는 변수는 여러가지가 있는데, 흔히 유명한 것들이 메소드나 블록 내에서만 유효한 로컬 변수(local variable)나 매개변수(paramter), 객체의 생성과 함께 관리되는 인스턴스 변수(instance variable), static 키워드와 함께 선언되어 클래스 로딩 시점에 초기화되는 스태틱 변수(static variable)와 같은 변수들이 있다. 하지만 위와 같은 변수들은 멀티쓰레드 환경에서의 safety를 보장하지 않는다. 멀티쓰레드 환경에서는 여러 쓰레드가 동시에 동일 데이터에 접근을 시도하는 경우 race-condition으로 인한 가시성 문제(한 쓰레드에서 수정한 사항이 다른 쓰레드에서 보이지 않음)나 동시 접근 문제(여러 쓰레드가 동시에 접근하여 값이..
들어가며 최근 Toss 같이 자바+스프링 대신 코틀린+스프링을 사용하는 기업들이 증가하고 있다. 지금 속한 동아리의 백엔드 팀에서도 자바가 아닌 코틀린을 사용하고 있다. 동아리에서 일년 가까운 기간동안 일하며 코틀린을 사용했지만, 지금까지 코틀린으로 작성한 코드를 살펴보니 단순히 자바 코드를 코틀린으로 번역한 수준에서 크게 벗어나지 않다는 것을 느꼈다. 그래서 향후 코틀린을 의미있게 사용하기 위해서, 자바 대신 코틀린을 사용했을 때 가질 수 있는 이점들을 정리하고자 한다. 컴파일 프로세스와 롬복 자바의 컴파일 과정에 대해서는 이전에 설명한 적이 있다. 그렇다면 코틀린은 어떻게 컴파일되고 실행될까?코틀린은 문법에서 차이가 있을 뿐, 자바와 완벽하게 상호 운영 가능하다는 특징을 가진다. 심지어 둘을 같이 ..
1. 에러(Error)와 예외(Exception) 일반적으로 자바에서는 잡을 필요도 없고, 회복또한 불가능한 것을 에러(Error)라고 하며, 잡을 수 있고 회복이 가능한 것을 예외(Exception)이라고 부른다. 위 그림에서 나타나는 에러들을 보면 쉽게 이해할 수 있을 것이다. 예를 들어 OutOfMemoryError라는 에러는’ 메모리 부족’이라는 예상할 수 없고, 프로그램상으로 해결할 수도 없는 문제를 나타내고 있다. 아마 자연스럽게 느껴질텐데, 이러한 이유로 프로그램을 짤 때 주로 개발자는 에러보다는 예외에 대해서 고려하게 된다. 2. 예외(Exception)의 종류 자바에서 모든 예외도 객체이므로 Object를 상속받으며, 최상위 예외로는 Throwable클래스를 갖는다. Throwa..
람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다. 람다식 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다. 이때 expression은 바로 return값이 나와야 한다. 예를 들면 public String getName() { return "name"; } () -> "name" 과 같이 바로 리턴값이 나와야 한다. 만약 다양한 변수나 선언문, 배정문등을 쓰기 위해서는 중괄호를 사용해주면 된다. 이러한 람다식은 불필요한 코드를 줄이고, 가독성을 높이기 위해서 사용될 수 있다. 함수형 인터페이스 배열을 정렬하는 Arrays.sort() 함수에서 사용되는 예를 보자. I..
자바에서 배열 혹은 컬렉션 인스턴스의 조회를 위해서 흔히 for문 또는 foreach(iter)문을 사용하면서 요소 하나씩을 꺼내서 조회하였다. 간단한 경우에는 크게 문제되지 않지만, block으로 관리되는 특성상 로직이 복잡해지면 코드가 복잡해지는 문제가 있다. 자바 api 문서를 보면 스트림은 'A sequence of elements supporting sequential and parallel aggregate operations'라고 나와있다. 즉 배열이나 컬렉션과 같이 데이터를 나란히 저장하는 자료구조에서 원하는 결과를 필터링해서 얻어낼 수 있는 방법이다. 스트림을 사용하기 위해서는 크게 생성-필터링의 가공을 거쳐 결과를 사용하게 된다. 1. 생성 배열과 컬렉션 등의 다양한 자료구조에서 스트림..
개요"JAVA는 자바 가상 머신(Java Virtual Machine) 위에서 동작한다" - 자바를 처음 배울 때 들어봤을 개념이다. 그렇다면 왜 자바는 가상머신 위에서 동작하도록 설계된 것일까? 이번 포스팅에서는 자바의 동작 방식과 배경에 대해서 정리해보도록 하겠다. C언어로 프로그램을 작성해 본 적이 있다면, 아마 다음과 같은 과정을 거쳐 소스파일을 실행파일로 변환했을 것이다.gcc -c test.c -o test.o # 소스파일(test.c)을 이용해 오브젝트 파일(test.o)를 만든다.gcc test.o -o test.out # 오브젝트 파일(test.o)를 이용해 실행 파일(test.out)을 만든다. C언어는 "Write Once, Complie Anywhere"(WOCA)라는 특징을 가진다..
더보기 https://www.youtube.com/watch?v=jit8j4gblIk&list=PLxTmPHxRH3VXHOBnaGQcbSGslbAjr8obc&index=1&ab_channel=%EC%98%A4%EC%A4%80%EC%84%9D%EC%9D%98%EC%83%9D%EC%A1%B4%EC%BD%94%EB%94%A9 를 보고 연습해보기.. + developer 사이트 뒤지는거 너무 번거롭다 + 버전오류도 엄청 많이나는것같음 (unresolved나 메소드 못찾는 등 오류 뜨면 거의 버전오류임) 1. Room DB를 이용하여 데이터 저장하기. 안드로이드 공식사이트(developer.android.com)를 참조해보면 ROOM DB 사용을 위해서 가장 먼저 build.gradle을 수정해주자 //room ..
Singleton(싱글톤 패턴) 어떤 클래스가 최초 한번만 메모리를 할당하고, 그 메모리에 객체를 만들어 재사용하는 디자인 패턴을 의미한다. 즉, 생성자의 호출이 반복적으로 호출되었을 때에도 실제로 하나의 객체만이 생성되어 사용되는 패턴으로, 특히 스프링에서 스프링 빈의 관리를 싱글톤으로 하여 객체 인스턴스를 하나만 생성하여 DI(Dependency Injection)와 OCP(개방 폐쇄 원칙) 위반없이도 자유롭게 싱글톤을 사용하게 한다. 이는 메모리의 낭비를 방지할 뿐만 아니라, 객체가 전역성을 띄기에 다른 객체와 공유 또한 용이하다. - 싱글톤 인스턴스는 전역 인스턴스로 데이터를 공유하기 쉽다.- 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용한다.- 두 번째 이용시부터는 객체 로딩 ..
1-1. 람다 함수형 프로그래밍의 핵심이라고 할 수 있는 람다는 value처럼 다룰 수 있는 익명함수를 의미한다. 람다는 메소드의 파라미터로 넘겨줄 수 있으며, return값으로 사용할 수도 있다. val lamdaName:Type = {argumentList->codeBody} 선언과 타입(input,output)을 적고, 파라미터를 적고 어떻게 할지를 적어주는 식으로 동작한다. 예를 들면, val square = {number:Int->number*number} //방법 1 val square: (Int)->(Int) = {number->number*number} //방법 2 와 같이 작성하면, Int를 받아서 Int로 반환하는데, number를 받아서 number*number로 반환한다는 것을 알 ..
오랜만에 배우는 새로운 언어 1. 함수 fun functionName() { println("Hello World!"); } fun add(a:Int, b:Int) :Int { return a+b; } 자바와 다른 점은 변수/함수의 타입을 변수명/함수명 뒤에 별도로 선언해준다는 점이다. 2. 상수/변수 fun main() { val a:Int = 10; //상수(final) var b:Int = 20; //변수 } val은 상수, var은 변수를 의미한다. 추가적으로 선언과 동시에 초기화가 이루어질 경우 파이썬과 같이 dynamic type binding이 가능하기 때문에 타입을 별도로 지정하지 않아도 된다. 다만 선언과 동시에 초기화하지 않으면 별도로 타입을 지정해주어야 한다. 3. 변수 출력 val ..