2011년 2월 11일 금요일

객체지향 이야기(전병선 저) - 6장 홈 씨어터 구미기 - 인터페이스와 실현


인터 페이스의 의미에 대해 정말 간략히 설명해주는 그림이 있었다.

ICompositeVideo, IDVideo, IComponentVideo Interface를 정의하고

구현 함으로써 DVD와 TV 객체간의 의존성을 제거 시켰다.

이게 왜 상속보다는 Interface를 구현해서 사용해야 함을 보여주는 예인것 같다.

객체지향 이야기(전병선 저) - 6장 홈

객체지향 이야기(전병선) - 4장 혼자서는 살수 없어요! - 클래스 사이의 관계 종속과 연관

1. 종속관계
- 대학교때 이해못했던 UML 화살표하나를 이해했다. ------>(종속)
- 정비공과 자동차의 관계
- 정비공은 자동차의 세부내역이 바뀔때마다 영향을 받지만 자동차는 정비공에 상관없이 수리만 제대로 되면된다.
- 정비공 ----->(종속) 자동차 관계가 형성된다.
!! 일반적으로 메소드의 인수로서 다른 클래스를 사용하는 경우 대부분 종속관계를 이루게 된다.
class Repairman{
//생략..
public void Repair(Car repairCar){
// Car클래스를 사용하기에 Car에 dependent.
}
}
!! 메서드 내부에서만 살아있는 객체를 사용할 경우에도 종속관계가 성립된다.
class OwnerDriver{
private Car myCar
public void Repair(){
//스스로 수리할수 없는 경우 정비사를 고용한다
RepairMan aRepairMan = new RepairMan();
aRepairMan.repair(myCar);
}
}

2. 연관관계
- 연관관계도 명확하게 설명해준다. :)
- 자가 운전자와 자동차의 관계이다.
- 자가 운전자를 알면 그 운전자가 어떤 차를 소유하고 있는지 알수 있다. 역도 성립한다.
!! 자바경우 참조변수를 멤버로 포함할 경우
class Driver{
// 1 대 1관계
private Car myCar;
// 혹은 1대 다 관계
private Vector myCars = new Vector();
}
!! 연관 관계에서 집합(aggregation)과 복합(composition)의 차이
- 복합 경우 좀더 단단한 관계를 가진다. 보통 객체와 주기를 같이 한다고 한다.
- 이말은 생성자에서 객체의 레퍼런스를 만들고 소멸자에서 Free를 시켜준다는 의미일것이다.
- Java경우 소멸자 정의는 필요없다.

객체지향 이야기(전병선) - 3장 the 클래스 - 클래스의 개요

이번장은 Java책의 클래스를 쉽게 풀어서 설명 하는 느낌이다.
UML에 대해 다시한번 공부 할수 있는 기회였다.

이번장에 건진 내용은
- 코딩을 하기전에 먼저 객체에 대해 정확한 정의가 필요하다는 내용이었다.
- 메시지 보내기 설명을 위해 자동변속기와 수동 변속기를 사용하는 자동차 예를 사용했다.
- 자동변속기 경우 changeSpeed()를 내부에 숨기지만 수동 변속기 경우 외부(사용자)에게 노출 시킨다.
잘못된 인터페이스 노출은 객체간의 coupling을 증가 시키기고 유지보수를 힘들게 할것이다.
이게 물론 하루아침에 이루어 지지는 않게지만 항상 명심해야 할듯 하다.

객체지향 이야기(전병선) - 2장. 미션 임파서블 - 객체지향을 이해하

* C만 하다보니 대학교때 들었는 객체라는 개념이 너무 막막하여 전병선씨의 '객체지향 이야기'를 중고로 샀다.
2장만 읽었는데도 내공이 대단하다는걸 느낄수 있다. 많이 알수록 쉽게 설명해줄수 있다는 말이 진리임을 보여준다.

1. 소프트웨어에서 중요한것은 데이타이고 객체지향에서는 캡슐화로 모든것을 클래스 안에 숨겨 외부사용자는
인터페이스만 알면 사용할수 있게 해준다.
- Effective 자바에서 멤버변수는 무조건, 무조건 private이어야 한다는 의미를 좀 더 알겠다.

2. 객체란?
- 애플리케이션에서 명확한 한계와 의미를 갖는 사물이나 개념 또는 추상화로서 특성(멤버변수)와 행위(메소드) 그리고
정체성(Java경우 HashCode)을 하나의 단위로 포함하여 캡슐화 하는 것.


3. 메시지 보내기?
- 상대 객체가 대상 객체에게 명령을 하는 것을 메시지를 보낸다고 한다.

2011년 2월 9일 수요일

오라클 수업_1

1. 컴퓨터는 날짜를 어떻게 저장할까?
- 1970/1/1 0시를 기준으로 흘러간 시간을 밀리세컨드 단위로 저장한다.
따라서 DB에 3600000(1000*60*60)가 저정되어져 있다면 Date 값은 1970/1/1 1시이다.
- order by date desc를 한다면 가장 최근이 먼저 보인다.( 오래될수록 저장되어진 값은 크기 때문이다.)

2. select * from v$nls_parameters;
- DB 셋팅값을 확인할수 있는 테이블을 확인하기(나라, 언어, 시간형식등)

3. alter session set XXXXX 을 이용하여 nls_parameters의 col 값을 변경할수 있다
- 하나의 세션에서만 변경이 가능. 다시 로그인 한다면 원래의 값.

4. 오라클에서는 parameter가 없는 함수의 괄호는 생략한다.
- select sysdate, user from dual; 경우 sysdate 와 user는 함수 이다
dual은 오라클에서 만든 값을 뿌리기 위한 dummy table이다.

2011년 2월 8일 화요일

리눅스 파일시스템 구조 #3

10. /var
- 시스템 운영중에 시스템 자료 데이터가 변경될 때 변경된 자료들이 저장되는 디렉토리
주로 시스템 작동 로그들이 저장, 네트워크에 관련된 기록 파일들 저장
보안 기록을 저장, 메일 서버 운용시 전송된 메일을 받아 저장하고 있는 임시 디렉토리
-/var/log : 시스템 로그
-/var/named : 네임서버 설정 파일
-/var/spool/mail : 수신 메일을 사용자 명으로 기록하는 디렉토리.

11. /usr
- 많은 파일들이 있다
- /usr/bin : 압축파일 과 네트워크 실행파일, 자료전송 파일등.
- /usr/sbin : 네트워크 관련 실행파일 및 데몬
- /usr/include : 기본 C 라이브러리 헤데파일 및 각종 라이브러리 헤더 파일
- /usr/src : 리눅스 소스가 있음
- /usr/X11R6 : X-Window 시스템에 관련된 파일

12. /lost+found
- 시스템 이상유무 체크시 복구하지 못한 디렉토리와 파일 저장

13. /media(/mnt)
- 외부 장비 mount시키는 곳

14. /tmp
- 시스템에서 일어나는 작업들에 대해서 임시로 저장되는 디렉토리

리눅스 파일시스템 구조 #2

4. /bin
- 시스템 조작에 필요한 기본적인 명령어가 있는 폴더
ex> cp, mkdir, rm, rmdir and so forth

5. /dev
- 리눅스에서 사용하는 문자 디바이스 와 블록 디바이스 파일들이 위치
- 여기에 없는 디바이는 mknod를 이용해서 생성해줄수 있다.

6. /home
- 사용자 계정이 default로 생성되는 폴더
- /etc/skel을 수정하여 default 위치를 다른곳으로 바꿀수는 있다.
- /etc/passwd 파일을 수정하거나 usermod -d [디렉토리명]을 이용하여 생성된 user의
home 디렉토리도 다른곳으로 바꾸어 줄수 있다.

7. /lib
- 리눅스 시스템 실행을 위해 필요한 중요한 라이브러리들의 위치
- /lib/modules 에는 커널 모듈 파일들이 포함되어 있다.

8. /proc
- process 정보가 저장되는 폴더
- 숫자는 PID

9. /sbin
- 시스템 관리시 필요한 바이너리 실행 파일들의 위치 (system bin인거 같다)
시스템 점검 및 복구 명령, 네트워크 인터페이스 설정 명령, 시스템 초기 및 종료 명령
커널 모듈등.

리눅스 파일 시스템 구조 #1

이 내용은 Fedora 리눅스 Core 그대로 따라하기(서자룡 저)에서 발췌 정리 하였습니다.

1. /(루트 디렉토리)
- /root(root 계정의 Home 디렉토리)와는 다르다

2. /boot
- 커널(vmlinuz-###),initrd 이미지 와 GRUB 부트로더 관련 파일
- 시스템 부팅과 밀접한 관계

3. /etc
- 각종 중요한 설정파일 및 시스템 초기화 파일

-- 하위 중요 디렉토리 --

. X11 : 엑스윈도우 설정파일
. cron.d : cron 데몬의 스크립트 파일위치 (cron은 같은 작업을 주기적으로 반복할수 있게 해줌)
. cron.daily : 작업 스케줄의 스크립트 파일 위치
. amanda : amanda 백업도구의 설정 및 관련 파일 위치
. cups : 프린터 도구인 cups 설정 및 관련 파일
. fonts : 엑스윈도우 Fontconfig 설정파일
. httpd : 아파치 웹서버 설정 및 관련 파일
. logrotate.d : 시스템 로그에 관한 설정 파일 위치
. mail : sendmail 서버설정 및 관련 파일
. pam.d : pluggable authentification module의 설정파일
. postfix : postfix 메일 서버의 설정 및 관련 파일
. rc.d : 시스템 초기화(부팅시 사용) 스크립티 파일 위치
. samba : 윈도우 운영체제 파일 공유 서버 파일 위치
. security : 터미널 보안에 관련된 설정
. selinux : security enhance linux(NASA에서 개발한 linux보안 강화를 위한 모듈) 설정 및 관련 설정 파일
. skel : 새 계정 추가시 자동으로 생성되는 기본 디렉토리 및 파일 위치
. squid : squid Proxy 서버 설정 및 관련 파일
. ssh : ssh 서버 설정 및 관련 파일
. sysconfig : 시스템 및 네트워크 설정에 관련된 파일 위치
. vsftpd : vsftd 설정파일 위치
. xinetd.d : 슈퍼데몬 xinetd.d 설정 및 관련 파일

String Class

1. 생성후 값을 바꿀수 없다. 아래와 같이 final로 정의 되어져 있다
 /** The value is used for character storage. */
   private final char value[];

2. Exception의 새로운 사용 방법을 알게 되었다.
public String(char value[], int offset, int count) {
   if (offset < 0) {
    throw new StringIndexOutOfBoundsException(offset);
   }
  ...
}
offset이 범위 밖일때는 StringIndexOutOfBoundsException을 생성하여 던진다.
StringIndexOutOfBoundsException는 RuntimeException을 상속 받았다.
!위와 같이 RuntimeException을 상속하여 User Defined Exception을 생성하여 사용한다면 가독성과 유지보수에 도움이 될 듯하다.

3. equals()와 hashCode()를 overriding했다.
 - equals()는 각 index의 char값을 비교.
 - hashCode()는 아래 식을 이용하여 생성한다.
 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

Object Class

1. equals()는 참조변수의 주소값을 이용하여 연산한다.

2. hashCode()는 해싱기법에 사용되는 해시함수를 구현한것
 - public native int hashCode(); 와 같이 native 메소드이다.
 - 메모리 주소를 이용하여 hashcode를 생성한다. 따라서 한번의 실행도중 생성되는
   모든 instance는 상이한 hashcode를 가진다.
 - equals()를 overriding시 hashCode()도 overriding해주어야 한다.
   같은 객체라면 hashCode도 동일해야 하기 때문이다.

3. clone()
 - protected native Object clone() throws
   CloneNotSupportedException;

 - Clonable interface를 구현해야 사용이 가능하다.
 - 이것을 통해 interface의 사용법에 대해 좀더 알게 되었다.
   clone()을 호출하는 곳에서는 Cloneable을 구현한 concrete class가 아닌
   Cloneable interface를 이용하여 호출 할것이다.

Exception에 대해

Exception은 프로그래머로 하여금 API사용시 유의해야 할 점을 기억하게 해주는 듯하다. 많은 수의 run time시 발생할수 있는 에러들을 미리 Exception으로 객체화 하여 대비 할 수 있게 해준다.

1. 자바에는 Exception과 Error가 있다
 - RuntimeException은 처리 해주지 않아도 됩니다.

2. Exception을 던지는 API를 사용시(throws로 명시) try and catch구문으로 처리 하던가 throws를 이용하여 타 API에게 책임을 전가 시켜야 한다.

3. printStackTrace(), getMassage()를 이용하여 예외 발생시 정보를 알수 있다.

4. catch구문내에서 throw를 이용하여 예외를 되던지기 할 수도 있다.

5. 간단한 사용자 정의 예외 만들기
 ex> class MyException extends Exception{
        MyException(String msg){
           super(msg);
        }
     }
  - Java의 정석 page 355.

! finally 구문 내에서는 return을 하면 안된다.
아래 사이트를 참조하세요.
http://www.younghoe.info/321

Programmer Apprentice 요약(진행중)

1. First Language
- 하나의 언어를 마스터하자
- Having practical problems to solve
- Finding Mentors.
- enrolling communities

2. White Belt
- 초심자의 마음으로.

3. Unleash Your Enthusiasm
- 열정의 고삐를 풀어라.
- 주위의 동료, 친구들과 상관없이 혼자서라도 추구해라.

4. Concrete Skills
- 첫번째 언어로 팀에 도움이 될만한 기술을 익혀라 (Tool, Frameworks, Skill)
- 중급자 경우 경력이 말해주지만 초보자라면...
- 자격증을 따자

5. Expose your Ignorance
- 모르는 기술을 배워야 할때면 상사, 고객, 동료에게 무지를 알려라. 아는척을 하지마라
- 그러나 니가 빨리 배울수 있음을 각인시켜라.
- 이러한 태도가 우리를 빨리 배울수 있게 동기 부여를 한다.

6. Confront your Ignorance
- 직장에서 사용해야 하는 기술과 Tool을 모를경우가 많다.
- 모르는 기술의 목록을 만들고 배워라. 친한 동료가 있다면 금상첨화.

7. The Deep End
- 틀에 박힌 일들을 하면서 스스로를 발전 시키지 못하고 제자리 걸음을 할때가 있다.
- 위험하고 도전적인 일을 하라.

8. Rereat into competence
- 나의 무지와 지금 하고 있는 것들이 잘 안되는 것을 자각할수 있다. 이것에 압도되어버린다.
- 내가 잘하는 것들과 많이 아는 것들을 생각해서 격력하고 용기를 가지자.
- 그러나 그 기간은 짧아야 하고 충전후 힘차게 재 도약하자.

9. Wrapping Up
- 내가 배운것들을 기록하자

10. The Long Road.
- Master가 되고 싶은 맘에 붙잡혀 있지만 싶지 않아요.
- 우선 이건 평생 걸리는 일이다. 하루아침에 되지 않는다.

블로그를 시작하다.

JAVA SI 과정중 공부한 내용을 요약, 정리, 저장하고 싶어서 블로깅을 시작했습니다.

리눅스 부팅과정

1. BIOS에서 시작 하드드라이브 검색

2. MBR에 저장되어진 GRUB/LILO실행

3. swapper를 이용하여 /boot/vmlinuz-XXX를 Load후 하드웨어 체크

4. /root partition mount시킴

5. init Process 실행(pid :1)
• /etc/inittab 읽어들여서 시작모드 확인
• /etc/rc.sysinit 를 읽고 실행레벨에 일치하는 /etc/rc.d/rc#가 실행
• /etc/rc.d/rc#.d폴더 안에 softlink되어진 process 스크립트 실행
  K:kill, S:start. 번호:우선 순위

자바 기본지식


1. XXX[XXXX : 배열주소

2. XXX@XXXX : 클래스 주소식

3. ++i가 i=i+1보다 빠르다 바이트 코드 2개와 5개의 차이

4. 배열 초기화 방법
- String[] name = new String[3]; name[0] = new String("kim");
- String[] name = {"KIM","Park"};
- String[] name = new String[]{new String("Kim"), new String("Lee")};

5. 확장 for문
for(타입명 변수명 : 배열 타입명)
- ex> int[] intArray = new int[6]; for(int i : intArray)

6. 변수 초기화 순서
 - static : 기본값(0,null), 명시적 초기화(대입연산자), 

   클래스 초기화 블럭 (static{})
 - non-static : 기본값(0,null), 명시적 초기화(대입연산자),

   인스턴스 초기화 블럭({}), 생성자

7. 상속시 접근제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 할수 없다.

8. 상속시 조상클래스의 메서드보다 큰 범위의 예외를 선언할수 없다.

9. Object 클래스를 제외한 모든 클래스의 생성자내에 명시적인 생성자 호출이 없다면 컴파일러가 기본적으로 super();를 삽입한다.

10. final keyword
class : 확장할수 없는 클래스로 만든다. 상속 불가능
method : overriding할수 없는 클래스
member, local variables : 상수

11. 접근 제어자
private : 같은 클래스 내에서만
default(명시적으로 적어주지 않을때 기본적으로) : 같은 패키지 안에서만
protected : 같은 패키지내 혹은 다른 패키지의 자손 클래스에서
public : 제약없음
public > protected > default > private

12. interface 사용시 기본적인 유의 사항
- 모든 멤버 변수는 public static final이어야 하고 생략 가능
- 모든 메스드는 public abstract이어야 하고 생략가능


About Package

1. Package는 class를 생성시 구조화 시키기 위한 방법

 <> javac -d [패키지를 생성시키기 위한 부모 디렉토리] -classpath [빌드시 필요한 클래스들의 패스] ***.java 

 <> 일시적으로 클래서 패스 설정 set classpath = 경로명

 <> 실행방법 java [package full name.class_name] ex> java a.b.test

자바 연산자 우선수위


  종류    방향                 연산자
 
단항연산자 <---     ++, --, +, -, ~(bit전환연산자), !, (casting 연산자) 

산술연산자 --->     *, /, %, +, -, <<, >>, >>>
 
비교연산자 --->     <, >, <=, >=, instanceof, ==, !=
 
논리연산자 --->     &, ^, |, &&, ||
 
삼항연산자 --->     ?:
 
대입연산자 <---     [*|/|%|+|-|<<|>>|>>>|%|^|'|']=

자바 메모리 구조

1. Method Area
- 클래스 data(*.class)를 이곳에 load
- 클래스 변수(static)
- thread 가 이곳을 공유한다.

2. Heap
- 각 클래스의 instance가 이곳에 load
- instance 변수(non-static class member variables)

3. Stack
- method 수행시 필요한 메모리 제공
- parameter vars, local vars, return vars