본문 바로가기

프로그래밍/JAVA

Subclipse(SVN)에서 충돌(conflict)이 일어나는 경우 해결법 예전에 한 친구와 프로젝트를 같이 진행한 적이 있었다. 그때 svn을 사용해서 개발하려고 subclipse를 설치해서 사용했다. 그리고 열심히 프로젝트를 진행하려고 하는데 크나큰 문제점이 닥쳤다. revision1 인 파일을 나와 내 친구가 update를 통해 받은 상태에서 각자의 작업을 진행하고 있었고, 내 친구가 먼저 수정을 끝내고 commit을 했다. 나도 얼마있지 않아서 작업을 끝내고 commit을 하려고하는데 error가 발생했다. 이유는 revision 때문이었다. 친구가 commit을 한 순간 그 파일은 revision2가 HEAD로 된다. 그런데 나는 revision1을 가지고 수정을 한 상태이니, 당연히 commit을 못하도록 막는 것이다. 그런데 오늘에서야 그 해결책을 찾아냈다. 방법은.. 더보기
함수의 원자성(atomicity) 보장 멀티 쓰레드(multi-thread) 기반의 프로그래밍을 하게 되면 중요한 것이 바로 원자성의 보장이다. 그렇다면 원자성이 무엇인가? 원자성이란 여러개의 쓰레드가 있을 때 특정 시점에 어떤 메소드를 두개 이상의 쓰레드가 동시에 호출 못한다는 것이다. 간단한 예를 들어보자. class Job implements Runnable { public void run() { while(true) { go(); stop(); } } public void go() { /* 매우 중요한 작업이다 */ } public void stop() { /* 그냥 일반적인 작업이다. */ } } 위의 Job 클래스를 보면 run()메소드에서 go()와 stop()메소드를 무한 호출하고 있다. 그런데 여기에서 go()메소드가 아주 중.. 더보기
자바에서 쓰레드를 사용하는 방법 자바를 이용해서 프로젝트를 진행하면 사용하는 클래스에 대해서는 거의 모르는 게 없게 된다. 하지만 프로젝트를 할 때에는 잘하다가도 손 놓으면 잊어버리게 되는 것 중 하나가 바로 쓰레드를 사용하는 것이다. 그래서 오늘은 쓰레드를 사용하는 방법에 대해 정리해 보자. 먼저 쓰레드를 사용하기 위해서는 Runnable 인터페이스와 Thread 클래스가 필요하다. Thread 클래스는 새로운 작업을 맡게되는 일꾼이라고 생각하면 되고, Runnable 인터페이스를 구현하는 객체가 실질적인 일이 되겠다. 또 Runnable 인터페이스를 구현하는 클래스는 run()함수에 쓰레드에서 작업할 일을 넣으면 된다. 그렇다면 간단한 예제를 살펴보도록 하자. public class Job implements Runnable { p.. 더보기
직렬화를 할 때 유의해야 할 사항 자바에서는 직렬화를 통해서 객체를 손쉽게 저장하고 읽어올 수 있다. 하지만 이를 사용할 때에는 한가지 유의해야 할 점이 있다. 한 상황을 생각해보자. 자동차를 관리하는 프로그램을 만들었다고 하자. 이 프로그램은 자동차 객체를 생성하여 직렬화 한 다음에 이를 파일에 저장해서 자동차 목록을 관리한다. 사용자는 아무 불편없이 프로그램을 잘 사용하고 있었다. 그런데 어느날 유명한 자동차 회사에서 자동차에 하늘을 날 수 있는 기능을 추가했다. 그래서 내가 만든 자동차 관리 프로그램에서 자동차가 하늘을 날 수 있는지 없는지를 나타내는 속성이 필요해졌다. 그래서 한치의 망설임도 없이 자동차 클래스에 canFly라는 boolean형의 변수를 추가했다. 그리고 나서 고객에게 업데이트 된 프로그램을 재배포했다. 그런데 배.. 더보기
자바 - 직렬화 (Serializable) 자바에서는 객체를 손쉽게 저장하거나 전송할 수 있는데, 이를 가능하게 하는 기술이 바로 직렬화입니다. 원래 객체는 힙 안에 존재하게 되는데 직렬화를 하게 되면 그 모양이 약간 변형되게 됩니다. 이렇게 하게 되면 자바에서 저장 및 전송에 아주 편리하고 유리하다는 장점이 있지만, 동시에 다른 프로그램에서는 이를 분석하기 힘들다는 단점이 있습니다. (물론 직렬화를 통해 어떤식으로 변형이 되는지 그 원리만 잘 알고 있다면 다른 프로그램에서도 얼마든지 읽고 쓰는 것이 가능할 것입니다.) 1.Serializable 직렬화를 하기 위해서는 저장하거나 전송할 객체에 Serializable이라는 인터페이스를 구현해 주어야 합니다. 이 Serializable 인터페이스는 구현할 메소드가 하나도 없기 때문에 그냥 imple.. 더보기
스택과 힙 1. 스택(Stack) 스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다. 메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다. 2. 힙(Heap) 힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다. *만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까? 객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, f.. 더보기