개요 자바에서 일반적으로 사용되는 변수는 여러가지가 있는데, 흔히 유명한 것들이 메소드나 블록 내에서만 유효한 로컬 변수(local variable)나 매개변수(paramter), 객체의 생성과 함께 관리되는 인스턴스 변수(instance variable), static 키워드와 함께 선언되어 클래스 로딩 시점에 초기화되는 스태틱 변수(static variable)와 같은 변수들이 있다. 하지만 위와 같은 변수들은 멀티쓰레드 환경에서의 safety를 보장하지 않는다. 멀티쓰레드 환경에서는 여러 쓰레드가 동시에 동일 데이터에 접근을 시도하는 경우 race-condition으로 인한 가시성 문제(한 쓰레드에서 수정한 사항이 다른 쓰레드에서 보이지 않음)나 동시 접근 문제(여러 쓰레드가 동시에 접근하여 값이 ..
들어가며 최근 Toss 같이 스프링과 함께 사용하는 언어로 자바 대신 코틀린을 사용하는 기업들이 증가하고 있다. 지금 속한 동아리의 백엔드 팀에서도 자바가 아닌 코틀린을 사용하고 있다. 동아리에서 반년이 넘는 기간동안 일하며 코틀린을 사용했지만, 지금까지 코틀린으로 작성한 코드를 살펴보니 단순히 자바 코드를 코틀린으로 번역한 수준에서 크게 벗어나지 않다는 것을 느꼈다. 그래서 향후 코틀린을 의미있게 사용하기 위해서, 자바 대신 코틀린을 사용했을 때 가질 수 있는 이점들을 정리하고자 한다. Null Safety 코틀린을 처음 사용했을때 가장 먼저 느꼈고, 지금까지도 제일 크게 체감하고 있는 부분이다. 자바로 비즈니스 로직 코드를 작성하다 보면 다음과 같은 상황들에 흔히 마주치게 된다. if..
1. 에러(Error)와 예외(Exception) 일반적으로 자바에서는 잡을 필요도 없고, 회복또한 불가능한 것을 에러(Error)라고 하며, 잡을 수 있고 회복이 가능한 것을 예외(Exception)이라고 부른다. 위 그림에서 나타나는 에러들을 보면 쉽게 이해할 수 있을 것이다. 예를 들어 OutOfMemoryError라는 에러는’ 메모리 부족’이라는 예상할 수 없고, 프로그램상으로 해결할 수도 없는 문제를 나타내고 있다. 아마 자연스럽게 느껴질텐데, 이러한 이유로 프로그램을 짤 때 주로 우리는 에러보다는 예외에 대해서 고려하게 된다. 2. 예외(Exception)의 종류 자바에서 모든 예외도 객체이므로 Object를 상속받으며, 최상위 예외는 Throwable클래스이다. Throwable 클래스는 E..
람다란 익명 함수(이름이 없는 함수)를 말하는데, 자바에서의 람다식 표현법과 활용되는 예를 정리했다. 람다식 람다식은 이름이 없는 함수를 의미하는데, 즉 함수를 하나의 식으로 표현하는 방법이다. 가장 간단한 람다식은 다음과 같이 표현할 수 있다. 이때 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. 생성 배열과 컬렉션 등의 다양한 자료구조에서 스트림..
더보기 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 ..
#include #include #include #include #include #define BUFFER_SIZE 1024 #define WORD_MAX 100 int main() { int fd; int length=0, offset=0, count=0; char* fname = "ssu_test.txt"; char buf[WORD_MAX][BUFFER_SIZE]; int i; if((fd=open(fname, O_RDONLY))
BufferedReader 기존에 java에서 입출력을 관리할때는 흔히 Scanner를 사용했다. Scanner는 정수값으로 int, long, short, 부동소수값으로 float, double, 문자열은 String값으로 구분해서 읽을 수 있다. Scanner sc = new Scanner(System.in); int i = sc.nextInt(); long l = sc.nextLong(); short s = sc.nextShort(); float f = sc.nextFloat(); Double d = sc.nextDouble(); String str = sc.next(); String str2 = sc.nextLine(); 반면 BufferedReader는 문자열만을 읽을 수 있기 때문에 Scann..
java에서 static키워드를 사용하면 객체를 생성하지 않고 클래스의 필드와 메서드를 바로 사용할 수 있다. 그래서 객체에 할당될 메모리를 절약하거나, 코드의 길이를 줄일 수 있다. 여기까지는 자바 개념만 배우면서도 알 수 있는 내용이다. 그런데 이번에 웹 프로젝트 코드를 짜면서 '어떤 경우에 static으로 사용하고, 어떤 경우에 인스턴스를 생성해서 사용해야 할지 기준에 대한 명확한 이해가 가지 않았다. 내 머리로는 객체지향적 관점에서 클래스명으로 접근한다는 것은 클래스, 즉 설계적 관점에서 접근한다는 의미이고, 인스턴스로 접근한다면 그 '고유한 객체'만의 속성에 접근한다는 의미이지 않을까? 정도까지만 생각이 가능했다. Human.getAgeAvg(); Human human1 = new Human("..