사실은 자바와 관련된 내용을 올리려고 하는 곳인데..뭐 굳이 그럴 필요는 없을 듯 해서 .. 개인적인 용도와 겸사겸사해서 쓰려고 만든 블로그입니다.
2011년 5월 11일 수요일
2011년 5월 10일 화요일
2011년 5월 5일 목요일
안드로이드 SMS 메시지 가로채기
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i
msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null)
{
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i=0; i
str += "SMS from " + msgs[i].getOriginatingAddress();
str += " :";
str += msgs[i].getMessageBody().toString();
str += "\n";
}
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
2011년 4월 15일 금요일
오라클 계층형 게시판용 SQL
예를들어 다음과 같은 구조로 게시판을 만들어야 한다면?
1
2
3
6
4
5
7
create table tbl_board (
seqno number,
title varchar2(300) not null,
content varchar2(4000) not null,
writer varchar2(50) not null,
regdate date default sysdate,
updatedate date default sysdate,
gid number,
ord number,
pid number,
depth number
);
alter table tbl_board add constraint pk_board primary key (seqno);
drop sequence seq_board;
create sequence seq_board increment by 1;
delete tbl_board;
--원글 등록--
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title1','content1','user00', seq_board.currval, 0, 0, 0);
--2
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title2','content2','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);
--3
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2), 2, 2);
--4
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 2, 2);
--5
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);
--6
--select * from tbl_board start with pid= 3 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title6','content6','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3), 3, 3);
--7
select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title7','content7','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 2);
1
2
3
6
4
5
7
create table tbl_board (
seqno number,
title varchar2(300) not null,
content varchar2(4000) not null,
writer varchar2(50) not null,
regdate date default sysdate,
updatedate date default sysdate,
gid number,
ord number,
pid number,
depth number
);
alter table tbl_board add constraint pk_board primary key (seqno);
drop sequence seq_board;
create sequence seq_board increment by 1;
delete tbl_board;
--원글 등록--
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title1','content1','user00', seq_board.currval, 0, 0, 0);
--2
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title2','content2','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);
--3
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2), 2, 2);
--4
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 2 connect by pid = prior seqno) ) from tbl_board where seqno = 2);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 2, 2);
--5
--select * from tbl_board start with pid= 1 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title3','content3','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 1);
--6
--select * from tbl_board start with pid= 3 connect by pid = prior seqno;
--select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title6','content6','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 3 connect by pid = prior seqno) ) from tbl_board where seqno = 3), 3, 3);
--7
select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1;
update tbl_board set ord = ord + 1 where gid = 1 and ord >= (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1);
insert into tbl_board (seqno, title, content, writer, gid, ord, pid, depth)
values (seq_board.nextval, 'title7','content7','user00', 1, (select (ord + (select count(seqno) + 1 r from tbl_board start with pid= 1 connect by pid = prior seqno) ) from tbl_board where seqno = 1), 1, 2);
2011년 4월 12일 화요일
의존성 주입의 개념에 관하여
객체지향 프로그래밍에서 가장 신경을 많이 쓰는 것은 역시나 '객체의 구성'입니다.
예를 들어 A,B,C 라는 객체가 있다고 가정해 보면 가장 쉬운 방식의 구성은 '기차'와 같은 방식으로 연결하는 구조라고 할 수 있습니다.
이 방식을 전문적으로 ' Demeter'방식이라고 합니다.
이 방식은 A클래스안에 B b = new B( ); 와 같은 방식으로 다음에 연결될 객체를 의존적으로 사용하는 방식을 의미합니다.
Demeter 방식은 하나의 클래스를 여러 곳에서 사용하는 경우(그물망 구조)에는 아주 최악의 복잡성을 가지게 됩니다.
따라서 이런 상태에서는 효율적인 설계를 위해서 '기차'대신에 'G마켓'방식을 사용합니다.
(당근 공식용어일리가 없잖앗!)
전문적으로 'Facade'패턴이라고 하기도 하는데 우리가 G마켓을 통해서 물건을 구매하면 안쪽에서 실제 업체를 몰라도 되는 것과 비슷한 방식입니다.
우리가 알아야 하는 것은 'G마켓'의 역할을 하는 객체만 알고 사용하면 됩니다.
이 방식의 복잡성을 하나로 모으는 효과를 가집니다.(간단히 여러분이 여러개의 인터넷 쇼핑몰을 돌아다닐 필요가 없는것과 마찬가지 입니다)
이 방식의 코드는 예를 들어 A클래스 안에서 B target = Facade.get("B") 처럼 A가 G마켓 역할을 하는 존재만 알면 되도록 하는 구조를 사용합니다.
하지만 Facade역할을 하는 코드가 없다면 이 역시 무용지물이므로 전체구조가 경직되는 것을 피할 수는 없습니다.
이래서 등장한 방식이.. 음..
이해를 위한 거니까..
'시라노 연애 조작단' 방식과 같은 방식입니다.
즉 어떤 객체가 알아채지 못하게 알아서 모든 상황을 준비하는겁니다.
예를 들어 A가 B객체가 필요하다면
누군가 A를 필요로 할때 B객체를 미리 준비 시켜서 동행시키는 방식입니다.
즉 외부에서 필요한 객체(dependency) 를 집어넣는다(injection)는 개념으로 봐야합니다.
영화에서 보면 한 커플을 맺어주기 위해서 많은 스텝들이 움직이듯이..
외부에 거대한 존재가 A가 필요한 모든 다른 객체들을 준비해 두었다가 A를 사용하는 순간에 완벽한 상황을 만들어서 처리하는 방식이라고 생각할 수 있습니다.
의존성 주입은 A안에는 B 를 받아들이는 코드만 준비해 두고..
외부에서 B를 A에 넣은 상태로 만들어서 사용하는 방식이므로
A의 코드안에서 실제 new 하는 코드를 없앨 수 있게 됩니다.
예를 들어 A,B,C 라는 객체가 있다고 가정해 보면 가장 쉬운 방식의 구성은 '기차'와 같은 방식으로 연결하는 구조라고 할 수 있습니다.
이 방식을 전문적으로 ' Demeter'방식이라고 합니다.
이 방식은 A클래스안에 B b = new B( ); 와 같은 방식으로 다음에 연결될 객체를 의존적으로 사용하는 방식을 의미합니다.
Demeter 방식은 하나의 클래스를 여러 곳에서 사용하는 경우(그물망 구조)에는 아주 최악의 복잡성을 가지게 됩니다.
따라서 이런 상태에서는 효율적인 설계를 위해서 '기차'대신에 'G마켓'방식을 사용합니다.
(당근 공식용어일리가 없잖앗!)
전문적으로 'Facade'패턴이라고 하기도 하는데 우리가 G마켓을 통해서 물건을 구매하면 안쪽에서 실제 업체를 몰라도 되는 것과 비슷한 방식입니다.
우리가 알아야 하는 것은 'G마켓'의 역할을 하는 객체만 알고 사용하면 됩니다.
이 방식의 복잡성을 하나로 모으는 효과를 가집니다.(간단히 여러분이 여러개의 인터넷 쇼핑몰을 돌아다닐 필요가 없는것과 마찬가지 입니다)
이 방식의 코드는 예를 들어 A클래스 안에서 B target = Facade.get("B") 처럼 A가 G마켓 역할을 하는 존재만 알면 되도록 하는 구조를 사용합니다.
하지만 Facade역할을 하는 코드가 없다면 이 역시 무용지물이므로 전체구조가 경직되는 것을 피할 수는 없습니다.
이래서 등장한 방식이.. 음..
이해를 위한 거니까..
'시라노 연애 조작단' 방식과 같은 방식입니다.
즉 어떤 객체가 알아채지 못하게 알아서 모든 상황을 준비하는겁니다.
예를 들어 A가 B객체가 필요하다면
누군가 A를 필요로 할때 B객체를 미리 준비 시켜서 동행시키는 방식입니다.
즉 외부에서 필요한 객체(dependency) 를 집어넣는다(injection)는 개념으로 봐야합니다.
영화에서 보면 한 커플을 맺어주기 위해서 많은 스텝들이 움직이듯이..
외부에 거대한 존재가 A가 필요한 모든 다른 객체들을 준비해 두었다가 A를 사용하는 순간에 완벽한 상황을 만들어서 처리하는 방식이라고 생각할 수 있습니다.
의존성 주입은 A안에는 B 를 받아들이는 코드만 준비해 두고..
외부에서 B를 A에 넣은 상태로 만들어서 사용하는 방식이므로
A의 코드안에서 실제 new 하는 코드를 없앨 수 있게 됩니다.
2011년 4월 10일 일요일
상속을 어떻게 적용하면 좋을까? 문제입니다.
패스트 푸드(맥도널드나 버거킹)에 가보면 많은 메뉴가 있습니다.
예를 들어 맥도널드 메뉴를 몇 개만 가정해 봅니다.
빅맥, 불고기버거, 새우버거
이 모든 메뉴들은 세트메뉴를 지원하고 있습니다.
그리고 이 메뉴들은 특별히 활인이나 적립이 허락됩니다.
보통의 통신사 카드들은 10%의 할인율을 가지고,
적립카드는 5%의 금액을 적립해 줍니다.
그렇다면 위의 데이터들을 기초로 해서 클래스로 만들려면 어떻게 해야 할까요?
상속인가? 조합인가?
예를 들어 맥도널드 메뉴를 몇 개만 가정해 봅니다.
빅맥, 불고기버거, 새우버거
이 모든 메뉴들은 세트메뉴를 지원하고 있습니다.
그리고 이 메뉴들은 특별히 활인이나 적립이 허락됩니다.
보통의 통신사 카드들은 10%의 할인율을 가지고,
적립카드는 5%의 금액을 적립해 줍니다.
그렇다면 위의 데이터들을 기초로 해서 클래스로 만들려면 어떻게 해야 할까요?
상속인가? 조합인가?
2011년 3월 24일 목요일
자바는 구현하는 언어가 아닌 설계의 언어
흔히들 Java는 메모리 관리를 하지 않아도 되기 때문에 프로그래밍이 참 쉽다고 생각한다.
음.. 뭐 굳이 비유를 들자면 '오토'자동차가 점점 좋아지니 '수동'기어의 운전을 하는 사람들이
점점 드물어 진다고 할까?
그럼 반대로 생각해보자.
'오토'는 나쁘고 '수동'은 좋은가?
여기에 무작정 '그렇다'고 자신있게 대답할 사람은 드물것이다.
만일 여러분이 스포츠 카의 매니아라면 SUV같은 차는 쓰레기 같은 차라고 생각할 지도 모른다.
만일 여러분이 음악에 문외한이라면 세계적인 거장이 지하철에서 연주해도 그냥 지나칠지도 모른다.
즉 모든 판단은 그때 자신이 가진 정보와 상황에 맞출수 밖에 없다고 생각해 볼 수 있다.
Java역시 마찬가지다.
프로그램의 속도와 깊이를 따지는 사람에게 Java는 그냥 오토매틱 자동차이겠지만,
모든 사람들이 프로그램을 모시고 사는 것은 아니지 않은가?
요즘 나오는 언어들을 보면 Java보다 훨씬 더 간단하고 우아하게 코드를 작성한다.
짧은 코드와 간단한 실행..
그렇다면 Java라는 언어는 '빠르지도 않고, 간편하지도 않은' 언어가 되고 만다.
그런 언어가 아직까지 세계에서 가장 많이 쓰이는 언어가 되었을까?
내가 생각하는 것은
Java라는 언어가 설계에 아주 적합한 언어이기 때문이 아닐까 싶다.
즉 Java는 뼈대를 세우고, 여러 명이 협업해야 하는 상황에서 거의 공통적인 코드를 만들어 낼 수 있는 정형화된 방법을 아주 많이 제공하고 있다.
'인터페이스'나 '추상클래스'와 같은 구조의 뼈대에
다른 개발자들이 만들어도 큰 뼈대를 벗어나지 않는 느낌..
Java를 처음 공부하는 사람들은 반드시 생각해 봐야 하는 사실이 바로 이런 점이다.
'내가 왜 Java를 선택했지?'
'그냥 유행따라서?'
제발 대학에서 이런 생각을 좀 가르쳐주면 좋겠다.
뭘 만들기 전에 어떻게 언어를 공부해야 하는지..
어떤 언어가 어떤 특징이 있는지..
가끔은 '뭐 언어가 다 똑같지... '
라고 말하는 개발자들을 본다.
겉으로 그들에게 뭐라고 반기를 들지 않지만..
속으로는 이렇게 말한다.
'람보가 불어로 중얼거리면 얼마나 웃길까?'
적어도 언어를 공부하면 그 언어에 맞게 만들어 내기는 해야 하지 않을까?
음.. 뭐 굳이 비유를 들자면 '오토'자동차가 점점 좋아지니 '수동'기어의 운전을 하는 사람들이
점점 드물어 진다고 할까?
그럼 반대로 생각해보자.
'오토'는 나쁘고 '수동'은 좋은가?
여기에 무작정 '그렇다'고 자신있게 대답할 사람은 드물것이다.
만일 여러분이 스포츠 카의 매니아라면 SUV같은 차는 쓰레기 같은 차라고 생각할 지도 모른다.
만일 여러분이 음악에 문외한이라면 세계적인 거장이 지하철에서 연주해도 그냥 지나칠지도 모른다.
즉 모든 판단은 그때 자신이 가진 정보와 상황에 맞출수 밖에 없다고 생각해 볼 수 있다.
Java역시 마찬가지다.
프로그램의 속도와 깊이를 따지는 사람에게 Java는 그냥 오토매틱 자동차이겠지만,
모든 사람들이 프로그램을 모시고 사는 것은 아니지 않은가?
요즘 나오는 언어들을 보면 Java보다 훨씬 더 간단하고 우아하게 코드를 작성한다.
짧은 코드와 간단한 실행..
그렇다면 Java라는 언어는 '빠르지도 않고, 간편하지도 않은' 언어가 되고 만다.
그런 언어가 아직까지 세계에서 가장 많이 쓰이는 언어가 되었을까?
내가 생각하는 것은
Java라는 언어가 설계에 아주 적합한 언어이기 때문이 아닐까 싶다.
즉 Java는 뼈대를 세우고, 여러 명이 협업해야 하는 상황에서 거의 공통적인 코드를 만들어 낼 수 있는 정형화된 방법을 아주 많이 제공하고 있다.
'인터페이스'나 '추상클래스'와 같은 구조의 뼈대에
다른 개발자들이 만들어도 큰 뼈대를 벗어나지 않는 느낌..
Java를 처음 공부하는 사람들은 반드시 생각해 봐야 하는 사실이 바로 이런 점이다.
'내가 왜 Java를 선택했지?'
'그냥 유행따라서?'
제발 대학에서 이런 생각을 좀 가르쳐주면 좋겠다.
뭘 만들기 전에 어떻게 언어를 공부해야 하는지..
어떤 언어가 어떤 특징이 있는지..
가끔은 '뭐 언어가 다 똑같지... '
라고 말하는 개발자들을 본다.
겉으로 그들에게 뭐라고 반기를 들지 않지만..
속으로는 이렇게 말한다.
'람보가 불어로 중얼거리면 얼마나 웃길까?'
적어도 언어를 공부하면 그 언어에 맞게 만들어 내기는 해야 하지 않을까?
피드 구독하기:
글 (Atom)