Kotlin & Java

Kotlin & Java

동시성 작업

스레드 사이에서 공유 상태는 어떤식으로 관리 될 수 있을까요 ? 먼저 문제가 있는 코드를 한번 보고, 어떤식으로 해결할 수 있을지 확인해보겠습니다. 해당 코드를 돌려보면? 성공 할 때도 있지만, 실패하는 경우도 있습니다. while (balance.getBalance() > 0) 잔고가 0 보다 큰 경우에만 동작할 것이라 예상했지만, 우리의 예상을 깨고 마이너스 잔고가 보입니다.(여담이지만 코드만 보고 동시성 문제가 있을것이라 판단하는 것도 꽤 어려운 일이라고 생각합니다. 경우에 따라서는 제대로 동작하는 코드 처럼 보일경우도 있으니까요) 가시성, 원자성 문제를 모두 해결해야, 동시성(MultiThreading)으로 부터 자유로워질 수 있습니다. 해결에 주목적을 가지고 있기 때문에, 간단하게 짚고만 넘어가..

Kotlin & Java

사례로 알아보는 Generic(제네릭)

Generic 이란 무엇일까 ? 혹시 아래 코드들이 어떤식으로 다른지 정확하게 이해하고 있나요 ? 아니라면 이번시간에 차근차근 알아보도록 합시다 public class Generics { // T == type parameter private T t; T method(T t) { return null; } // T 를 반환하는 메서드 레벨의 type parameter static void method1(P t) { } // Generics와 상관없는 메서드 레벨의 type parameter (Parameter 를 받을 때 P 타입을 유추하기 때문에 사용가능) static E method2(P p) { return null; } // E 타입 P 타입을 받아 E 로 반환. 메서드 레벨의 type param..

Kotlin & Java

람다식, 익명 함수, 일급 함수, 클로저 간단하게 알아보자

프로그래밍 스펙의 람다 람다식? 익명 함수? 람다식, 람다 함수는 프로그래밍 언어에서 사용되는 용어로, 익명 함수를 지칭한다. 고로 람다 함수는 익명 함수와 같은 의미를 지닌다 라고 생각해도 될 것 같다. 물론 람다가 더 큰 표현이고, 람다의 특징 중 람다 식은 이름을 가질 필요가 없다(익명 함수) 또한 커링 같은 특징들도 있는데, 찾아보면 좋을 것 같다. 일급 함수 ? 함수를 우리가 사용하는 객체 처럼 사용할 수 있다면 일급 함수라고 부른다. 1. 함수를 변수에 할당 할 수 있어야하고 2. 인자에 담을 수 있어야 하고 3. 반환 형으로 사용할 수 있어야 한다. 함수의 시그니처 어디에든 함수가 들어갈 수 있다. public String(함수로 표현 가능) getString(String[](함수로 표현 가..

Kotlin & Java

인터페이스의 정적(static) 메서드와 기본(default) 메서드

자바 8 이전에는 인터페이스의 모든 메서드가 추상 메서드이어야 했다. 구현부가 없어야 했다. 하지만 자바 8에서부터는 구현이 있는 정적 메서드, 기본 메서드를 추가할 수 있다. 정적 메서드 이전 관점에서는 인터페이스를 추상적인 의미를 가진다고 생각했고, 그렇기 때문에 구현을 하는 방식은 디자인 관점에서 맞지 않았지만, 이런 사고가 다양한 개발을 거치면서 진화했다. 특히 그 중에서도 팩터리 메서드는 인터페이스와 아주 궁합이 좋다. e.g IntSequence 인터페이스에는 다음과 같이 주어진 정수의 숫자 시퀀스를 만들어내는 정적 메서드 digitsOf() 를 추가할 수 있다 이 메서드는 IntSequence 인터페이스를 구현한 클래스 중에서 수많은 인스턴트들이 전달 되지만, 어느 클래스의 인스턴스인지 신경..

Kotlin & Java

타입 변환과 instanceof 연산자 Tips

public class FileSequence implements IntSequence, Closeable { // something... } 위와 같이구현하면 FileSequence 클래스는 IntSequence 와 Closeable 을 슈퍼타입으로 둔다. (객체를 두 인터페이스 타입 중 어느 것으로도 변경할 수 있다는 말이다. 아주 활용도가 높다.) Tips. 변수를 인터페이스 타입으로 선언할 수 있지만, 타입이 인터페이스 자체인 객체는 만들 수 없다. 모든 객체는 클래스의 인스턴스여야 한다. -> FileSequence 클래스의 인스턴스를 만들어 IntSequence, Closeable 처럼 사용할 수 있지만, IntSequence 클래스의 인스턴스를 만들 수는 없다. 또한 객체는 실제 자신의 클래..

Kotlin & Java

중첩 클래스 와 내부 클래스 (부제 : ViewHolder 를 이너 클래스로 만들때는 왜 static class 로 만들까?)

클래스 내부에 다른 클래스를 두는 방법중 대표적인 2가지가 중첩 클래스(static class), 내부 클래스(inner class)가 있다. 부제에 대한 답 : 중첩 클래스는 가시성을 제한하거나, Item, Node, Element, ViewHolder 같은 일반적인 이름을 사용하면서 정돈된 상태를 유지하는데 아주 유용하다. 왜 일까? 그전에 중첩 클래스와 내부 클래스에 대해 간단하게 알아보자 중첩 클래스 물품(item)의 비용을청구하는 Invoice 클래스가 있다고 생각하고, 물품에는 설명, 수량, 단가가 포함되어 있다 이를 중첩 클래스로 표현하면 아래와 같이 된다. 그리고 public static 으로 선언한 것 말고는 내부에 클래스를 선언하는 것과 크게 다른 것이 없어보인다 public class..

Kotlin & Java

자주 사용하는 String 클래스 함수

String 클래스는 Immutable 클래스 이기 때문에, 시그니쳐(Signature) 중 리턴 타입이 String 인 타입은 원본 객체가 바뀌는 것이 아니라, 새로운 객체를 만들어 반환 해준다. 이런 메서드를 접근자(accessor) 메서드 라고 한다. 호출 대상을 변경하는 메서드는 변경자(mutator)라고 한다 함수 설명 및 예제 boolean startWith(String str) boolean endsWith(String str) boolean contains(CharSequence str) 특정 문자열로 시작, 종료 하거나 지정한 문자열을 포함하는지 체크한다. int length() 문자열의 길이를 리턴한다 boolean equals() 문자열을 비교할 때 사용하는 함수로 같으면 true, ..

Kotlin & Java

자바 문자열 고찰 및 생각의 힘

자바를 처음 배울 때 "문자열 비교는 무조건 equals 를 사용해야 한다" 라고 배우기 때문에 왜 equals 를 사용해야 하는지 모르고 넘어가는 것 같다 아니, 왜 그럴까 생각 하는 사람들이 많지 않은 것 같다. 나 역시도 그랬고, 당연히 equals 를 사용해야 한다고 알고 있다. 근데 이런 단편적인 지식은 자바를 처음 배우는 사람들도 당연히 아는 지식이고, 결국 경력자임에도 불구하고 나는 자바를 처음 배우는 사람과 크게 다른 점이 없다는 생각이 들었다. class A { String a = "abc"; String b = "abc"; } 위와 같은 클래스가 있다고 가정하자. 개발자분들에게 if(a == b) { System.out.println("같다") } else { System.out.pri..

Kotlin & Java

자바 기본 타입 (Primitive type)

자바에서 가장 간단한 데이터 타입을 기본 타입이라고 한다. 기본 타임 중 네 가지는 정수 타입이고, 두 가지는 부동소수점 수 타입이며, 문자 타입(char), boolean 타입이다. 총 8가지이다 정수타입 타입 저장 공간 int 4 바이트 long 8 바이트 short 2 바이트 byte 1 바이트 보통의 경우는 int 로 처리되지만, 지구에 살고 있는 사람의 수를 표현한다면 long 을 사용해야 한다. byte, short 타입은 로우 수준의 파일 처리나 저장 공간이 귀한 상황에서 주로 사용된다. (long 타입으로 충분하지 않을 때는, BigInteger 클래스를 사용해야한다) 자바에서 정수 타입은 프로그램을 실행하는 머신과 관계가 없다. 이유는 자바는 write once, run anywhere ..

Nanamare
'Kotlin & Java' 카테고리의 글 목록