java

·Language/Java
volatile 키워드 멀티코어 프로세서는 별도의 캐시를 가지고 있다코어는 메모리에서 읽은 값을 캐시에 저장한다.작업을 처리할 때 캐시에서 먼저 확인하고 없으면 메모리에서 호출하여 처리한다.그러다보니 도중에 메모리에 저장된 변수의 값이 변경되었는데 캐시에 저장된 값이 갱신되지 않아서스레드가 멈추지 않고 계속실행되는 경우가 있다. 그래서 volatile 키워드를 이용할 경우코어는 작업을 처리할 때 캐시가 아닌 메모리에서 불러와 처리하기 때문에캐시와 메모리간의 불일치 문제가 해결된다. 변수에 volatile 키워드를 붙이는 대신 synchronized 블록을 이용할 때도 같은 효과를 얻을 수 있다. 스레드가 synchronized 블럭으로 진입할 때와 나올 때, 캐시와 메모리간의 동기화가 이루어지기 때문에 ..
·Language/Java
규칙2. 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라 정적 팩터리나 생성자의 문제- 선택적 인자가 많은 상황에 잘 적응하지 못하다는 것 프로그래머들은 보통 점층적 생성자 패턴(telescoping constructor pattern)을 적용- 필수 인자만 받는 생성자를 하나 정의하고, 선택적 인자를 하나 받는 생성자를 추가하고, 거기에 두 개의 선택적 인자를 받는 생성자를 추가하는 식으로 생성자들을 쌓아 올리듯 추가하는 것.결국 모든 선택적 인자를 다 받는 생성자를 추가하면 정의는 끝나게됨.ex)1234567891011121314151617181920212223242526272829//점층적 생성자 패턴 - 더 많은 인자 개수에 잘 적응하지 못한다. public class Nutritio..
·Language/Java
규칙 1. 생성자대신 정적 팩터리 메서드를 사용할 수 없는지 생각해 보라 클래스를 통해 객체를 만드는 일반적인 방법- public으로 선언된 생성자(constructor) 다른 방법클래스에 public으로 선언된 정적 팩터리 메서드(static factory method)를 추가하는 것.Ex)_Boolean 클래스의 valueOf 정적 팩터리 메서드의 장점 1. 생성자와는 달리 정적 팩터리 메서드에는 이름(name)이 있다.- 생성자에 전달되는 인자(parameter)들은 어떤 객체가 생성되는지를 설명하지 못함.- 정적 팩터리 메서드는 이름을 잘 짓기만하면 사용하기 쉽고, 클라이언트 코드의 가독성(readability)도 높아짐- 클래스에는 시그니처(signature)별로 하나의 생성자만 넣을 수 있는데..
·OS-Tools/Linux
리눅스에서 java.lang.NoClassDefFoundError: sun/awt/X11GraphicsEnvironment 에러가 발생할 경우 - 시스템 프로퍼티 java.awt.headless를 true로 설정해주면 된다. - 톰캣의 경우 catalina.sh 파일 제일 위에 CATALINA_OPTS="-Djava.awt.headless=true" 를 추가한다. ps -eaf | grep java 로 확인해보면 "-Djava.awt.headless=true가 추가되어있는 것을 확인할 수 있다. 1CATALINA_OPTS="-Djava.awt.headless=truecs
·Language/Java
2. 스레드의 안전성 도입 2-0-1. 스레드 안전(Thread Safety) - 멀티 스레드 프로그래밍에서 어떤 함수나 변수, 혹은 객체가 여러 스레드로부터 동시에 접근이 이루어져도 프로그램의 실행에는 문제가 없음을 말한다. ex) 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행결과가 올바르게 출력되는 것. - 병렬 프로그램에서 단순히 스레드와 락(Lock)만 신경 써서 해결되지 않는다. 스레드와 락은 병렬 프로그램을 올바르게 잘 사용하기 위한 도구일 뿐이다. 2-0-2. 스레드에 안전한 코드를 작성하는 방법 - 공유되고 변경할 수 있는 스레드의 상태에 대한 접근을 관리하는 것 2-0-3. 객체의 상태 - 인..
·Language/Java
String 보다는 StringBuilder, StringBuffer를 사용해야하는 이유. 이유는 간단하다. String보다는 Stringbuilder 와 StringBuffer이 성능ㅇ ㅣ좋으므로.. 1. StringBuilder와 StringBuffer을 사용시 append 를 이용할 때 하지 말 것String str ="abcde";String a = new String();StringBuffer sb= new StringBuffer();StringBuilder sbs = new StringBuilder();long start = System.currentTimeMillis();for(int i=0; i
·Language/Java
Java static 키워드 - static은 '정적인, 움직이지 않는다'라는 뜻으로 메모리에 고정된다. 그래서 모든 인스턴스에 접근할 수 있도록 공유가되고 클래스 차원에서 정의된 필드 하여 'class field'라고 한다. 그러므로 static 키워드를 이요하면 객체를 생성하지 않고도 변수나 함수를 사용할 수 있다. - static area는 클래스가 메모리에 로딩되면서 static도 같이 올라가고, 프로그램이 종료되면 JVM에서 해당 메모리를 반환한다. - static은 메모리할당이 한 번만 이루어진다. static 키워드의 사용범위 1. 모든 인스턴스에 공통적으로 사용해야 할 경우 static을 붙인다.- 인스턴스를 생성하면, 서로 독립적이기 때문에 서로 다른 값을 유지하므로 각 인스턴스들이 공통..
·Language/Java
final 키워드 - final 키워드는 주로 class 나 method 의 override를 막기위해 사용- 맴버변수, 로컬변수는 변수 초기화 이후 바꿀수 없는 변수를 만드는 용도로 사용 1. 클래스에서 final 사용ex_) A 클래스에서 final 사용시 B 클래스는 A클래스를 상속을 할 수 없다. public final final A {}public class B extends A { } (X 상속불가) 2. 메서드에서 final 사용ex_) A클래스의 a()메서드에 final키워드 입력하고, B클래스에서 A클래스를 상속한 후 a()메서드를 오버라이드 할 수 없다.\public class A { public final void a() { } }public class B extends A { pub..
·Front-End/JSP
intro. 쿠키와 세션을 사용하는 이유? - 사용자의 정보를 지속적으로 유지하기 위해- HTTP 프로토콜은 비 연결지향형 통신이기 때문에 클라이언트에서 서버로정보 보내 처리 결과를 클라이언트가 받으면 기존에 있던 정보는 잃어버리기 때문에 쿠키와 세션을 이용하는 것이다. (대표적으로 로그인,장바구니 기능이 있다.) 1. 쿠키(Cookie) 1-1. 정의 - 사용자의 정보를 지속적으로 유지하기 위한 방법으로 사용- 쿠키는 서버가 아닌 클라이언트 컴퓨터 하드디스크에 사용자 정보를 저장한다.- 서버가 쿠키를 클라이언트에 저장해 두면 쿠키에 대한 정보를 필요로 하는 웹 페이지가 웹 서버에 요청될 때 저장해 놓은 쿠키에 대한 정보를 웹 서버에 다시 건내준다. 쿠키는 사용자 측에 대한 정보를 보관해두었다가 웹 서버..
·Language/Java
1. 파일채널 생성과 닫기 (1) 파일 채널 생성 - FileChannel은 정적 메소드인 open() 을 호출하여 사용하거나 IO의 FileInputStream, FileOutputStream의 getChannel() 메소드를 호출하여 사용할 수 있다. 1-1. open() 을이용한 파일생성 FileChannel fileChannel = FileChannel.open(Path path, OpenOption ... options); ex)FileChannel fileChannel = FileChannel.open(Paths.get("c://Temp/file.txt"), StandardOpenOption.READ); Paths은 파일의 경로를 지정하는 것이고 , OpenOptions은 StandardOpe..
조슈아。
'java' 태그의 글 목록 (3 Page)