2018년 9월 6일 목요일

Java 클래스와 객체 살펴보기

오늘은 java의 가장 큰 특징인 클래스와 객체에 대해서 살펴보도록 하겠다.

Java의 널리 알려진 대표적인 객체지향적인 프로그래밍 언어이다. 
"객체를 지향한다" 라는 의미의 프로그램인데, 쉽게말하면, 프로그램 입, 출력할때 부터 구현하는것까지 단 하나도, 객체가 빠지지 않는다.

이 객체란, 하나의 클래스 혹은 여러 클래스들의 영향을 받아서 생성되어 만들어진 결과물이다. 더 쉽게 생각하면 우리 주머니에 있는 스마트폰과 같다. 
클래스는 바로 이 스마트폰인 객체를 생성해주는 역할을 한다.

그렇다면, 다음과 같이 정리할 수 있다.

객체 -> 제품(결과물)
클래스 -> 공장 (결과물을 만들어내는)

 그렇다면 이렇게 자바는 이런 프로그래밍 과정(= 객체지향적)을 통해서 어떤 이득을 취할 수 있을까?

여러기능을 합쳐서 하나의 제품이 될 수 있는 캡슐화가 가능하다.
- 하나의 객체에 필요한 기능들을 모아놓은 특징
- 만약, 하나의 기능이 혹은 여러기능들이 다른 객체에서도 사용이 될 수 있는 재 사용성의 특징

이것 외에도 장점은 매우 많다.

하지만, 자바는 다소 프로그래머들의 개인적인 입맛이 다른것처럼 단점이 되는 요소도 있다.

- 하드웨어에 맞게 완전한 컴파일된 상태가 아니여서 실행 시 해석이 되기때문에 속도가 느리다는 단점을 갖고있다.
- 컴파일이 되지않는 예외처리의 경우가 있다. 코드 작성시 검사가 필요한 예외가 등장한다면, 무조건 프로그래머가 선언해주어야한다.

하지만, 이러한 단점들은 오랜 프로그래머들의 노력에 의해 발전해서 많이 개선되었다.
다음시간에는 직접 클래스와 객체를 생성해보는 코드를 작성해보자.

2018년 6월 22일 금요일

jQuery - mouse 이벤트(mouseenter()와 mouseover()의 차이)

마우스가 해당 요소에 over되면 발생하는, 즉 마우스 커서가 해당 요소안으로 진입했을경우 발생하는 메소드 2가지 있다.

1) mouseenter()

2) mouseover()

이 둘의 차이는 버블업과 관련이 있으며 약간의 미세한 차이가 있다.

1. 이벤트 발생시 해당요소의 자손들에게도 영향을 미치는지 여부
2. 이벤트 발생의 차이가 존재한다.

mouseenter()
- 이벤트 발생시 선택자(해당요소)의 자손들에게 영향을 미치지 않는다.
- 이벤트 발생시점이 마우스 커서가 선택자(해당요소)에 진입했을 경우 단, 한번이다.

mouseover()
- 이벤트 발생시 선택자(해당요소)의 자손들포함하여 영향을 끼친다.
- 이벤트 발생시점이 마우스 커서가 선택자(해당요소)에 진입했을 경우지만, 여러번에 걸쳐서 실행된다. 쉽게말하면 커서가 요소안에 over되어있다면, 이벤트가 반복해서 실행된다는점이다.






2018년 6월 3일 일요일

javascript - split()과 join()

우리는 사용자로부터 입력받은 문자 'a'라는 값을 받았다면, a를 담는 바구니(자료형)는 어떤값일까?
   var a = prompt(""); //   "How are you doing?" 입력

 위의 문자열을 사용자로부터 입력받았다고 생각하면, 위의 입력값을 담는 바구니(자료형)는 변수? 아니면 배열? 아니다, 바로 문자열에 저장이 된다.
우리는 조금 더 정확한 표현을 하고 싶다면, 배열에 넣어서 관리하면 된다. 여기서 문자열을 배열에 넣는 것을 도와주는 메소드를 예제를 통해서 살펴보자.

  - java.lang.String.split() [문자열 → 배열] 
 
             사용법 :  java.lang.String.split("구분자");  return "array"

        표현식 : 문자열.split("구분자", 배열요소의 갯수(인덱스 갯수)(생략가능)); 
   
  [ Javascript ]
  1. var str = prompt(“”);
  2. console.log(str);
  3. var split_str = str.split("");
  4. console.log("str : "+str);
  5. console.log("split_str : "+split_str);

  [ 실행결과 ]





: 사용자에게 입력받은 문자열은 str에 저장이 된다. 그렇다면, str의 자료형은 문자열이 되는것이다. (typeof(자료형)을 통해서 체크해보면 된다.)

 문자열을 구분할때 특정 구분자 Delimeter라고하는데, delimiter를 구분 문자는 문자열의 시작과 끝을 알려주는 문자이며, 문자간의 경계를 알려주는 역할을 한다.  이 구분자를 기준으로 나눠서 배열에 담아 이용한다. 이때, 우리는 위에 사용한 메소드인 split()을 사용한다.
 split()함수에 인자로는 구분자가 넘어가도록 하며, 생략되도 배열에 담겨진다. (한문자씩)

만약에, 위에서 str_split(" ")과 같이 안에 띄어쓰기가 들어간다면, split_str[0]은 "How"가 된다. 전체를 구분짓는 요소가 띄어쓰기가 된 셈이다. 그렇다면 str[1]은 당연히 "are"이 된다.
 그리고 구분자는 해당 배열의 원소로 저장이 될 수 없으므로 띄어쓰기는 구분자 역할을 하고 값은 사라진다.
 



  - Array.prototype.join() [배열 → 문자열] 

   [ Javascript ]
  1. var str = "how are you doing?";
  2. var split_str = str.split("");
  3. console.log("str : "+str);
  4. console.log("split_str : "+split_str);
  5. var join_str = split_str.join("");
  6. console.log("join_str : "+join_str);

   [ 실행결과 ]






: join("")의 결과가 보이는가? 바로 배열요소 원소들을("h", "o", "a" ...) 하나의 문자열로 만들어 준 것이다. 위의 split()의 반대개념이라고 생각하자.

                                       java.lang.String.split()     ↔     Array.prototype.join()       

 join()은 배열의 모든원소들을 문자열로 반환한다. 하지만, 이건 값이 비어있을때 이야기이다. 위의 인자값은 join("");와 같이 아무것도 넣지않았다. 인자값이 빈 값이면, 배열요소 전체를 하나의 문자열로 만들어 반환한다.(하지만 인자값이 join()과 같이 빈값이 아닌, 큰따옴표가없는 상태인 값이 없다면, 아무변화도 없다는 점을 주의하자.)

 join("")의 인자값을 넣으면 배열 인덱스 영역마다 구분자 역할을 하는 문자가 추가된다.

 밑의 몇가지 예제를 통해서 조금 더 깊게 이해하자


예제 1) split과 join사용시 인자값을 따로 주었다면 값이변할까?
  [ Javascript ]
  1. var str = "how are you doing?";
  2. var split_str = str.split(" ");    //띄어쓰기 삽입
  3. console.log("str : "+str);
  4. console.log("split_str : "+split_str);
  5.  
  6. var join_str = split_str.join(""); //띄어쓰기 생략
  7. console.log("join_str : "+join_str);

  [ 실행결과 ] : 원래 문자열로 되돌렸더니 정말로 띄어쓰기가 구분자로 있었던게 사라졌다.


  [ Javascript ] : 다시 join에 띄어쓰기를 삽입하자 구분자로 삽입이 시키기
  1. var str = "how are you doing?";
  2. var split_str = str.split(" ");     //띄어쓰기 삽입
  3. console.log("str : "+str);
  4. console.log("split_str : "+split_str);
  5.  
  6. var join_str = split_str.join(" "); //띄어쓰기 추가
  7. console.log("join_str : "+join_str);

  [ 실행결과 ] : 구분자인 띄어쓰기가 다시 문자열에 삽입되었다.







예제 2) 입력받은 전화번호의 '-'표시를 지워보자!
  [ Javascript ]
  1. var number = prompt("전화번호 입력");
  2. var spl_number = number.split("-");
  3. var join_number = spl_number.join(" ");
  4. console.log(number);
  5. console.log(spl_number);
  6. console.log(join_number);


  [ 실행결과 ]









예제 3) split("구분자", 인덱스 갯수)을 통해서 배열의 인덱스 갯수를 3개로 제한을 두자.
  [ Javascript ]
  1. var str = "how are you doing?";
  2. var split_str = str.split(" ");
  3. var split_str2 = str.split(" ",3);
  4. console.log("str : "+str);
  5. console.log("split_str_Length : "+split_str.length);
  6. console.log("split_str : "+split_str);
  7. console.log("split_str2_Length : "+split_str2.length);
  8. console.log("split_str2 : "+split_str2);


  [ 실행결과 ]



마무리 정리해보면, 

 1. 사용자로부터 문자열 str을 입력받았다.
      
             str = “how are you doing?”
 
 2. str,split(“”)사용 – 인자가 비어있으면 하나씩 하나씩 부분 배열의 원소로 부분배열화 시킨다.

          str.split("") =  “h”, “o”, “w”, “ ”, “a”, “r”, “e”, “ ”, “y”, “o”, “u”, “ ”, “d”, “o”, “i”, “n”, “g”, “?”
 
3. split_str.join(“”)사용 – 인자가 빈 값이라면, 구분자를 쉼표로 생각한다.

: 부분배열(“h”, “o”, ... “g”, “?”)은 쉼표로 구분이 되어있다. 그렇다면 join(“”)인자 값이 빈 값이므로 부분 배열화된 것에서 문자열로 만들어 줄 때, 구분자 역할을 하는 문자를 추가하지 않는다. 

 우리는 구분자라는 표현을 썼는데, 여기서 말하는 구분자는 긴 문자열에서 배열로 만들때, 어디까지가 하나의 인덱스 영역인지 구분해 줄 수 있는 문자를 말하는것이다. 또한 배열에서 문자열로 변환시킬때, 배열요소 사이마다 구분자를 포함시켜 하나의 문자열이 반환되는데, 빈 값이면 아무것도 들어가지 않는다.

 왜 우리는 문자열을 배열로만들고 배열을 문자열로 만들필요가 굳이 필요한 과정일까 생각을 할 수 있다. 다음에 살펴볼 메소드로 splice()와 slice()를 공부하기전에 알아두어야 할 과정이라고 생각했다.

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...