기본 콘텐츠로 건너뛰기

2015의 게시물 표시

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

데이터시각화

정의   데이터 시각화 (data visualization)는 데이터 분석 결과를 쉽게 이해할 수 있도록 시각적으로 표현하고 전달되는 과정 ( https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EC%8B%9C%EA%B0%81%ED%99%94 ) 단계설명 정보  조직화 단계 사용자의 정보 인지에 관여 혼돈의 상태로 존재하는 데이터를 분류하고 배열하고 조직화하여 질서를 부여 정보  시각화 단계 사용자의 정보 지각에 관여 보다 효율적으로 정보 전달을 위해 시각, 청각, 촉각, 미각, 후각의 감각 기관에 최적의 자극을 제시하는 방법 제시 상호작용  단계 정보와 사용자 간의 상호작용 측면의 사용자 경험을 디자인 정보의 인지적 요인뿐만 아니라 지각적 요인을 함께 활용 정보 시각화 단계와 밀접하게 연동되면서 동시에 입력 기술의 특성도 함께 고려  관련자료 데이터시각화 업체  뉴스젤리 : 데이터 전략수립, 수집, 분석, 시각화 ( http://blog.newsjel.ly/%EB%89%B4%EC%8A%A4%EC%A0%A4%EB%A6%AC/ )     데이터시각화 툴  태블로 :  http://www.tableau.com/   차트관련 js 기본적으로 사용하는 차트는 line, pie, bar, area, radar, map 정도 라이브러리내에는 차트의 종류는 달라지더라도 색은 비슷  html5 canvas 기반이 많음. ie구버전이 호환안되는 경우가 있을 수 있음. 대부분 반응형 웹 지원 어떻게 혼합해서 사용할지 고민필요 d3.js  https://github.com/mbostock/d3/wiki/Gallery googlechart  https://developers.google.com/chart/ chart.js  http://www.chartjs.org/  - 기본 chartist.js  http://gionkunz.gith

chap 14. 패턴매칭과 케이스클래스

1. switch-case scala> ch match { | case '+' => 1 | case '-' => - 1 | case _ => 0 | } 스칼라에서 사용하는 switch-case 이다. _ 으로 default 문의 역할을 할 수 있다. break 문이 안보이는게 기본적인 특징이다. 스칼라에서는 match-case를 자바보다는 좀더 자주 사용하는듯하다. 2. 가드 가드를 사용할 수 도 있다. scala> ch match { | case i if i == 1 => "one" | case i if i == 2 => "two" | case _ => "some other number" | } scala> ch match { | case x : Int => x | case s : String => Integer.parseInt(s) | case _ : BigInt => Int.MaxValue | } 그리고 변수를 활용하기도하고, asInstanceOf와 같은 형식으로도 많이 사용한다. switch-case문을 조금더 동적으로, 제네릭하게 사용할 여지가 생긴다. 3. case class 패턴칭매에서 편하기 사용하기 위한 클래스이다.  - new를 사용하지 않고 인스턴스를 생성 가능  - toString, equals, hashCode, copy 메소드 생성 scala> case class Calculator (brand: String , model: String ) defined class Calculator 인스턴스생성 scala> val hp20b = Calculato

get, post 차이

HTTP 메소드중에 가장 많이는 방식은 get과 post일듯 하다 이둘은 비교도 참 많이 당한다. 대강 살펴보면, get은 url이 보이고, post는 숨기는 방식 민간함데이터를 전달할 시에는 보안상 post방식이 좀더 현명한 선택인듯하다. 여기 까지가 깊게 생각안해봤던 내가 할 수 있는 대답.. ㅎ 그래서 오늘은 조금 더 살짝 들어가서 몇가지 더 차이점을 정리하려고 한다. 다행히  w3schools   정리가 되어있었다. 들여다보면 우선, get방식은 url에 파라미터가 보인다 . 이로인해 다음과 같은 결과가 초래할수 있다. 1. 브라우저캐싱 2. 즐겨찾기에추가 3. 브라우저히스토리에 저장 4. 글자길이제한(url 최대길이 2048 char) url로 전달하는것과 form을 만들어서 전달하는것 역시 차이 가있다. 1. post방식은 form을 binary 형태로 전달 한다. 2. url은 application/x-www-form-urlencoded 타입에 제한되지만 post는 파일전송을 위한 multipart/form-data 도 제공한다. 3. url은 ascii 방식, post는 바이너리 방식 4. post는 body태그안에 form을 만들어야 하므로 url을 직접던지는 방식보다 조금 느릴 수 있다. 결론적으로 암호와 같은 민감한 정보들은 되도록이면 post방식으로해야하고, 트래픽이 엄청많은 곳에서 단순정보조회같은것들은 get방식으로하면 되지싶다. Compare GET vs. POST The following table compares the two HTTP methods: GET and POST. GET POST BACK button/Reload Harmless Data will be re-submitted (the browser should alert the user that the data are about to be re-submitted) Bookmarked Can be

chap13 콜렉션 (Collections)

1. 콜렉션 계층도 scala의 콜렉션 계층도는 이렇다. 크게, set,map,seq http://docs.scala-lang.org/tutorials/FAQ/collections.html 2. 수정가능한 콜렉션과 수정불가능한 콜렉션  앞의 Map 을 다룰때 한번 나왔었다, immutable, mutable한 Map  수정불가능한것은 값이 변하지 않으니 안전하게 참조할 수 있어 좋다.  스칼라에서는 별도 명시가 없을 경우 immutable 한 경우로 취급한다. 3. 시퀀스  Vector는 Arraybuffer의 수정불가능한 버전, 각노드가 32개까지 자식을 가질 수 있는 트리로 구현된다. 백만개의 원소가 있는 벡터는 4개의 노드 레이어가 필요(10의6승 ~ 32의4승) 그래서 4번만의 접근이 가능.  Range는 시퀀스의 모든값을 저장하지 않는다. 시작, 종료, 증가분만 저장, to, until 메소드로 생성된다. 4. 리스트 scala> val digits = List(4,2) digits: List [ Int ] = List ( 4 , 2 ) scala> digits.head res0: Int = 4 scala> digits.tail res1: List [ Int ] = List ( 2 ) scala> digits.tail.head res2: Int = 2 :: 연산자로 리스트 멤버를 추가 scala> 9 :: digits res4: List [ Int ] = List ( 9 , 4 , 2 ) List에서 원소들을 방문할때 이터레이터를 사용하지만 스칼라에서는 재귀를 사용하는게 자연스럽다 scala> def sum (lst: List [ Int ]): Int = | if (lst== Nil ) 0 else lst.head + sum(lst.tail) sum: (lst: List [ Int ]) Int scala> sum(digits)

html 이미지 로드 실패시 사용할 디폴트 이미지

초간단 개꿀팁. 이걸 여지껏 모르고있었다니, 씁쓸할뿐. < img   src= "image.gif"   onerror= "myFunction()" > 코드만 봐도 감오시쥬? ㅋ img태그의 src링크를 가져오는게 정상적으로 되지 않을때, onerror 로 대신 동작을 정의 할 수 있다. 크롬,ie,파폭,사파리 전부지원. onerror에서 함수로 처리해도 되고, 바로 디폴트 이미지를 걸고 싶으면 < img   src= "image.gif"   onerror= "javascript:src={url}" > 이렇게 할 수 있다. 참고  http://www.w3schools.com/jsref/event_onerror.asp

chap 12 고차함수 (high-order-function)

고차함수   - 함수를 인자로 받거나, 리턴해주는 함수 1. 값으로서 함수   - 함수를 변수에 저장할수 있다. scala> val fun = ceil _ fun: Double => Double = < function1 > ceil은 임의수보다 크거나 같은 수 가장 작은 수를 리턴해주는 함수이다. 기술적으로 _는 ceil 메소드를 함수로 바꾼다. 스칼라에서 메소드는 조작할 수 없고, 오직 함수만 가능. 2. 익명함수 scala> Array ( 3.14 , 1.42 , 2.0 ).map((x: Double )=> 3 *x) res5: Array [ Double ] = Array ( 9.42 , 4.26 , 6.0 ) 익명클래스도 그렇고, 이제는 익명이 조금 익숙해지기 시작한다. 함수의 실행순서가 중요해보인다. 3. 함수인자를 받는함수 scala> def mulBy (factor : Double ) = (x : Double ) => factor * x mulBy: (factor: Double ) Double => Double scala> val quintuple = mulBy( 5 ) quintuple: Double => Double = < function1 > scala> quintuple( 20 ) res7: Double = 100.0 quintuple 은 mulBy(5) 즉, (x:Double) => 5 * x 를 리턴한다. mulBy는 어떤 값을 곱하는 함수를 생성한다. 팩토리 같기도하고 클래스 같기도하고..  ㅎ 4. 인자추론 scala> def valueAtOneQuarter (f:( Double ) => Double ) = f( 0.25 ) valueAtOneQuarter: (f: Double => Double ) Double scala> valueAtOneQuarter

chap 10. trait

trait. 일단 java의 interface 같은 놈인듯 한데, 뭔가 다른게 있는것 같다. 1. 다중상속의 문제 아래의 Student, Employee개의 부모클래스가 있고, 이둘을 상속하는 TeachingAssistant 라는 클래스가 있다. class Student { def id : String = ... } class Employee { def id : String = ... } class TeachingAssistant extends Studet, Employee { .. } 그런데 문제는 두개의 부모클래스가 id라는 공통되는 변수를 가진다면 상속받는 클래스에서는 어떤 id를 택하게 될까라는 고민거리가 생긴다. 또 다이아몬드상속문제(Student와 Employee 역시 Person이라는 클래스를 상속한 서브클래스였다면)가 발생했을시 어떻게 할까, C++에서는 '가상 베이스 클래스' 라는 기능을 사용하고, 자바에서는 다중상속을 지원하지 않고, 인터페이스는 추상 메소드만 가질수 있고 필드는 가질 수 없게 한정하였다. scala에서는 이러한 다중상속문제 다루기위해 trait을 사용한다. 2. trait가 있는 오브젝트 trait는 자바의 인터페이스 기능을 수행한다. 인터페이스처럼 함수 구현부는 없이 사용할 수도 있지만, trait Logger { def log (msg: String ) } 인터페이스와는 달리 일반클래스처럼 함수를 구현해놓을 수도 있다. trait ConsoleLogger  extends Logged { def log (msg: String ){println(msg)} } 그리고 후자의 경우는 trait이 클래스의 믹스인 되었다 라는 표현을 사용한다. 그리고 믹스인이 된 클래스들은 trait이 변경되면 믹스인한 모든 클래스가 재 컴파일 되야하니 알고쓰자. 오브젝트를 생성할때 trait를 추가할 수 있다. trait Logged

scala 8. 상속

1. extends 상속은 자바와 마찬가지로 extends 라는 키워드를 사용 class Person { var name = "" override def toString = getClass().getName + "[name=" + name + "]" } ... class Employee extends Person{ var salary = 0.0 override def toString = super .toString + "[salary=" + salary + "]" } 상속을 막고 싶으면 final을 사용 2. override 오버라이드(함수를 상속받아 재정의, cf 오버로드-함수의 파라미터 갯수를 달리하여 재정의)를 할경우 추상메소드인경우에는 그냥 진행하면 되지만, 그렇지 않은경우 메소드 앞에 override를 붙여준다. class Person { var name = "" override def toString = getClass().getName + "[name=" + name + "]" } ... class Employee extends Person{ var salary = 0.0 override def toString = super .toString + "[salary=" + salary + "]" } 실행 object test { def main (args: Array [ String ]): Unit ={ var ch = new Employee println(ch.toString) } } < result > [name=][salary= 0.0 ] 3. 슈퍼클래스 생성자 - java에서 부모클래스의 생

scala 6. object

오브젝트 보통 클래스로부터 생성한 객체를 오브젝트라 칭한다. scala서 오브젝트는 위의 개념이 아니다. 1. 싱글톤  object로 생성되는건 싱글톤이다. 싱글톤 객체로 사용하고 싶을때 object를 사용한다 2. 컴패니언오브젝트( http://www.scala-lang.org/api/2.11.6/#scala.annotation.meta.companionObject )  컴패니언뜻은 동료, 동반자, 친구 뭐 이런뜻이다.  발번역하면 클래스와 친구인 오브젝트.. 뭐 이런건가 ㅋ  오브젝트는 위에서 말한것처럼 정적인 객체다, 정적인 필드와 메소드를 가지고 있다.  클래스에서 일부 정적인 기능이 필요한 경우 사용하라고 만들었다. class Account { val id = Account .newUniqueNumber() private var balance = 0.0 def deposit (amount : Double ): Unit ={ balance += amount } } object Account { private var lastNumber = 0 private def n zjaewUniqueNumber()={ lastNumber += 1 lastNumber } } Account컴패니언 오브젝트를 생성했다. Account의 인스턴스가 생성되면 고유한 ID값을 부여할 수 있다. scala> var ac1 = new Account ac1: Account = Account @35ff8fc9 scala> var ac2 = new Account ac2: Account = Account @29c2c826 scala> ac1 res10: Account = Account @35ff8fc9 scala> ac1.id res11: Int = 1 scala> ac2.id res12: Int = 2 3. 클래스나

scala 5. class

1. 클래스 scala> class Counter { | private var value = 0 | def increment () { value += 1 } | def current () = value | } defined class Counter 앞에서 했던 내용들하고 비교해보면 특별한건 없어보인다. 단 파라미터가 없는 메소드의 경우 가급적 '( )' 없이 사용하길 권장한다고 한다. 2. 게터와 세터 자동생성 scala> class Person { var age = 0 } defined class Person scala> val chang = new Person chang: Person = Person @157fe3d class 내부에 age라는 변수만 초기화 해놨다. 별다른 표시가 없으면 멤버 접근권한은 기본적으로 public으로 존재한다. scala> chang.age res9: Int = 0 scala> chang.age = 1 chang.age: Int = 1 scala> chang.age res10: Int = 1 이부분이 조금 매력적이다. 사용할때는 .age 하나인데, 이걸로 setter도 되고 getter의 기능도한다. scala에서는 만약 멤버변수 int타입 age가 생성되면 getter는 int age() = age setter는 void age_=(int) 의 형식으로 자동으로 내부적으로 생성한다. 그리고 멤버 변수가 var가 아닌 val으로 선언했다면 그 멤버의 setter는 생성되지 않는다. 또한 getter와 setter는 자동으로 생성은 됬지만, 입맛에 맞게 수정하여 사용할 수 도 있다. 3. 비공개필드 클래스에서 일부 필드를 비공개로 숨기는 기능이 있다. 대게 private한 변수들도 메소드내에서는 접근이 가능하다. 그런데 여기서는