프로그래밍 관련/자바
35편. 스트림(Streams) (1)
35편. 스트림(Streams) (1)
2022.04.04들어가기 앞서 자바로 작성된 수많은 프로그램들의 내부에서는 갖가지의 컬렉션(collection)을 만들고 이를 이용해 데이터를 처리합니다. 예를 들어서, 우리는 매장 내 물품의 재고량이나 가격, 제조일자, 브랜드 등을 나타내는 물품의 컬렉션을 만들 수 있습니다. 그리고 이 컬렉션을 이용하여 재고가 없는 물품을 검색하거나 가격이 낮은 순으로 정렬시키는 등 다양한 작업을 수행할 수 있습니다. public static void main(String[] args) { List products = productService.getProducts(); products.add(new Product(1, "External Hard Drive",59990, 15)); products.add(new Product(2, "..
32편. 람다식(Lambda expression)
32편. 람다식(Lambda expression)
2022.02.22함수형 인터페이스(Functional Interface) 람다식을 이해하기 전에 함수형 인터페이스에 대한 이해가 필요합니다. 함수형 인터페이스(Funcational Interface)란 하나의 추상 메서드를 갖는 인터페이스를 말합니다. 자바 8 이후에 추가되었으며, 이를 SAM 인터페이스(Single Abstract Method interface)라고도 부릅니다. 함수형 인터페이스의 대표적인 예로는 스레드에서 살펴봤던 Runnable 인터페이스를 꼽을 수 있습니다. @FunctionalInterface public interface Runnable { public abstract void run(); } @FunctionalInterface 자바 8 이후부터는 함수형 인터페이스를 나타내는 @Functio..
34편. 애노테이션(Annotation)
34편. 애노테이션(Annotation)
2022.02.18애노테이션(Annotation) 애노테이션은 소스 코드에 대한 메타데이터(metadata), 즉 다른 데이터를 설명해 주는 데이터를 제공합니다. 주석(comments)과 마찬가지로 코드를 실행하는데 있어서 직접적인 영향을 미치지는 않습니다. 클래스, 메서드, 변수, 매개변수 등에 애노테이션을 달 수 있으며, 애노테이션은 아래와 같이 문자 @로 시작합니다. @Override public void foo() { // ... } 보통은 리플렉션과 같이 활용되며, 문서, 컴파일러 혹은 IDE, 테스트 프레임워크(JUnit, JCStress 등)나 ORM(Hibernate, JPA 등) 등과 같이 다양한 곳에서 상당히 유용하게 사용됩니다. 애노테이션의 위치 애노테이션이 들어갈 수 있는 위치는 상당히 다양합니다. ..
26편. 제네릭(Generic)
26편. 제네릭(Generic)
2022.02.06여기서 컬렉션을 몰라도 크게 지장은 없으나 예제에서 사용된 List가 무엇인지 궁금하시다면 컬렉션 편이랑 같이 병행해서 보시기 바랍니다. 제네릭(Generic) 타입 안정성(type safety) 제네릭의 주 목적은 바로 타입 안정성을 제공하고 타입 캐스팅 문제를 해결하는 것입니다. 예를 들면, 아래의 코드를 생각해봅시다. 리스트에 값을 추가할 때는 문제가 없어보이지만, 리스트에서 값을 꺼낼 때는 컴파일러가 꺼낸 값이 무슨 타입인지 모르기 때문에 명시적으로 캐스팅을 해야 한다는 번거로움이 있습니다. 여기서 캐스팅을 잘못하면 캐스팅을 할 수 없다는 런타임 예외가 발생하므로 주의해야 합니다. List list = new ArrayList(); list.add(123); list.add("가나다"); // 타..
25편. 중첩 클래스(Nested Class)
25편. 중첩 클래스(Nested Class)
2022.02.06중첩 클래스(Nested classes) 중첩 클래스는 말 그대로 클래스 내에 정의된 클래스를 말합니다. 어떤 클래스가 한 곳에서만 쓰인다면 아래와 같이 해당 클래스를 중첩시키고 두 클래스를 한꺼번에 관리하는 것이 적절합니다. class OuterClass { // 외부 클래스 // ... class NestedClass { // 중첩 클래스 // ... } } 중첩 클래스는 다시 static으로 선언되지 않은 중첩 클래스인 내부 클래스(inner class)와 static으로 선언된 중첩 클래스인 정적 클래스(static class)로 나뉩니다. 여기서는 두 용어를 구분하도록 하겠습니다. class OuterClass { // 외부 클래스 // ... class InnerClass { // 내부 클래스..
29편. 스레드(Thread) (2)
29편. 스레드(Thread) (2)
2022.01.27경쟁 상태(race condition) wait() & notify() wait() 메서드를 호출한 스레드는 획득한 락을 포기하고 대기 상태에 들어가며 다른 스레드가 동일한 객체의 락을 얻은 뒤 notify()나 notifyAll() 메서드를 호출할 때까지 깨어나지 않습니다. 주의하실 점은 락을 얻지 않은 상태에서 wait(), notify(), notifyAll() 메서드를 호출하면 IllegalMonitorStateException 예외가 발생합니다. 다른 스레드보다 락을 빠르게 얻기 위해서 경쟁 중인 스레드는 EntryList에 있습니다. 그 중 한 스레드가 객체의 락을 얻어서 실행 상태로 들어갔다가 wait() 메서드를 만나면 락을 포기하고 대기 상태로 들어가 WaitSet으로 이동합니다. 그리고..
정리. JVM의 힙 영역 살펴보기
정리. JVM의 힙 영역 살펴보기
2022.01.22이 글은 보호되어 있기 때문에 이것을 보려면 암호가 필요합니다.
14편. 문자열(String)
14편. 문자열(String)
2022.01.15String 클래스를 사용하면 아래와 같이 일련의 문자를 나타내는 문자열 리터럴을 담을 문자열 객체를 생성할 수 있습니다. 어렴풋이 짐작하신 분들도 있겠지만 문자열 리터럴은 큰따옴표(")로 둘러싸서 표현합니다. 소괄호 안에 들어간 문자열 리터럴은 생성자로 넘어가는데, 아직은 생성자를 배우지 않았으므로 가볍게 보고 넘어가주세요. 덧붙여서, 문자열을 저장할 때 아래와 같은 방법은 잘 사용하지 않습니다. 그 이유는 곧 밝혀집니다. String a = new String("Hello"); 아래와 같은 방식으로도 문자열 리터럴을 저장할 수 있습니다. 문자열이 상당히 많이 사용되기 때문에 특별하게 문자열에만 적용되는 규칙들이 많은데, 그 중에 하나가 아래와 같은 방식으로 문자열을 저장할 수 있다는 것입니다. 위의 ..
번외. 컴퓨터에서 음수를 표현하는 방법
번외. 컴퓨터에서 음수를 표현하는 방법
2022.01.06컴퓨터는 0과 1의 이진수만 이해할 수 있는데, 이런 컴퓨터 세계에선 음수를 어떻게 표현할까요? 컴퓨터에서 음수를 표현하는 방법은 부호 절댓값 방식(signed magnitude), 1의 보수, 2의 보수와 같이 크게 세 가지가 있습니다. 먼저 부호 절대값 방식부터 알아보도록 하겠습니다. 부호 절댓값 방식 부호 절댓값 방식은 0과 양수, 음수를 표현할 수 있는 가장 단순한 방법입니다. 이 방식은 최상위 비트로 부호를 표현하고, 나머지 비트로 해당 정수의 절댓값을 나타냅니다. 여기서 최상위 비트(Most Significant Bit, MSB)를 부호 비트로 쓰면서 표현할 수 있는 절댓값의 범위는 절반으로 줄어들게 됩니다. 최상위 비트가 0이면 양수라는 뜻이고, 1이면 음수라는 뜻입니다. 문제점 하지만 이 ..
번외. 10진수와 2진수 간 변환하기
번외. 10진수와 2진수 간 변환하기
2021.08.1010진수를 2진수로 변환하기 정수부 우리는 일상생활에서 보통 10진수를 사용합니다. 반면에 컴퓨터는 모든 정보를 0과 1로 이루어진 비트의 형태로 저장합니다. 즉, 모든 걸 2진수로 저장한다는 소리입니다. 그만큼 2진수와 10진수 간 변환이 잦으며, 반드시 알아야 할 내용 중 하나입니다. 이 글에서는 서로 변환하는 방법을 알아보도록 하겠습니다. 10진법(decimal system) 한 자리의 수가 10이 될 때마다 자리올림을 하여 표시하는 방법을 10진법이라 합니다. 따라서 10진법으로 수를 표시할 때에는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9의 10가지 숫자를 필요로 합니다. 10진수를 2진수로 바꾸는 방법은 다음과 같습니다. 아래와 같이 바꾸고 싶은 진수의 수로 더 이상 나눌 수 없을 때..
자바스크립트 강좌 1편. 시작
자바스크립트 강좌 1편. 시작
2016.05.091. 자바스크립트 소개 1995년, 넷스케이프 사의 브랜든 아이히(Brendan Eich)가 라이브 스크립트(live script) 언어를 개발하기 시작합니다. 그 후 썬 마이크로시스템즈 사와 제휴를 맺으며 그 당시 유명했던 자바의 이름을 본따 '자바스크립트'로 변경되어 다시 개발이 시작됩니다. 그러자 마이크로소프트 사에서 이에 대항하기 위해 VB 스크립트를 발표하고 그 후에 자바스크립트와 비슷한 J스크립트를 발표하게 됩니다. (익스플로러 3.0에 Jscript 탑재) 그러자 넷스케이프 사에서 1996년, 표준화를 위해 자바스크립트의 기술 규격을 ECMA 국제회의에 제출하고 1997년에 ECMA 스크립트의 첫번째 버전인 ECMA-262가 발표됩니다. 자바스크립트와 J스크립트 등 ECMA 스크립트와의 호환..
28편. 스레드(Thread) (1)
28편. 스레드(Thread) (1)
2012.08.25들어가기 앞서 스레드(thread)의 사전적 정의를 살펴보면 '실, 가닥'이라는 것을 알 수 있는데, 컴퓨터 세계에서 스레드를 떠올리면 아래와 같은 이미지일 것입니다. 여기서 프로세스는 간단히 말하면 실행 중인 프로그램을 말합니다. 프로세스는 위와 같이 여러 개의 실행 흐름, 즉 여러 개의 스레드를 가질 수 있습니다. 지금까지 우리가 본 프로그램은 어떤 작업을 수행하면 그 작업이 끝날 때까지 기다려야 다른 작업을 수행할 수 있었습니다. 이는 우리가 여태껏 하나의 스레드만 사용했기 때문입니다. 하지만 어떤 작업을 하면서 다른 작업을 동시에 수행하고 싶을 때는 어떻게 해야 할까요? 그러면 여러 개의 스레드, 즉 멀티스레드(multi-thread)를 사용하면 되지 않을까요? 수많은 프로그래밍 언어에서 멀티스레..