본문 바로가기

프로그래밍

자바에서 쓰레드를 사용하는 방법 자바를 이용해서 프로젝트를 진행하면 사용하는 클래스에 대해서는 거의 모르는 게 없게 된다. 하지만 프로젝트를 할 때에는 잘하다가도 손 놓으면 잊어버리게 되는 것 중 하나가 바로 쓰레드를 사용하는 것이다. 그래서 오늘은 쓰레드를 사용하는 방법에 대해 정리해 보자. 먼저 쓰레드를 사용하기 위해서는 Runnable 인터페이스와 Thread 클래스가 필요하다. Thread 클래스는 새로운 작업을 맡게되는 일꾼이라고 생각하면 되고, Runnable 인터페이스를 구현하는 객체가 실질적인 일이 되겠다. 또 Runnable 인터페이스를 구현하는 클래스는 run()함수에 쓰레드에서 작업할 일을 넣으면 된다. 그렇다면 간단한 예제를 살펴보도록 하자. public class Job implements Runnable { p.. 더보기
안드로이드 타임라인 안드로이드 역사이다. 한번 둘러보는 것도 괜찮을 듯. 출처 : http://itviewpoint.com/153275 더보기
직렬화를 할 때 유의해야 할 사항 자바에서는 직렬화를 통해서 객체를 손쉽게 저장하고 읽어올 수 있다. 하지만 이를 사용할 때에는 한가지 유의해야 할 점이 있다. 한 상황을 생각해보자. 자동차를 관리하는 프로그램을 만들었다고 하자. 이 프로그램은 자동차 객체를 생성하여 직렬화 한 다음에 이를 파일에 저장해서 자동차 목록을 관리한다. 사용자는 아무 불편없이 프로그램을 잘 사용하고 있었다. 그런데 어느날 유명한 자동차 회사에서 자동차에 하늘을 날 수 있는 기능을 추가했다. 그래서 내가 만든 자동차 관리 프로그램에서 자동차가 하늘을 날 수 있는지 없는지를 나타내는 속성이 필요해졌다. 그래서 한치의 망설임도 없이 자동차 클래스에 canFly라는 boolean형의 변수를 추가했다. 그리고 나서 고객에게 업데이트 된 프로그램을 재배포했다. 그런데 배.. 더보기
자바 - 직렬화 (Serializable) 자바에서는 객체를 손쉽게 저장하거나 전송할 수 있는데, 이를 가능하게 하는 기술이 바로 직렬화입니다. 원래 객체는 힙 안에 존재하게 되는데 직렬화를 하게 되면 그 모양이 약간 변형되게 됩니다. 이렇게 하게 되면 자바에서 저장 및 전송에 아주 편리하고 유리하다는 장점이 있지만, 동시에 다른 프로그램에서는 이를 분석하기 힘들다는 단점이 있습니다. (물론 직렬화를 통해 어떤식으로 변형이 되는지 그 원리만 잘 알고 있다면 다른 프로그램에서도 얼마든지 읽고 쓰는 것이 가능할 것입니다.) 1.Serializable 직렬화를 하기 위해서는 저장하거나 전송할 객체에 Serializable이라는 인터페이스를 구현해 주어야 합니다. 이 Serializable 인터페이스는 구현할 메소드가 하나도 없기 때문에 그냥 imple.. 더보기
스택과 힙 1. 스택(Stack) 스택은 지역변수(메소드 내에 존재하는 변수, 메소드의 인자)가 존재하는 공간이다. 메소드를 호출하면 호출 스택(call stack)의 맨 위에 stack frame(코드, 지역 변수 값)이 쌓이게 된다. 함수호출이 끝나야만 호출 스택에서 해당 스택 프레임을 pop하게 된다. 2. 힙(Heap) 힙은 객체가 존재하는 공간이고, 당연히 인스턴스 변수(클래스 내에 선언되어 있는 변수)도 이 안에 존재한다. 여기에서 힙은 일반적인 힙과는 약간 다르다. 왜냐하면 garbage collection을 하는 힙이기 때문이다. *만약 메소드 내에서 객체를 생성하면 이는 스택에 들어갈까? 아니면 힙에 들어갈까? 객체가 생성되면 무조건 힙에 생성된다. 그리고 primitive 타입의 변수(int, f.. 더보기
cout에서 소수점 둘째자리 표현하기 cout의 setf함수. 출력의 형식을 정할 수 있다. 인자로는 여러개의 플래그가 |(or)로 같이 들어갈 수 있다. 소수점 2자리까지 표현하기 위해서는 다음과 같이 코딩한다. cout.setf(ios::fixed); cout.precision(2); 더보기
advance()함수 void std::advance(_InIt & _Where, _Diff _Off) iterator를 원하는 위치로 옮길 수 있는 함수이다. 컨테이너의 iterator를 i번째 위치로 옮기고 싶을 때 사용할 수 있다. 첫번째 인자로는 iterator가 들어가고 두번째 인자로는 오프셋이 들어간다. 결과로는 현재 iterator를 오프셋만큼 뒤로 이동시킨다. vector a; vector::iterator it; a.push_back(13); a.push_back(2); a.push_back(3); it = a.begin(); int n; n = 0; advance(it, n); cout 더보기
포인터(Pointer)와 함수 swap함수는 대개 다음과 같이 만든다. void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; } 이렇게 하는 이유는 포인터가 아닌 그냥 변수를 넣어줄 경우에 원하는 결과가 나오지 않기 때문이다. 이유인 즉, 함수를 호출할 때에 새로운 스택이 잡히게 되고 함수의 인자도 그 스택 안에 새로 할당된 값이다. 그런데 이때 변수 값을 넘겨주게 되면 함수에 있는 인자에 그 값이 들어가게 되는 것이다. 예를 들어 void swap(int a, int b) { int temp = a; a = b; b = temp; } 라는 함수를 만들고 main에서 i=2, j=3을 할당한 뒤 swap(i, j);를 호출하면 새로운 스택이 만들어 지는데, 이 스택의 a라는 .. 더보기
memset() 함수 void *memset( void *dest, int c, size_t count ); 대략적인 사용법은 아래와 같다. char a[10]이 있고, c의 각 원소를 0으로 초기화 해주려면 memset(a, 0, 10); // 또는 memset(a, 0, sizeof(a)); 여기에 두번째 원소에 어떠한 정수를 넣어주냐에 따라 초기화되는 값이 바뀌는 것이다. 그런데 여기서 주의할 점은 무조건 1바이트씩 초기화한다는 것이다. 이것이 무슨 말이냐면,, char a[10]의 경우에는 아무런 문제도 찾을 수 없다. 하지만 int a[10]의 경우에는 말이 다르다. memset(a, 0, 10); 하게 되면 문제를 못 느낄지도 모른다. 하지만, memset(a, 1, 10);을 하는 순간 경악을 하게 될 지도 모른.. 더보기
윈도우 모바일 VS 안드로이드 VS 아이폰 윈도우 모바일 (WM) 안드로이드 (Android) 아이폰 (iPhone) 개발 OS Windows Only Windows, MacOSX, Linux MacOSX Only (include Hackintosh) 개발툴 Visual Studio 2005, 2008 Eclipse 3.3, 3.4 Xcode 3.1, Interface Builder 프로그래밍 언어 Visual C++, C#, VB.NET Java Objective-C 프레임워크 or 런타임 MFC, .NET Compact Framework Android Application Framework, Dalvik Cocoa Touch 바이너리 .exe (CLR) .dex (Dalvik executable) .app 패키징 .cab .apk .zip 표.. 더보기