목록Java (31)
forDevLife
문제 아래 예제는 ThreadEx20_3(데몬 쓰레드 - gc 역할)를 생성한 후 메인 쓰레드의 for문 내에서 랜덤으로 memory를 소모하는 도중 memory의 사용량을 체크 > gc를 수행하는 방식이다. 기존에는 gc.interrupt()가 발생하게 되면 sleep 된 데몬 쓰레드가 깨어나 gc 처리를 수행하는 도중 컨텍스트 스위칭이 발생하여 메인 쓰레드에서 memory를 깎아 먹어 마이너스 메모리가 되는 문제가 발생했다. 따라서 main의 try ~ catch를 통해 gc 쓰레드가 수행을 마칠 때 까지 기다리는 join을 통해 문제를 해결했다. 이 방법외에 다른 방법을 찾고자 AtomicInteger를 사용해봤다. 결과는 우선 원하는대로 나오지는 않았다. 코드 import java.util.con..
참고 : https://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again Java: notify() vs. notifyAll() all over again If one Googles for "difference between notify() and notifyAll()" then a lot of explanations will pop up (leaving apart the javadoc paragraphs). It all boils down to the number of waiting threads be... stackoverflow.com 생각의 흐름 자바의 정석 Thread의 wait, notify 부분을 보다가 not..
Call back? Callee(피호출자 - listner)에서 Caller(호출자)의 메서드를 역으로 호출하는 동작을 의미 다른 함수에 인수로 전달되는 함수를 call back 메서드라고 하며, 특정 이벤트 이후 실행된다. call back은 called at the back으로 해석할 수도 있다. 즉 back(이후)에서 호출되는 메서드라고 이해하자. 예시로 TestCallBack(Caller)와 Callee를 만들어보자. Caller에서 Callee의 메서드를 호출하면, Callee 내부의 메서드에서 다시 Caller의 메서드를 역으로 호출하게 될 것이다. 1. Callee 선언 import java.util.Scanner; public class Callee { private String msg; ..
Effective Java 학습 중, Recursive Type Bound가 class에 적용된 사례가 나오는데 이해가 잘 가지 않아서 알아봤다. public abstract class Pizza { public enum Topping {HAM, MUSHROOM, ONION, PEPPER, SAUSAGE} final Set toppings; // 재귀적 타입 한정 - 모든 타입 T는 자기 자신? 자기 자신이 들어간 표현식을 사용하여, 타입 매개변수의 허용범위를 한정한다. // 즉, T는 자신을 포함하는 Builder에 의해 한정된다. abstract static class Builder { EnumSet toppings = EnumSet.noneOf(Topping.class); // 빈 Topping c..
주요 부분 private static final String OPERATION_REGULAR = "^[+\\-*/\\d]*$"; // private static final String OPERATION_REGULAR = "^[+\\-*/[0-9]]*$"; private static final String OPER_REGULAR = "[+\\-*/]"; private static final String NUMBER_REGULAR = "^[0-9]*$"; public static final Pattern validOperationPattern = Pattern.compile(OPERATION_REGULAR); Operation_regular 하나로 사칙 연산자(+, -, /, *) 및 숫..
1. import 문 - 클래스를 사용할 때 import를 통해 패키지 이름을 생략할 수 있다. - 컴파일러에게 클래스가 속한 패키지를 알려준다. - java.lang 패키지의 클래스는 import 필요없다.(기본 패키지이므로) -> String, Object, System, Thread 등 - import문은 패키지문과 클래스 선언 사이에 위치해야 한다. 패키지 선언 -> import 문 -> 클래스 선언 - import는 컴파일 시에 처리되므로, 프로그램의 성능에 문제 없다. 고로 *로 찍어도 된다. -> 컴파일러에게 뭐 시간이 좀 더 걸리긴 하겠지만. -> 하지만 실제로 사용하는 클래스를 명시적으로 지정하는 것도 좋다. - 위의 두 개 코드는 의미가 다름에 유의한다. -> 왼쪽은 java.util ..
1. hashCode() - 객체의 해시 코드를 반환하는 메서드 - Object 클래스의 hashCode()는 객체의 주소를 int로 변환해서(만들어서) 반환 public class Object { ... public native int hashCode(); -> native 메서드(OS가 가지고 있는 메서드 - 주로 c로 작성) -> 내용이 없음. 이미 작성되어있는 메서드를 사용함. 내용을 볼 수가 없다. -> 객체마다 항상 다른 값이 나온다 = 객체의 지문 - equals() (-> iv)로 작업를 오버라이딩 하면, hashCode()도 오버라이딩해야 함. -> 둘 다 객체 주소로 작업 - equals의 결과가 true인 두 객체의 해시코드는 같아야 하기 때문! + 참고 : System.identit..
new 조상클래스 혹은 구현 인터페이스 이름() { //멤버 선언 } - 말 그대로 이름이 없는 일회용 클래스. 딱 한번 인스턴스 만들고 끝냄 - 이름이 없으므로 조상 / 인터페이스 이름을 쓴다. - 클래스 정의 + 생성을 동시에 한다. package com; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Ex14_0 { public static void main(String[] args) { Button b = new Button("Start"); b.addActionListener(new EventHandler()); } } class EventHandler i..
- 인터페이스에 디폴트 메서드, static 메서드 추가 가능(JDK 1.8 부터) +tmi : java.util.Collection 인터페이스와 관련된 static 메서드들이, 기존에 인터페이스에는 추상 메서드만 들어가야 한다는 조건 때문에 Collections 클래스로 들어가게 되었다. -. 접근 제어자는 항상 public, 따라서 오버라이딩 시 public으로 써줘야 한다. 아무것도 안쓰면 default -> 더 좁은 범위라 허용 안됨. -. 인터페이스는 추상 메서드 집합 -. 만약 새로운 메서드 추가하고 싶음 -> 추상 메서드를 추가한다는 의미 -. 하지만, 이렇게 된다면, 기존에 이 인터페이스를 구현했던 클래스들이 모두 새로운 메서드를 구현해야 함.. very bad -> default 메서드로..
1. 네트워킹 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다. java에서 제공하는 java.net 패키지를 사용하면 이러한 네트워크 어플리케이션의 데이터 통신 부분을 쉽게 작성할 수 있다. 1.1 클라이언트 / 서버 - 서비스 : 서버가 클라이언트로부터 요청받은 작업을 처리, 그 결과를 제공하는 것. 서버가 제공하는 서비스 종류로 구분된다. - 서버가 서비스를 제공하기 위해서, 서버 프로그램 필요 / 마찬가지로 클라가 서비스를 제공받기 위해서는 서버 프로그램과 연결될 수 있는 클라이언트 프로그램 필요 - 예를 들어, 웹서버에 접속하기 위해서 웹브라우저(클라이언트 프로그램) 필요 - 또한, FTP 서버에 접속해서 파일을 전송받기 위해서는 알FTP 같은 FTP 클라이언트 프로그램..