기본 콘텐츠로 건너뛰기

0.1 + 0.2 == 0.30000000000000004

이번 글을 보는 사람들은 이미 0.1 + 0.2의 결과를 보고 당황스러움을 경험했을듯 싶다. 눈을 의심해봤자 소용없다. 컴퓨터는 0.1 + 0.2를 계산하지못한다는걸 받아들이자. 조금더 정확하게 얘기하면 2진수는 10진수 0.1을 정확하게 변경 할 수 없게끔 만들어졌다. 이유는 다음과 같다. 우선, 몸풀기로 10진수 정수를 2진수로 변환해보면 5(10) -> 101(2) = 2^2 + 2^0 이다. 그럼 소수를 다뤄보자 0.5(10)을 2진수로 변경하면 0.1(2)이 된다. 뒤에 0.1은 2^-1 이다. 그러므로 0.01(2) -> 2^-2 -> 0.25 이다. 반면에 0.1(10)은 0.0001100110011... (2) 이다. (1/3을 십진수로 표시못하는 이유와 비슷하다) 즉 소수부분이 순환소수가 아니라 딱 떨어지는 수가 되려면 An = 1/2n 으로 표현되는 수들의 합으로 이루어지는 수가 되어야하고 그렇지 않는 수들은 전부 반올림이 필요한 소수가 된다. 결론적으로 소수 연산이 필요하다면 우선 정수로 변환을 해서 계산을하고 소수로 변경해줘야 할 듯 싶다.

[오라클] update, insert 한번에 (merge into)

두번할꺼 한번에 해주는 편한기능이다. 그렇다고 모든 insert나 update를 이렇게 할필요는 없다. '걍 insert 하믄 되지 뭘 왜 select를 하구있어' 라는 소리를 들을수도 있다. 보통 개발진행중이거나, 배치작업같은데서 종종 필요할듯 싶다. MERGE INTO RequestTable RT -- 이번 쿼리의 대상이 되는 테이블 USING JoinTable JT -- 조인이 필요한 테이블 ON (RT.col1 = JT.col1..) -- 조인조건 WHEN MATCHED THEN -- 조건에 합당할경우 / 데이터가 있는경우 UPDATE SET -- updqte, set 사이에 테이블명을 명시하지 않음 RT.col2 = JT.col2 ,RT.col3 = JT.col3 ,RT.col4 = JT.col4 WHEN NOT MATCHED THEN -- 조건에 안맞음 / 데이터가 없는경우 INSERT (col1, col2, col3) VALUES ( JT.col1 , JT.col2 , JT.col3 ); 여기서는 update, insert만 썼지만 delete도 얼마든지 가능하다.

[오라클] 테이블 복사 (Creat Table As Selcet)

이따금씩 테이블 복제가 필요한 경우가 있다. 보통 개발이나 테스트시에 임시로 백업이 필요한 경우에 종종쓴다 그럴때마다 crate 하고 insert를 별도로 할필요없이  한번에 할 수있다.  create table new_table as select * from org_table org_table을 new_table로 복사하는 sql이다.  Creat Table As Selcet 을 줄여서 CTAS라고도 많이 부르는것 같다.  만약에  해당 테이블의 스키마만 복사하고 싶을때는  where 조건을 추가해서 select구문의 결과값이 하나도 안나오게끔 해주면 된다.  create table new_table as select * from org_table where 1 = 0

public, private 차이

public, private 기본중에 기본 근데 아직도 뭔가 헷갈린다. private : 내부만 접근 public : 외부에서도 접근 내부외부라는 말이 좀 애매하다. 암튼 예로 클래스를 하나 만들자 멤버 변수를 설정할때 한놈은 private, 한놈은 public public class ch1 { public int a ; private int b ; } 이클래스를 가지고 가장 간단하고 확실하게 테스트 해보자 public class test { public static void main(String [] args){ ch1 c = new ch1(); c. a = 10 ; c. b = 20 ; System. out .println(c. a ); System. out .println(c. b ); } } 위대로 컴파일 해대면 바로 오류난다. Error:(9, 10) java: b has private access in ch1 라고.. c는 ch1을 가지고 새로운 객체를 만들었지만, private으로 선언된 변수는 자기 멤버변수라고해도 맘대로 접근을 할수가 없다. 그렇다면 c.b를 건드리려면 어케 해야되나 public class ch1 { public int a ; private int b ; public void setB ( int val){ this . b =val; } public int getB (){ return this . b ; } } 이럴때 쓰라고 만든게 게터세터 다. private한것들은 이처럼 클래스 자체 메소드를 활용해야만 쓸 수 있다. 이렇게 되면 최초 클래스를 생성한 쪽에서만 내부 사정을 알고 이걸 사용하는 사용자 입장에서는 메뉴얼대로 실행만 하면된다. 즉 setB에다가 val이 0보다...

css - position (static, relative, absolute, fixed 차이)

element의 위치를 정할때 position을 사용한다. 현재의 element의 상황을 고려하여 기준 을 정하고 그기준으로 부터 top, bottom, left, right 의 속성을 사용해서, 위치를 디테일하게 잡으면 된다. static : 프로그래밍에서 쓰는 static 키워드 처럼 위치 값이 먹지 않는다. relative : 이전의 element가 기준이 된다 그로부터 위치값을 계산한다. absolute : 부모 element가 기준이다. 그러나 static은 무시한다. fixed : absolute 처럼 부모가 기준이나, 스크롤질을 해도 위치가 변경되지 않는다. 위젯으로 써먹기 딱 좋다.

css - padding, margin 차이

http://www.w3schools.com/css/css_boxmodel.asp 마진이나 패딩이나 둘다 여백을 주는 방식이다. 그차이는 border부분을 기준으로 했을때 내부에 줄것인가 외부에 줄것이냐의 차이다. 크기 200px 짜리에 분홍색 박스안에 테스트를 하기위한 분홍색박스의 절반크기인 100px 짜리 회색 박스를 집어넣었다. 그리고 padding과 margin을 텍스트박스크기만큼 집어넣었다. (top, right, bottom, left 모두 50px) padding은 border내부에 여백을 채우느라 상위 박스크키만큼 커져버렸고, margin은 border외부의 여백을 조정하다보니 정가운데 위치하게됬다. 그리고, 잘보면 padding과 margin의 텍스트 위치는 동일하다. 즉 이 border 내부의 content는 아직까지 모두 100px이다 content의 위치나 사이즈가 변하는건 아니다. 그리고 만약 분홍색, 회색박스가 모두 흰색이고 둘다 border는 0px로 하여 안보이게 했다면 여기서는 전혀 차이가 없을 수도 있다.

iframe 사용시 주의점

iframe을 이따금씩 사용하게 되는데, 그거 뭐 별거 있어 냥 하믄되지라고 시작했다가 iframe에서 form전송 하나 하는데 낭패를 보게된적이 있었다. 아래 두가지정도만 미리 알고 시작하면 조금더 수월하게 시작할 수 있었을 듯 하다. 1. cross domain 문제 parent 와 child 사이트가 서로 다른 주소를 사용하면 정상적으로 동작하지 않는다. www.abc.com 내에서 < iframe src = "http://www.zyx.com" ></ iframe > 도메인주소는 같지만 서브도메인 주소가 다른 경우에도 마찬가지로 같은 문제가 발생한다. www.abc.com 내에서 < iframe src = "http://sub.abc.com" ></ iframe > 그래서 이럴경우에는 도메인 주소를 인위적으로 동일하게 설정을 해주어야한다. < script > document .domain = " abc.com " </ script > 결론적으로 document.domain의 값이 일치해야만 cross domain은 해결이 되는것 같다. 기본적으로 별다른 설정이 없다면 document.domain은 서브도메인 주소까지 가지고 있다. 2. form전송 위에처럼 cross domain 문제를 해결하고, form을 만들어 ajax가 아닌 서브밋을 할경우 리턴페이지가 현재 iframe 내부가 아닌 새창에서 호출될 수 있다. form의 속성값중 'target'을 설정해줘서 해결을 해야 한다. form. target = '_self' 속성값은 '_self' 외에도 몇가지 더 있으니 참조해서 사용하면 좋을듯 하다. Value Description _blank Opens in a new window _self Opens in the s...