참고  : https://blog.naver.com/centrople/80119012228

Ant로 빌드하는 과정에서 많은 프로퍼티를 사용하는 경우 별도의 프로퍼티 파일을 작성한 후 file이나 resource 속성을 사용하여 프로퍼티를 초기화하면 편리하다.

 Ant에서 기본적으로 제공하는 프로퍼티
모든 자바의 시스템 프로퍼티를 Ant의 프로퍼티로 사용할 수 있다.
Basedir – 프로젝트의 기본 디렉토리의 절대 경로. <project> 태그의 basedir 속성에 명시된 값
Ant.file – 빌드 파일의 절대 경로
Ant.version -  Ant 버전
Ant.project.name – 현재 실행중인 프로젝트의 이름 . proejct name 속성으로 지정
Ant.java.version – Ant가 발견한 자바 버전. 현재 “1.1”, “1.2”,”1.3”,”1.4”를 값으로 가질수 있다.

 

셈플

<project name="STRUTS_PROJECT" default="deploy" basedir=".">
  <description>
        simple example build file
    </description>
 
  <target name="init" description="prepare enviroment">
           <property name="catalina.dir" value="C:/Program Files/Apache Group/Tomcat 4.1" />
           <property name="catalina.common.lib.dir" value="${catalina.dir}/common/lib" />
           <property name="webapp.dir" value="webapp" />
           <property name="webapp.WEB-INF.dir" value="${webapp.dir}/WEB-INF" />
           <property name="webapp.WEB-INF.lib.dir" value="${webapp.WEB-INF.dir}/lib" />
           <property name="webapp.WEB-INF.classes.dir" value="${webapp.WEB-INF.dir}/classes" />
           <property name="source.dir" value="${basedir}/src" />
           <property name="build.dir" value="${basedir}/build" />
           <property name="build.classes.dir" value="${build.dir}/classes" />
           <property name="build.jar.dir" value="${build.dir}/jar" />
           <property name="dist.dir" value="dist" />
           <property name="jarfile.name" value="struts_project.jar" />
           <!--set classpath for compile-->
           <path id="compile.classpath">
                    <path>
                            <fileset dir="${catalina.common.lib.dir}">
                                     <include name="*.jar"/>
                            </fileset>
                    </path>
                    <pathelement location="${webapp.WEB-INF.lib.dir}/struts.jar" />
           </path>
  </target>
  <!--delete previous folders-->
  <target name="delete" depends="init" description="delete directory">
           <delete dir="${build.dir}" />
           <delete dir="${dist.dir}" />
  </target>
  <!--create new folders-->
  <target name="create" depends="init" description="create directory">
           <mkdir dir="${build.classes.dir}" />
           <mkdir dir="${build.jar.dir}" />
           <mkdir dir="${dist.dir}" />
  </target>
  <!--compile sources-->
  <target name="compile" depends="delete, create" description="compile java sources">
           <javac srcdir="${source.dir}" destdir="${build.classes.dir}" failonerror="no">
                    <classpath refid="compile.classpath" />
           </javac>
  </target>
  <!--packaging-->
  <target name="package" depends="compile" description="package class files">
           <jar jarfile="${build.jar.dir}/${jarfile.name}" basedir="${build.classes.dir}"/>
  </target>
  <!--copy the jar file-->
  <target name="deploy" depends="package" description="deploy jar files">
           <copy todir="${dist.dir}">
                    <fileset dir="${build.jar.dir}">
                            <include name="**/*.jar"/>
                    </fileset>
           </copy>
  </target>
</project>

 

1. 기본구조

<?xml version=”1.0” encoding=”euc-kr”?>
 
<project name=”projectName” default=”targetNameN” basedir=”.”>
 
        <target name=”init”>………..</target>
 
        <target name=”compile” depends=”init”>………</target>
 
        <target name=”copyJSP” depends=”compile”>………</target>
        <target name=”copyJar” depends=”copyJSP”>………</target>
 
        <target name=”makeWar” depends=”copyJar”>………</target>
 
        <target name=”clean” depends=”makeWAR”>………</target>
 
<project>

 

1.1 Ant의 규칙

  

1.1 Project 요소 설정

속성 설명 필수
name    
default    
basedir    

 

1.2 Property 요소 속성

속성 설명 필수
name    
value 프로퍼티의 값을 지정 Name 속성을 사용했을 경우
둘 중의 하나를 반드시 사용
location 지정한 경로명의 절대 경로명을 값으로 지정
resource 프로퍼티 파일을 읽어 올 때 사용할 자원명을 지정 Name 속성을 사용하지 않은 경우
셋중의 하나를 반드시 사용해야 한다.
file 지정할 파일로부터 프로퍼티 목록을 읽어 온다
environment 환경 변수를 읽어 올 때 사용할 접두어를 지정
classpath 자원으로부터 프로퍼티 파일을 읽어 올 때 사용할 클래스패스  
classpathref 클래스패스로 사용할 경로를 <path>요소로부터 가져온다  
prefix Resource file속성을 사용하여 읽어 온 프로퍼티를 참조 할 때 사용할 접두어를 지정, 접두어 맨 뒤에 “.”가 포함되어 있지 않을 경우, 자동으로 “.”이 접두어 뒤에 붙는다.  

프로퍼티의 값을 사용할 때에는 ${프로퍼티이름} 형식을 사용

 

1.3 Target 요소 설정

속성 설명 필수
name    
depends 의존하고 있는 목록  목록인경우 콤마구분  
if 지정한 프로퍼티가 설정되어 있는 경우 타겟을 수행  
unless 지정한 프로퍼티가 설정되어 있지 않은 경우 타겟을 수행  
description    

 

  

경로 규칙

- 경로 규칙은 파일이나 디렉토리 또는 경로 집합을 사용하는 태스크나 <fileset>이나 <patternset>등에 적용된다.
- ‘*’ ----- 0개 또는 그 이상의 글자가 매칭된다.
- ‘?’ ----- 한 글자와 매칭된다.
- 디렉토리 지정에서’*’를 사용할 경우 디렉토리 트리에서 단 하나의 계층만을 가리키게 되는 반면에 ‘**’는 다계층을 나타낸다.
- ‘**’로 패턴이 끝나게 되면 디렉토리뿐만 아니라 모든 파일을 나타낸다.
Ant에서 excludes속성에 명시하지 않아도 자동으로 처리 대상에 제외되는 파일/디렉토리
**/*~, **/#*#, **/.#*, **/%*%,**/._*
**/CVS,**/CVS/**,**/.cvsignore
**/SCCS,**/SCCS/**
**/vssver.scc
**/.svn, **/.svn/**
**/.DS_Store

 

1.3.1 fileset/dirset 태그 속성  : 파일/디렉토리 집합을 사용하는 태스크에서 사용

속성 설명 필수
dir 파일 집합을 표시할 때의 루트 디렉토리 dir이나file중 한 개를 반드시 명시
file 한 개의 파일을 명시할 때 사용          (fileset만 해당)
casesensitive True일 경우 대소문자를 구분해서 처리, 기본값 true  
followsymlinks 심볼릭 링크를 따라갈지의 여부를 나타낸다 기본값 true  
includes(file) 처리대상에 포함시킬 디렉토리/파일, 속성대신 테그 가능  
excludes(file) 처리대상에 제외시킬 디렉토리/파일, 속성대신 테그 가능  
defaultexcludes 기본적으로 제외되는 파일을 제외시키고 싶지 않으면 defaultexcludes=’no’  

 

   예시

<copy todir=”backup”>
   <fileset dir=”${basedir}”  includes=”src/**,lib/*.jar,jsp,src/**”
           exclude=”**/*.bak”  defaultexcludes=”no” />
</copy>

 

1.3.2 patternset : 파일/디랙토리 집합의 공통부분 지정시(재사용)

- patternset 내에 fileset/dirset 태그 사용

- Includes, includesfile, excludes, excludefile 속성 지원

- Id 속성을 사용하여 패턴 집합의 이름을 지정

- 패턴 집합을 사용할 때에는 refid속성을 사용한다.

예시1) 기본

<patternset id=”commonJar”>
<include name=”servlet.jar”/>
<include name=”mail.jar”/>
<include name=”activation.jar”/>
<patternset>

 

예시2) refid

<pattern refid=”commonJar”/>

 

1.3.3 path : 경로목록을 공통적으로

- <path>에서 경로를 지정할 때에는 <pathelement>태그를 사용

- location 속성은 하나의 디렉토리 또는 파일을 나타낼 때 사용

- 여러 경로를 함께 표시 할 때 각각의 경로는 ‘;’ ‘:’을 사용하여 구분

<path id=”project.class.path”>
     <pathelement location=”classes”/>
     <pathelement path=”lib/servlet.jar;lib/commons-fileupload-1.0.jar”/>
</path>

 

1.3.3 classpath

<classpath>와 같이 경로를 사용하는 태그에서는 refid속성을 사용하여 <path>요소를 경로값으로 사용할 수 있다.

<classpath refid=”project.class.path”/>

 

2 기타 속성 

목록

설명
copy 하위 태그로 fileset, / direst 가능, 속성: todir
mkdir  
javac  
delete  
jar  

 

2.1. javac: 자바 소스 코드 컴파일

속성 설명 필수
srcdir 소스가 위치한 디렉토리를 지정 <src>요소가 사용되지 않은 경우 필수
destdir 생성된 클래스가 위치할 디렉토리를 지정  
includes 컴파일할 파일의 패턴 목록, 기본값 *.java  
classpath 컴파일할 때 사용할 클래스패스.
,<classpath>태그를 사용하여 지정가능
 
classpathref <path>로 지정한 경로를 클래스패스로 참조  
debug 디버그 정보 포함,  기본값 false  
optimize 최적화 사용,       기본값 false  
verbose 긴 결과 제공  
failonerror 오류가 발생하면 빌드 중지, 기본값 true  
encoding 소스 파일의 인코딩을 지정
javac –encoding 옵션과 동일
 
nowarn on을 값으로 가질 경우 컴파일할 때 –nowarn 옵션을 사용. 기본값은 off  
deprecation on을 값으로 가질 경우 –deprecation 옵션을 컴파일할 때에 사용, 기본값은 off  

 

예시

<javac srcdir=”소스 코드가 위치한 디렉토리
       destdir=”컴파일한 클래스가 위치한 디렉토리
       classpath=”클래스패스”>
…….
</javac>

 

2.2. jar: JAR 파일로 압축

- destfile 속성은 생성할 JAR 파일을 지정

- basedir 속성은 jar파일로 압축할 기본 디렉토리 지정

- includes, includesfile, excludes, excludesfile, defualtexcludes 속성 사용

예시

<jar destfile=”${dist}/lib/app.jar”  basedir=”${build}/classes” />

 

2.3. zip : ZIP 파일로 압축

- includes, includesfile, excludes, excludesfile, 속성 사용

- <zipfileset>은 압축되는 파일의 경로명을 변경 가능

속성 설명 필수
prefix ZIP 파일에 압축될 때 변경되어 들어갈 경로명  
fullpath 특정 파일의 변경될 경로를 지정  
filemode 유닉스 기반의 시스템에서 사용되며, 압축되는 파일의 모드를 지정. 기본값은 644  
dirmode 유닉스 기반의 시스템에서 압축되는 디렉토리의 모드를 지정. 기본값은 755  

 

2.4. war : 웹 어플리케이션 압축

- basdir 속성을 사용하여 해당 디렉토리를 WAR파일로 묶는다.

- lib 태그 지정한 파일들을 WEB-INF/lib 디렉토리에 위치하게 해준다.

- classes 태그는 지정한 디렉토리에 위치한 classes 파일들을 WEB-INF/classes디렉토리에 위치하게 해준다.

- webxml 속성은 지정한 파일을 WEB-INF/web.xml 파일로 복사한다

- includes, includesfile, excludes, excludesfile, defualtexcludes 속성 사용

- 파일을 묶을 때 파일의 경로를 변겨해주는 zipfileset 태그 사용 가능

예시

<war destfile=”main.war” webxml=”src/metadata/web.xml”>
   <fileset dir=”src/mainapp/html” />
   <fileset dir=”src/mainapp/j” />
   <lib dir=”lib”>
      <exclude name=”logging2.jar”/>
   </lib>
   <classes dir=”build/main/classes”/>
   <zipfileset dir=”src/imagefile/images” prefix=”images”/>
</war>

 

2.5. tar : TAR 파일의 생성

- basedir속성이나 <fileset> 태그 등을 사용하여 묶을 파일의 목록을 지정

- compression 속성을 사용하여 우너하는 방식으로 압축가능, “gzip”, “bzip2”,”none”값 지정

- tarfileset 태그는 파일을 묶을 때 파일의 경로를 변경해 주며, 파일에 대한 사용자 및 그룹을 지정할 수도 있다.

예시

<tar destfile=”${dist}/example.tar.gz” basedir=”${build}” compression=”gzip”/>

 

속성 설명 필수
mode 3자리 8진수값  
useranme 파일에 대한 사용자 이름을 지정, UID와는 다름  
group 파일에 대한 그룹 이르을 지정, GID와는 다름  
prefix ZIP 파일에 압축될 때 변경되어 들어갈 경로명  
fullpath 특정 파일의 변경될 경로를 지정  
preserveLeadingSlashes 맨 앞의 ‘/’를 유지할지의 여부를 지정, 기본값은 false  

 

2.6. javadoc : API 문서의 생성

- 소스 코드로부터 Javadoc API문서를 생성

- 옵션이 너무 많아서 생략^^;

 

2.7. copy : 파일 복사

- 지정한 디렉토리로 파일을 복사

- 개개의 파일을 복사할 수도 있고 디렉토리 단위로 복사할 수도 있다.

예시

<copy todir=”${build}/src”>
   <fileset dir=”${workspace}/src”/>
</copy>

 

속성 설명 필수
file 복사할 파일을 지정 <fileset>으로 복사할 파일 목록을 지정하지 않은 경우 필수
tofile 복사될 파일을 지정  
todir 원본을 복사할 디렉토리 지정
overwrite true인경우 기존에 존재하는 파일을 덮어 쓴다. 기본값 false  
preservelastmodified True인 경우 원본의 최종 수정 날짜를 유지.   기본값은 false  
includeEmptyDirs <fileset>으로 지정한 디렉토리 중 텅빈 디렉토리도 복사할지의 여부를 지정, 기본값은 true  
failonerror 파일이 없을 경우 빌드 중단, 기본값 true  
verbose 복사한 파일 목록, 기본값 false  

 

2.8. mkdir : 디렉토리의 생성

예시

<mkdir dir=”${build}/webapp/WEB-INF/classes” />

 

2.9. delete : 파일의 삭제

- file 속성 -  특정 파일을 삭제하기 위해 지정

- dir 속성 -  지정 디렉토리 및 그 하위 디렉토리까지 모두 삭제

- includes, includesfile, excludes, excludesfile, defualtexcludes 속성 사용

- <fileset> 태그를 사용하여 삭제할 파일의 집합 표시 가능 (단 파일만 삭제될 뿐 디렉토리는 삭제되지 않는다)

- includeEmptyDirs 속성 - true로 지정하면 텅빈 디렉토리까지 삭제

- failonerror 속성 – 오류시 빌드 중단, 기본값 true

- verbose속성 – 삭제할 파일 목록, 기본값 false

 

2.10. ant : 또 다른 빌드 파일의 실행

- 하나의 프로젝트가 여러 개의 서브 프로젝트로 구성되어 있는 경우 한번에 서브 프로젝트를 포함한 모든 프로젝트를 빌드함

속성 설명 필수
antfile 사용할 빌드 파일을 지정, 명시하지 않을 경우 build.xml파일 사용, dir 속성에 주어진 디렉토리에 대해 상대 경로로 명시해야 함  
dir 새로운 Ant 프로젝트의 basedir을 지정, 사용될 빌드 파일에서 basedir 속성을 지정하고 있다면 무시됨  
target 수행할 타겟을 지정  
output 새로운 Ant 프로젝트의 수행 결과를 저장할 파일을 지정  
inheritAll 기본값 true이며 새로운 Ant 프로젝트는 현재Ant 프로젝트의 모든 프로퍼티를 전달받는다.  
inheritRefs 기본값 true이며 새로운 Ant 프로젝트는 현재 Ant 프로젝트의 모든 참조를 전달받는다.  

 

2.11. java : 자바 실행

속성 설명 필수
classname 실행할 클래스 이름 둘 중 하나 필수
jar 실행할 jar 파일의 위치
classpath 사용할 클래스 패스를 지정  
classpathref 미리 지정한 <path>요소를 참조  
fork true인경우 새로운 가상 머신에서 클래스를 수행, 기본값은 false  
maxmemory 포크된 가상 머신에 할당할 메모리의 최대 크기를 지정 (fork false인 경우 무시)  
dir 가상 머신을 호출할 디렉토리(fork false인 경우 무시)  
output 결과 파일  
append 기본 파일에 연결하거나 겹쳐씀  

 

  예시

<java classname=”Add” classpath=”${basedir}/bin”>
   <arg value=”100”/>
   <arg value=”200”/>
</java>

 

2.12. native2ascii : 유니코드로의 변환..

- ResourceBundle 클래스나 Properties 클래스를 사용하여 프로퍼티 파일로부터 정보를 읽어올 때 파일에 있는 문자를 유니코드로 변환해준다.

- Src 속성은 변환할 파일들의 위치한 기준 디렉토리를 지정

- Dest 속성은 변환한 결과를 저장할 디렉토리

- includes, includesfile, excludes, excludesfile, defualtexcludes 속성 사용

- <include>,<exclude>태그를 사용하여 원하는 파일만 변환처리 가능

- encoding속성은 변환할 파일의 인코딩 지정(명시하지 않을 경우 JVM 기본 인코딩 사용)

- reverse 옵션은 이스케이프된 유니코드를 지정한 인코딩을 사용하는 문자열로 변환

 

2.13. buildnumber : 빌드 번호

- 파일에서 빌드 번호를 읽고 build.number를 설정한 다음 build.number+1의 값을 파일에 기록

예시

<buildnumber file=”buildnum.txt”/>

 

2.14. echo

- System.out(기본값), 파일, 로그, 수신기에 메시지를 기록

속성 설명 필수
message 기록할 텍스트 텍스트를 요소 컨텐츠로 사용하지 않을 경우 필수
file 결과 파일 선택
append 파일을 겹쳐 쓰지 않고 연결, 기본값 false  

  예시

<echo message=”Hello”/>
<echo> This is a message from Ant </echo>

 

2.15 tstamp

- DSTAMP, TSTAMP, TODAY 프로퍼티를 설정

- DSTAMP : yyyyMMdd

- TSTAMP : hhmm

- TODAY : MMM dd yyy

cf. <format> Java SimpleDateFormat 클래스에서 정의한 패턴을 사용해 현식을 변경하는데 쓰인다.

Java8에서는 java경로 /jre/bin/에 JdbcOdbc.dll 파일을 가지고 있지 않아서

java7에서 java8의 경로에 복사해야 사용가능함 

 

 

연결 셈플 소스 

import java.sql.*;
 
public class JDBCAccess {
 
    public static void main(String[] args) {
        JDBCAccess jdbcAccess = new JDBCAccess();
        jdbcAccess.run();
    }
 
    public void run() {
        try {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
            java.util.Properties props = new java.util.Properties();
    		props.put("charSet", "euc-kr");
            // javasubname ist der bei der Datenquelle festgelgte subname
            Connection connection = DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=D:/test.xls",props);
            Statement statement = connection.createStatement();
            ResultSet result = statement.executeQuery
            ("SELECT * FROM [test$]");
            //System.out.println("ID, Name: ");
            while (result.next()) {
            	System.out.println(result.getString(1));
            }
            result.close();
            statement.close();
            connection.close();
        }
        catch(java.lang.ClassNotFoundException e) {
            System.out.println("JDBC-ODBC-Driver not found");
        }
        catch(java.sql.SQLException e) {
            System.out.println("Error on database"
                    + e.getMessage());
        }
    }
}

1. 스레드(Thread)

1. 기본개념

1.1 용어

    Tread의 용어는 '실'   -> 일단 떠올라야되는게 동시실행이다

    기본개념확인

    - 프로그램 : 하드 디스크상에 저장된 소프트웨어

    - 프로세스 : 메모리에 들어가 실행되는 프로그램

    - 스레드 : 실행중인 프로세스의 작업(단위) 단위

 

 하나의 실행 main 스레드라 부른다.

main 스레드의 처리흐름

            main() -> a호출 -> a실행 -> b호출 -> b실행 -> b종료-> a복귀 -> a종료 -> main복귀 -> main종료

1.2 자바 메모리의 구성

 

1.2.1 메서드 영역(Method Area)

          static 변수와 메서의 바이트 코드가 들어간다.  스레드가 공유된다 

1.2.2 스택영역(Stack Area)

         지역변수가 저장된다. 스레드가 공유안된다.

1.2.3 힙영역(Heap Area)

          인스턴스가 저장이 된다. 이영역은 가지지 컬렉션의 대상이된다. 힙은 각 스레드가공유한다.

 

2. 스레드

  2.1 기본내용

         실의 길이에 따라 수행시간 그치만 빠르게 오답 또는 굉장히 느리게 정답을 출력함

          start는 코딩상이 아니라 동시 실행 -> cpu를 선점한다 어떤놈이 먼저인지 모름

         실행순서가 모름 즉 개발자입장에서 제어가 안된다 그래서 프로그램이 아니다?

          getName() -> 가상머신이 이름을 가져온다

         sleep을 통해 살짝 제운다 안그러면 안놓는다. ->말로만동시? 형광등 깜박임

  2.2 문법

        - Thread 클래스를 상속받는 방법

        -  Runnable 인터페이스를 구현

  2.2.1 Thread 클래스의 상속

            Thread를 상속받아 run() 실행 -> run method가 스레드의 main이다

 

  2.2.2 Runnerable 인터페이스 구현

           Runnable인터페이스는  생성하고 Thread를 생성후 Thread의 run메서드를 실행

  2.2.3 라이프 사이클

더보기

 참고)

     java1.0부터 있었음

     동시실행 1core에서는 multi Thread 는 안된다.

     패러럴 컴퓨터

3. 동기화(Synchronized)

3.1 동기화가 필요한경우(부제 : 굉장히 빠르게 오답이 나오는경우)

        3.1.1 스레드가 공유하는 메모리

                  메모리 영영중 메서드, 힙영역을 공유

                  동시에 실행되는 스레드가 공유되는 인스턴스가 가지고 있는 변수에 동시에 접근하는 상황이 발생된는데  이상황이 잘못된 결과를 만들수 있다

메모리 3개(큰방) : 메서드(static), 스택(로칼 -모든 프로그램에 다 있고 반환됨), 힙(인스턴스- 데이터만)

※ 스레드에서 힙에 올라간 데이터를 공유를 하는데 이게 문제

※ join메서드는 같이 가는게 문제 아니라 같이 끝난다

3.2 동기하기반 메서드(부제:굉장히 느리게 정답이 나오는경우)

       3.2.1 동기화메서드 & synchronized 기반 동기화 블록

         synchronized 이거 쓰면 된다 근데 늦다 => synchronized 기반 동기화 블록

  

      3.3.2 스레드의 블록킹 단위

                 메서드 만이 아니라 메서드가 속해있는 인스턴스 전체가 블록킹 된다. 

                synchronized : 블록이라 생각하자  누가 잡으면 못들어감

               모든 인스턴스는 열쇠? 스레드가 열쇠를 잡는 아이가 먼저 -> instance전체 

                =>결론 한줄서기임   

3.3 개발자가 개입하는 동기화 기반 코딩기법

         상황 T1이 변수 a를 변하는 동기화기반 메서드 m1,m2

                 T2가 변수 b를 변하는 동기화기반 메서드 m3,m4 인경우 

              각 인스턴스는 키를 하나씩 가지고 있다

              실행중인 스레드는 인스턴스에 접근할때 키를 가지고 접근한다.

 

              메서드안에는 동기화에 된 코드를 적을수 있는데 메서드 전체가 아니라 동기화 관련된것만 건다

             열쇠는 Object로 생성

 

 누가먼저는 모르지만 결과는 똑같이 하자!!! 그리고 컨트롤을 하자!!(우선순위가 무조건 앞뒤가 있을수 있다)

 

4. 순서제어

   4.1 순서 문제에 대한 해결책 

            각각 다른기능의 thread를 제어해보자 

            Car Class에서 array로 제어

            파는놈 사는놈 두개의 thread를  => 모든 스레드는 순서가 있고 제어하자

 

            wait(); 실행중인 스레드를 blocking (일단쉬어) <-> sleep  특정시간동안 (알람이 없음)

            notify() : blocking 메서드 하나만 실행

            notifyAll() : blocking 메서드가 실행

 

          ocjp -> ocjt(활주로 문제, 알파고 등등 스레드 필수)   -- OS

        

2.  스트림(Stream)과 File I/O

       Stream 강이아니라 물길정도 의미 : 데이터를 흐름 물길

       이번장은 코드가 바뀜

 

    - 자바는 입출력을 입출력 모델로 정의한다 -> 코드가 변한다

    - 모든 스트림은 단방향이다

    - 크게 'Byte Stream' 과 Char Stream 있다  => super class가 4개임(입/출력 분리)

    - 반드시 IOException

 

              Byte Stream   Char Stream

최상위   InputStream     Reader

              OutputStream  Writer

메서드는 read(), write()

 

생성자는 xxx최상위 클래스

 

EOF 상수이고 -1이다

 

 

표준입출력은 개발자가 건드리지 않는다(키보드/마우스)  c에 f.open  -> f는 format이다  point로 열기때문에 

여기서는 스트림이 주인공이다 FIle은 도구이다

 

FileCopy 1byte로 조각낼때 짤림 누수

 

 

1. 기본개념

     -1 은 EOF 상수값이다

 

1.1 용어

2. 바이트 스트림(Byte Stream)

2.1 기본개념

       - 1 바이트 단위로 움직이므로 상당히 느리다

       - 1 바이트 단위 움직이므로 데이터 깨짐 발생한다(소수,SizeOverFlow) 

2.2 데이터 전송 속도가 느려지는 문제

       문제를 처리하는 필터를 끼운다 FileInputStream - > BufferedInputStream  

2.3 데이터가 깨지는 문제

      DataInputStream DataOutputStream

      추가적으로 type을 알려줘야됨 : wrtie -> writeInt wrtieDouble 등등

    ※ Java는 필터를 여러개 쓸수있다

      DataOutputStream out=new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.txt")));

                                                      안깨지고                          빠르고

      필터를 끼우는 순서는?  생성자안에 받을수 있는놈이 있는지 확인한다(즉 생성자를 열어봐야된다)

 

참고)   java이후는 SizeOverFlow 발생된 데이터 순환된다  => C는 일부만

더보기

package day4.bytestream3;

public class SizeOverflow {
    public static void main(String[] args) {
        int a = 0;    // byte로 변경시  결과가 다름   기본과정 첫날  기본사이즈
        for (int i = 0; i < 300; i++) {
               System.out.println(a++);
        }
      }
}

2.4 최종 해결방법

 

3. 캐릭터 스트림(Character Stream)

3.1 등장이유

    -  자바 가상머신도 운영체제 앞에서는 하나의 응용프로그램이다

    - 모든 운영체제가 같은 코드를 사용하지 않는다

 

      java 문자는 2byte 유니코드인데 write할때 아스키로 변환(1byte)까지 해준다.

     xml은 3byte, 언어마다 코드가 다름 또한 운영체제도 친화적이지 않음

     운영체계에 따라 .. 해준다

 

3.2 Bufferedreader & BufferedWriter

      BufferedWriter  out.newLine()  메서드  

     

3.3 PrintWriter (Char Stream 이다)

      PrintWriter        out.println(""),  print, printf  메서드   ->서블릿에서 찍을때도 쓴다.

    ※ Sysout.out.println이것은 ByteStream 이다

 

4. 사용자 정의 필터 클래스

4.1 기본개념

4.2 사용방법

      내가 만든 필터 마지막임(슈퍼클래스가 됨)

      FilterInputStream 상속

      read()

      new String()    -> Serialization에 참여됨

      서버코드  <-> 클라이언트                                   =>   네트워크      Java에서는 인스턴스 직열화     

5. 객체 직렬화(Serialization)

   VO 클래스로 처리해볼까?

5.1 기본개념

     둘다 공통 약점 Byte Char  -> 데이터이동시 VO로 보낼시(1개씩이 아니라) 객체 직렬화

5.2 직렬화 대상제외

    보안상 특정항목을 지울때 transient -> 다른값으로 변경 불가

 

5.3Externalizable 인터페이스

5.3.1 writeExternal()

5.3.2 readExternal()

 

 

1. 래퍼(Wrapper) 클래스

      - 기본데이터를 감싸고 있는 클래스  (기본데이터 타입을 만들어주는 클래스를 만들자, 포장) 

       

       참고) Object는 최상의 클래스(기본타입은 받을수 없다)

              public void m(Object obj) -> 다 받아준다   근데 m(10)  m(10.5) ... 사용하려면 overloding을 해야된다? 

             

기본타입과 래퍼클래스
래퍼클래스의 메서드

   기본타입 : 프리미티브 타입, 래퍼 타입 ( 서로 호환은 안됨)

             목적:  기본데이터 타입을 래퍼타입으로 바꾸는것 즉 감싸서  (기본 toString이 래퍼클래스에 있다)

             가지비?  수정불가 불변(Immutable)  그러니 new 한다(Boxing UnBoxing이유) p107   

             내용은 동일하지만 Wrapper당

             T rv = 10 ; 올른쪽에 기본데이터가 자동으로 Wrapper가 되는경우는 래퍼타입일때만 함

 

1. 래퍼클래스 등장이유

       외계인(기본타입) 을 지구인(클래스 타입)으로 만들어주는 클래스 

2. 래퍼클래스의 기본 개념

  2.1 래퍼클래스의 종류

    래퍼 클래스 : 메서드를 가지고 있다

기본타입과 래퍼클래스
래퍼클래스의 메서드

  2.2 Boxing & UnBoxing

        Boxing : 래퍼클래스로 기본타입을 감싸 인스턴스 생성 

        UnBoxing : 반대과정

       예시)

       Integer i = new Integer(10)

       java5부터 Integer i = 10 가능하나 인스턴스 생성이 이루어진다.

                        i += 10

      ※ 래퍼로 생성된 인스턴스는 문자열 인스턴스처럼 한번 생성하면 불변(Immutable) 이다

          래퍼런스 타입과 기본타입은 절대 호환안됨(연산안됨)

  2.3 AutoBoxing & AutoUnBoxing

        Integer i = 10;

        i += 10;

2. 제너릭(Generic)

    java5

 1. 제너릭 기본

    데이터 타입의 일반화 

    기타내용) 대문자 아무거나

                     overridng 을 피하기 위해 만들었당~~

 2. 제너릭 클래스

       참고)에러는 컴파일타임, Exception runtime에 발생

       컴파일 타임에 에러 발생하고자 함(타입체크  선행)

 

   2.1 Object 클래스를 이용하여 하나의 클래스로 처리하는 방법

            Object 하나로 파라메터 처리하기 위해

            ex) gs2.boxing("식품")  -> 실행이 된다 : 에러가 발생하지 않는다(컴파일 타입)

          

   2.2 각 배송물건에 대해 개별 배송 클래스로 처리하는 방법

          배송클래스를 두개 Class로 만들때

        -> runtime에서 에러 발생

   2.3 제너릭 클래스

         -  Object가 적용된 자리(데이터 타입)를 T로 치환한다

         -  T로 치환된 자리의 타입은 인스턴스 생성시 결정된다.

          - T자리에 클래스 타입만 들어올수 있다

         ※ 하나의 클래스로 만들수 있고 에러처리가능(데이터의 안전성 보장하기 위해)

     예시)

      Class T goods<T>{

            T goods;

            public void boxing(T goods){

               this.goods = goods;

       생성 

                GoodShip<Electonic> gs1 = enw GoodShip<Electonic>();

        ※ GoodShip이 다양한 클래스 대응(코드 간결), 데이터 타입에 안정성(컴파일 타임 에러)

 

 3. 제너릭 메서드

    파라메터가 다를 때 적용할수 있다  - > 캡슐화도 기능 

  - 메서드 오버로딩을 대체할수 있다

  - 같은 기능을 수행하나 전달되는 파라미터가 다를 때 적용할 수 있다.

  선언방법) public static <T> void seeSmartTV(T param)

   정식) shower.<AAA>gMethod(aaa)

            shower.gMethod(aaa) ==> 캡슐화에 기능이 있다

 4. 제네릭 고급

   일부 제한 기능

   참고)

          -묵시적 형변환원칙

          10 + 10.2 큰것에 반영된다.    = 이라는것은 동일형이여야 된다.

         -명시적 형변환 

           에러가 뜨는자리인데 에러 없게 하기 위해 -> 개발자의 손실을 감당한다.

            타입을 줄이겠다(좁히겠당)

           데이터가 짤리거나 .. 좁히기 위해

4.1 제네릭 메서드에서 파라메터의 데이터 타입의 제한

      모든클래스가 아니라 내가 원하는 클래스 타입으로 제한 하는것

      extends를 사용

     주절이)  블루레이 영상+ 음성 분리

     public static<T> void seeSmartTV(T param){

                         ((Computer)param).runProgram();

 

     public static<T extends Computer> void seeSmartTV(T param){

                         param.runProgram();

                   

 

4.2 제네릭 메서드에서 파라미터로 배열전달

      public static <T> void printArr(T[] arr)  -> 모든테이터 타입의 배열을 찍는다

                 for(int i = 0; i<arr.length;i++){

                 }

     잠깐)  

                int [] arr =new int[5];  -> java는 배열을 instance로 본다

               명시적 선언 -> 인스턴스로 만들때 주소값을 만들고 -> 이항연산자는 같아야 Class로 받야야되는데(주소를 받을?)

      int [] => data type으로 봐야되고 래퍼런스 타입이고 array 타입이다.

     arr는 래퍼변수이고 즉 주소를 가지고 있다.

    모든프로그램에서 배열의 이름은 주소값이다.

    파라메터는 복제되어 전달인데? arr은 서울시 주민번호라 하면 아됨  주소를 전달한다

 

   잠깐) 왜 배열을 쓸까?

           1. 반복문의 사용조건          : 코드는 변하지 않고 값만 바뀐다.  <- 변수가 많음(안됨) a~z

           2. 반복문을 못쓰면 길어짐 

         반복문에 For문의 약점

             1) 반복대상의 갯수를 모르면 안된다. ~~~> length의 태생

             2) 순서가 없는데이터인경우 에러 된다. 

       Collection은 저장소이다  왜 Java는 배열이 있는데 만들었을까? 어떤저장소를 선택해야되는지?

     

4.3 제네릭과 와일드 카드

     제너릭 클래스에서 T를 제한하고 싶을때  즉 Car클래스를 상속받은것만으로 제한할때

   1)  AAA<? extends X> aaa

      X라는 클래스를 포함하여 X의 하위의 클래스는 모두 올수 있다

   2)  AAA<? super X> aaa

      X라는 클래스를 포함하여 X의 상위의 클래스는 모두 올수 있다

    예시)

       public static void drivingCar(Cargo<? extends Car> cg)          ==> 여시서 dirvingCar는 일반메서드

       Cargo의 타입은 Car를 포함하여 하위 클래스는 모두 올수 있다

 

3. 컬렉션 프레임 워크(Collection Framework)

      저장소이다

 

     Warapper 제너릭을 알아야 알수 있다.

     클래스의  공부팁 

        최상클래스(super)의 메서드를 알면  상속받고 overrindg되고 (공통되는 기능이 들어감)

        최상의 클래스가 interface이면 -> 생성할일이 없다(왜 인스턴스를 생성하지 못함)

       목적 : 공부하는 방법 주요콜랙션을 알자 --> 무수히 많다(성능을 잘못잡았을때 성능이 안나옴)

                 성능이안나오는 주범1

더보기

   주절이1)

     D.S : 자료구조 (수학 F 증명하는 수학 목표1-time sort 의 증명 2-메모리를 적게)-> class를 많이 만듬

     < 알고리즘이 상위과정

    자료구조에서 성능이 좋은 알고리즘이 Collection에 있다

    sort : 1) 0번째 방에서 ~~~ 작은수     select소트   

            2) 앞뒤로 바꾸고 맨뒤에서 정렬  버블소트 : 시간복잡도+공간복잡도 크다

    quick sort 를 쓰면 빠르다  node

  주절이2)

    배열의 장점 : 검색속도가 좋다(이름과 index를 알면 한번에 찾는다)

          단점 : 1) size조정이 안된다. 2) 메모리 낭비가 심하다 3) 타입을 하나만 쓸수있다.

                 배열은 첫 마지막을 point를 가지고 address를 쓰는데  빈공간이 있으면 안된다  방의갯수가 크면

               오버로드 발생, 

                  첫번째 공간이 사라질때 shift, 추가될때 shift 가 발생

                 ==> 배열은 삽입할때 안좋다

                

                 ==> java는 Class로 , C는 구조체를 사용한다.

          ※ 보통 사이즈를 잡을때 넉넉히 ~~~ max로 

 

컬렉션에는 인스턴스 만 저장된다

=> 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음

 1. 컬랙션 프레임워크의 개요

  1.1 개요

   컬랙션은 저장소이다  프레임워크로 불린다는것은 개발자가 구현해야될 코드를 미리 구현됨

   - 컬랙션에는 "인스턴스" 만 저장된다.

   => 클래스로 생성된 인스턴스만 저장 한다 (기본데이터는 ? 래퍼) 생성된 구조 인스턴스 값을 받음

  1.2 구조

 

    클래스의 최상클래스(super)의 메서드를 알면  상속받고 overrindg되고 (공통되는 기능이 들어감)

 

    override이면 method name parameter, return type이 안바뀌고 동일함  , map만 다름

 

1.3 List 를 구현한 클래스

  List를 구현한 컬렉션 클래스의 공통 성격

  - 데이터의 저장순서를 유지

  - 중복데이터의 저장을 허용

- > Framework라 부르는게 삽입삭제를 알아서 한다(인스턴스에 따라 저장소가 달라진다 즉 소스코드는 동일하다)

 

  1.3.1 ArrayList

         1차원의 배열

         장점 : 검색속도가 빠름 (인텍스로 데이터를 찾기때문에)

         단점 :  데이터 삽입, 삭제 연산시 부하가 많음

  1.3.2  LinkedList

         하나의 주소에 데이터가 있는구조 

         장점 : 데이터 삽입 삭제가 용이함

         단점 : 데이터 검색속도의 일관된 보장이 어려움

       

        시작:다음주소   주소:다음주소   주소:다음주소...  끝   ==> 즉 중간삽입이 용이

더보기

실시간 검색어(배열) 1등이 먼저나오는 알고리즘 없다 -> 다뒤져봐야지 일관성

 인스턴스 응답속도를 동일하게 만들어준다?

 검색관련 : B, B+ B* tree  크롤링    

     node 

 

1.4 Collection을 사용하는 이유는 무엇인가?

     검색 -> 배열의 자료구조 변경시 

   ※ 저장소가 바뀌면 코드가 달라지는데 Collection을 사용하면 동일하다

    Colleciton을 만든이유 class만 바꾸면 된다

    상속만 잘 설계하면 된다

1.5 Set을 구현한 클래스(집합이다)

    - 데이터의 저장 순서를 유지하지 않는다(집합의 특징)

    - 중복데이터의 저장을 허용하지 않는다(원소나열법-집합의 특징)

        근데 일부에서는 ? HashSetCheck1 참고 

        Hash :검색 찾는데이터가 알고리즘이 없으면 순차

                  10,15,2,6,11,4 ==> %3 균등하게 나눈다  Hash 알고리즘임

   - 단 중복의 기준은 개발자가 정할수 있다 

      hSet.add(new Data(15)) <-> hSet.add(15)

 

1.5.1 Set에서 반복처리

        SDS LG SK LG  -> 3개 

         new로 생성시 4개

  Iterator (반복자) - > for문에는 사용못함(set이 순서가 없어서)

                           list는 쓸수 있다 왜 줄서있어서..

 

 

1.5.2 HashSet

  ※ hasCode, toString을 override를 통하여 중복 제거

     hasCode에 검색 알고리즘이 들어감 Has알고리즘  --> overriding 해야됨

     equal() 메서드는 '==' 연산자를 통해 같음을 오버라이딩 한다.

1.5.3 TreeSet

  Tree가 별거 다쓴다 Java에서는 무조건 정렬 Class이다

  - Tree를 기반으로 자료를 저장하고 데이터를 정렬한다.

  - 정렬의 기준은 개발자가 한다 (정렬은 Iterator가 결정한다 itr=sTree.descendingIterator(), 래퍼클래스는 별도 코딩으로

     해야지~~~compareTo를 쓰고 꼭 Comparable를 구현 Mak Interface)

 

 - TreeSet<E>에 데이터 저장시 반드시 Comparable<T> 인터페이스의 구현이 필요

   compareTo 메서드의 오버라이딩이 필요                ==>VO Class 일때

- 혹은 Compare<T> 인터페이스 구현시

   compare메서드의 오버라이딩이 필요                    ==>VO Class 일때  

- 이따 메서드의 전달된 파라메터기준으로   

  1) 파라메터가 작으면 +(정수)  리턴

  2) 같으면 0 리턴

  3) 파라메터가 크면 -(정수)  리턴  

 

※ add메서드 : compareTo hasCode가 자동으로 되는게 있네

 

1.6 Map을 구현한 클래스

 - 데이터를 저장할때 사용하는 메서드가 add()에서 put()으로 바뀜

- Map<K,V>에 데이터를 저장할때  key,value 구조 저장(열쇠를 꽂아야 나옴  get에 index가 아니라 key임)

- key는 중복이 있으면 안됨

 

    NevigableSet<Integer> navi = tMap.navigableKeySet();

    Iterator itr = navi.iterator();

    or

    Iterator<integer> itr = tMap.keySet().iterator();

 

     

   ※ 정렬은 iterator()  descendingIterator()

   

 

  Collection은 API가 많다 ~~~

더보기

많이 쓰는것~ Map,  Collection 저장소 안에 저장소를 넣는다 Colleciton은 인스턴스만 저장 인스턴스는 클래스로 만들어짐

           cp, sc, tv 등등을 저장하는 Map 즉 Map만 가져오면 다 가져온다.

         spring put? 제일 밖에 Map이 있다

 

 

디자인 패턴 3가지

   ※ 앞으로 collection에서는 for 를 안쓰고 Iterator를 쓴다  --> 다 사용할수 있으니 패턴이라 한다.

1. 추상(Abstract) 클래스

      빼낸다 -> 불안전한 메서드 생성 -> 인스턴스를 생성할수 없다

     상속을 통하여 완전한 메서드로 사용(상속된 메서드는 구현체 일명 Implement 또는 Service)

     1개라도 추상클래스가 있으면 추상클래스 

 

     참고) 메서드 4요소 :  메서드 이름, 파라메터 갯수타입, return value, body

             

 

    1.1 추상클래스의 개념

          - 추상클래스를 상속받은 클래스는 추상클래스가 가지고 있는 모든 추상클래스들 오버라이딩 해야한다.

    1.2 추상클래스 문법

          super가 소유한 추상메서드 

         안보이는거 보이기(생략문구 찾기)

          abstract void bb()  --> public void bb의 추상(즉 public static 생략됨)

     1.3 추상클래스의 사용이유

           일을 동시 진행 협업을 하기 위해   -> 없어도 구현할수 있다  생성만 빼고

package day2.abstractexam;

abstract class Afunction{
	public abstract void searchInform(String name, int phoneNum) ;
	public abstract void runService(int memberId, int request) ;
}

class AfunctionImpl extends Afunction{

	@Override
	public void searchInform(String name, int phoneNum) {
		System.out.println(name + " 고객님의 정보를 찾았습니다");
		
	}

	@Override
	public void runService(int memberId, int request) {
		System.out.println(memberId + " 고객님의 요청하신 서비스를 수행합니다");
	}	
}

public class AbstractExam {

	public static void main(String[] args) {
		Afunction aref = new AfunctionImpl() ;   //Afunction로 임시 넣고 가능 동시진행이유
		
		aref.searchInform("장그래", 0101112222) ;
		aref.runService(100, 1) ;
	}
}

2. 인터페이스(Interface)

   2.1 인터페이스의 개념      

         - 100% 불완전한 메서드로 이루어진 것

         - 열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

     용어상)  두개의 물체가 만나는 접속면

       java는 다중상속을 지원하지 않음 -> 단일상속이다

  2.2 인터페이스 문법

           - 공식적인 클래스가 아님(Interface로 선언)

           - extends로 선언 불가  -> implements 키워드 사용

           - 메서드 오러라이딩의 원칙 -> 즉 public 만 접근제어 가능(public static final 생략됨)

 

    참고) 메서드 overriding의 접근제어 고찰

            접근제어는 같거나 넓어질수만 있다(Interface는 항상 접근제어는 public이다)

  2.3 인터페이스의 사용이유

          다중상속(x) -> 느슨한 결함(Loose Coupling)관계를 만들기 위해

          Oracle, DB2 등등   회사가 바뀌어도 기능은 동일하게 즉 메서드가 변하지 않는다(코드변화가 없다)

 

  2.4 인터페이스의 기타 사용

     2.4.1 C언어의 열거형(enum type)처럼 사용되는경우

interface Week
{
   int SUN=0, MON=1, TUE=2, WED=3, THU=4, FRI=5, SAT=6 ;
}

  열거형(클래스가 아닌것이 클래스.변수로 사용 즉 public static final이 생략됨)

 

2.4.2 마크 인터페이스(Mark Inteface 또는 Tag Interface)

    아무런 형태없이 텅 빈상태(분류를 위해 사용)

      Data1 Data2 하나는 상속 아니면 없음

   ~able로 선언된것들이 대부분 Serializable과 Parcelable, Cloneable, Runnable 등등

 

 

2. 내부클래스(Inner Class)

1. 내부클래스 (Inner Class or Instance Class)

    내부클래스는 외부클래스에 대해 변수접근 가능 -> 캡슐화 강도가 최대가 되는 장점이 있다(a 와 b 클래스를 나눌수 없다)

   - 내부클래스에서는 외부클래스의 변수와 메서드를 자유롭게 사용할수 있다

   - 내부 클래스 이름앞에 접근제어는 4종류 모두 사용가능하다

   - 내부 클래스는 외부클래스가 소유하고 있는 변수 , 메서드와 동일하게 취급된다.

 

1.1 내부클래스(Inner Class or Instance Class)

         반드시 외부클래스 생성후 내부클래스 생성해야된다.

         OuterClass out = new OuterClass();

         OuterClass.Inner in = out.new Inner();

   

1.2 정적 내부 클래스(Static Class)

     내부클래스가 static사용하여 

    - 외부클래스를 인스턴스 생성하지 않아도 내부클래스를 사용가능(static은 메모리 생성)

    - 정적 내부 클래스에서는 외부 클래스의 static 변수와 메서드만 접근 가능

 

1.3 지역 클래스(Local Class)

     외부클래스의 메서드 내부에서 선언되는 클래스 

    - 외부클래스가 가지고 있는 모든 인스턴스 변수, static변수, 메서드 접근 가능

    - 지역클래스가 선언된 메서드가 가지고 있는 지역변수 접근가능(단 final로 선언된 변수만 접근가능)

    - 지역변수와 같은 특성으로 메서드 내부에서만 인스턴스 생성가능

    - 지역 클래스는 지역변수처럼 접근제어가 default인 변수만 선언 가능

    - 메서드 종료시 메모리 삭제됨 (중괄호가 닫히기전에 생성과 사용이 끝나야됨 return type은 꼭 상위interface로)

package day2.localclass;

class LocalClassExample{
    private int num1 = 0;
    private static int num2 = 10;
    private static final int num3 = 100;     

    public void outerMethod1() {
          String city1 = "서울";
          final String city2 = "뉴욕";
          System.out.println(city1);
          System.out.println(city2);
          System.out.println("파리");
    } 


    public void outerMethod2() {
          //public int aa= 0; 컴파일 에러
          String hello = "안녕하세요";
          //private final int bb = 1; 컴파일 에러
          //private static int cc = 2; 컴파일 에러
          final int finalNumber = 2015;             

          	class Local {
                 		public void localMethod() {
                     		System.out.println("외부클래스 메서드 접근가능");
                     		outerMethod1();
                    		System.out.println("외부클래스 변수 접근가능");
                     		System.out.println(num1);
                    		System.out.println(num2);
                     		System.out.println(num3);
                 		}

                 		public void localMemberDisplay() {
                     		System.out.println(
                      		"LocalClass를 포함하는 메서드의 변수 : ");
                     		//System.out.println(hello); 컴파일 에러
                     		System.out.println(finalNumber);
                		}
          	}
          Local local = new Local();
          local.localMethod();
          local.localMemberDisplay();
    }
} 

public class LocalClass {

	public static void main(String[] args) {
		LocalClassExample test = new LocalClassExample();
         test.outerMethod2();

	}
}

 

1.4 무명 클래스(Anonymous Class)

 지역클래스하고 유사 다만 클래스 선언이 아에 없는 특이한 구조로 클래스 이름이 없다, 다만 인스턴스생성과 구현만 있음

 - 인터페이스를 구현한 클래스의 사용빈도가 극히 적을 경우

 - 한번만 사용되는 인스턴스인 경우

 ==> 태생이 지역클래스의 일부 생략

        그리고 마지막에 ";"으로 끝난다, interface앞에 new가 있다

package day2.anonymous;

interface Anony 
{
	public void readName();
}

class OuterClass
{
	private String className;
	
	OuterClass(String className)
	{
		this.className=className;
	}
	
	public Anony outerMethod(final String id)
	{		
		return new Anony()
		{
			public void readName()
			{
				System.out.println("Outer ClassName: "+className);
				System.out.println("Local ID: "+id);
			}			
		};
	}
}

class Anonymous
{	
	public static void main(String[] args)
	{
		OuterClass out=new OuterClass("My Outer Class");
		Anony ano1=out.outerMethod("My First Anonymous Class");
		ano1. readName();
		
		Anony ano2=out.outerMethod("My Second Anonymous Class");
		ano2.readName();
	}
}

return new Anony() { body };- > class AnonyLocal implements Anony 와 같다

※ Anony 는 interface이다

3. 기타문법

1. Enum Type

     java5에서 시작

     열거형의 태생은 가독성을 위해 switch하고 같이 사용하려구

1.1 Enum 개념

      Interface에서 사용 예

     

     enum형(메서드 파라메터 타입에 열거형 즉 validation하기 위해 - 잘못됬을때 멈춤)

  사용시 클래스 없이 접근 가능

 

1.2 Enum 메서드와 enum상수에 데이터 입력

   생성자와 동일하게 사용되는데  static 부분과 static 이 아닌부분으로 나누어짐

   열거형 상수가 진화하여 문자열도 사용가능(단 getter, setter를 생성)

     = > Class가 아닌대 대문자, 

    ※ setter는 생성자로, public static final 숨겨있음

package day2.enumparents3;

enum Parents {
	   FATHER("아버지"), MOTHER("어머니");
	   
	   private String call;
	   
	   Parents(String call){
	        this.call = call;
	    }

	    String getCall(){
	        return call;
	    }
}

public class EnumParents3 {
	public static void printParents (Parents p){
		System.out.println(p);
	}

	public static void print(Parents d){
		switch (d) {
		case FATHER: 
			System.out.println("아빠");
			break;
		
		case MOTHER:        
			System.out.println("엄마");
			break;
			
		default:
			System.out.println("부모님 중 한 분만 !!");	
		}
	}

	public static void main(String[] args) {
		printParents(Parents. MOTHER);
		print(Parents.FATHER);
		print(Parents.MOTHER);
//		print(Parents.BROTHER);  컴파일 에러
		
		for(Parents p : Parents.values()){
		    System.out.println("enum 내부 데이터 : " + p);
		}

		System.out.println(Parents.FATHER.getCall());
	}
}

             value관련 메서드는 static, 다른건 non-static변수임 레퍼변수.상수.name.... 

1.3 Enum 실제 클래스 사용

      역컴파일로 풀면 Enum을 상속받은 class로 만들어짐

 

   참고) for each (=enhanced - for)

    두덩어리  1) 저장소에 들어간 타입 

                    2) java저장소 2가지 배열, 클래스만 있고 무조건 처음부터 끝까지

   for(저장소 타입 : 저장소)

2. Variable Argument

    java5에서 시작 

    method overloding을 피하기 위해 생겨남

 

2.1 Vaiable Arguments 개념

  클래스 overloding의 확장 개념이라고 생각됨

- 메서드 호출시 파라미터의 개수를 마음대로 선언할수 있다

- 파라미터 선언시 항상 마지막에 위치(혼합사용)

- 자동으로 1차원 배열처리 해준다

  ex) public static void vArg(String name, int .. gnums){

     for(int s : gnums.values()){

     }

    for(저장소 타입 : 저장소)  

1. OOP 클래스 설계

    1.1 개별클래스 설계 

         

    1.1.1 Object(=객체) 

        객체 : 각 입장에서 바라보는 대상으로 속성 + 기능

         구체화 방법 : Object 모델링 즉 속성 + 기능으로 나눔

   1.1.2 Class

         Class : 객체를 Object 모델링(속성 + 기능)을 프로그램의 언어의 문법을 빌려 표현

                     속성 -> 변수, 상수

                     기능 -> 메서드   표현

    1.1.3 Instance 

          new라는 연산자를 통해 Class를 메모리에 올려 사용 

1.2 각 클래스 사이의 관계

     원칙 : 각 클래스를 코딩 할 때 클래스 내부에서 선언된 변수는클래스 내부의 메서드로만 핸들링한다.

    1.2.1 메시지 패싱(Message Passing)

             클래스간의 관계는 메서드의 호출로 제한한다

             ex) CarSale1 -> CarSel2(객체의 확장 현실반영) ->CarSel3(생성자)

            참고 : getTer setTer

   1.2.2. 객체지향은 현실세계를 반영한다

            한명에서 두명으로 늘어났다는 것은 "객체지향은 현실세계를 반영한다" 

   1.2.3 생성자

           - 클래스이름과 같은 메서드

           - 인스턴스 변수를 초기화하는 기능

           - 유일하게 메서드의 리턴 타입이 없음

           - 생성자 내부에서는 final로 선언된 상수의 초기화가 한번에 가능

 

           참고 :  지역<->전역 : 중괄호 안/밖
                       전역변수가 없음(단 static변수 : 전역변수 대체)

                       this 는 인스턴스 자기 자신을 가리키는 키워드 ==>파라메터는 임시발급임으로

 

1.2.4 인스턴스 변수의 직접접근 

          레퍼런스 변수. 변수  또는 레퍼런스변수.메서드()

 

1.2.5 정보의 은닉(Infomation Hiding)

           클래스 간의 관계는 메서드의 호출로 제한한다 = 클래스간의 관계를 메서드 호출로 강제한다 

            관련 : 접근제어  

 1.2.6 접근제어(Access Control Idenifier)

           private -> default(같은패키지) -> protected(같은패키지 + 다른패키지 속에 sub클래스) - > public 

 1.2.7 캡슐화(Encapsulation)

          연관성 있는 변수와 메서드를 하나의 클래스로 묶는거(입력과 출력이 고정, 코드변화를 최소화) 

          예제) 우주선

 

1.3 Static      

      정적 -> 공유

      - 프로그램 실행시 선언문은 한번만 실행

      - 소속되어 있는 클래스의 인스턴스 생성여부와 상관없이 스스로 메모리에 들어감

      - 레버변수 없이 클래스 변수로 접근  클래스변수.변수 또는 클래스 변수.메서드

   1.3.1 Statc 변수

   1.3.2 Static 클래스     

           스스로 메모리에 들어감. -> 인스턴스 생성이 없어서 코드 간결

           new 연산자를 사용하지 않음 - > 실행속도 빠름

           static 은 가비지 컬렉션(Garbage Collection) 대상이 아니므로 메모리 낭비가 있을수 있음

           static 메서드 사용시 메서드 내부에는 인스턴스 변수와 인스턴스 메서드의 호출을 할수 없음

 

    1.3.3 Static으로 만든 클래스 

          참고 :  100% static 변수 및 메서드로 사용  -> System, Math 클래스 대표(즉 라이브러리 성)

 

2. String 클래스

    1. String 클래스 

    1.1. String 클래스의 기본

            문자열은 인스턴스(new 없이 사용), 문자열은 상수 (같은값은 메모리가 동일)

            - "" 로 생성된 문자열 인스턴스의 주소를 레퍼런스 변수가 받는다 

            - 같은값이면 인스턴스의 주소를 복사한다.

            - 이는 문자열의 내용이 바뀔수 없기 때문에 문자열의 인스턴스는 상수이고 불변)

           참고) c언어는 시작pointer로 무한데 null까지 

        1.1.3 문자열 메서드 

                 substring : 주소값으로 시작부터

                 compareTo : 문자열 비교로 길이를 비교하지 않음

        1.1.4 클래스 현장에서 String 클래스 사용을 지양하자( 성능속도에 주범2-불변Immutable)

                  A + B                new + new 
                  AB + C                new + new
                     ABC + D           new + new 

               참고 : 가장느린 연산자 new    -> 가비지 컬렉션을 유발한다

               용어 : 가비지 콜렉션이란 메모리에는 떠있는데 사용(호출)하지 않는  주소를 말함

       1.2 StringBuilder & StringBuffer            

               StringBuilder -> Thread UnSafe
               StringBuffer  -> Thread Safe

               new 1번 생성후 출력시 String으로 new 1번

             ※  Thread의 정의 : 동시실행

 

3. Console Input & OutPut

      Console의 탄생 : 중앙시스템을 시분할방식으로 연결 더미 시스템이 모니터와 키보드만을 가지고 있을때

     참고 :  T(time)DMA - > C(code)DMA

         입출력의 태생    

구분 C Java 비고
입력 scanf Scanner Java는 Class로 시작
출력 printf printf(Java5)
println
printf 늦게 나옴

예제) System.out.println(class)  classpath@주소값 나옴

        주절이) public int chkID(int key1, int key2){   -> 지양 : 파라메터 해킹

                     VO(Value Object)  DTO(Data transfer Object)  태생 

        생성자 및 toString은 이클립스 도구를 사용하자

1. ConsoleOutput

   1.1 printf() && println() 

      println() : 해당 주소값에 toString() 메서드를 호출한다

 

  2. Console input      

    2.1 과거버전 콘솔출력  

package day1.pastconsole;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class PastConsoleInput {

	public static void main(String[] args)
	{
		try {
			InputStreamReader isr=new InputStreamReader(System.in);
			BufferedReader br=new BufferedReader(isr);
			System.out.print("정수를 입력하세요: ");
			String str=br.readLine();
			int num=Integer.parseInt(str);
			System.out.println("입력된 정수는: "+num+"입니다");
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}
}

 

   2.2 Scanner 클래스 

        간결하고 입력 장치에 영향을 주지 않음 -->  java가 class로 만든원인임

         Scanner 클래스에서 지원하는 장치에 대해 동일한 방법으로 사용하겠다

 

4. 상속(Inheritance)

     1. 개념정리 

      1.1 내용

             상속이란 상위(super) 클래스가 가지고 있는 변수와 메서드를 하위(sub)클래스에게 그대로 물려주는것을 의미

             상속이 코드 재활용?  ->CBD(Component Base Development) 

              UML관계표시 super <- sub 

       1.2 상속의 룰

              extends라는 키워드 사용              

            1.2.1 IS-A 관계

                   Truck is a Car  (O)   Car is a Truck(X)

            1.2.2 Has-A관계

                          1개까지는 어떻게

             1.2.3 Composite 관계 

                         Has-A 관계 보완 합성관계

                        참고 com.school 같은 클래스의 묶음

 

2. 다형성(Polymorphism)

            

            Overloading   :  1개의 클래스에서 여러개의 호출 파라메터 타입 갯수를 다르게

                                 Overloading 정의 : 그랜저 예시 2.4 3.0 X 생산년도별로  x 세대

                                  1개의 클래스에서 여러개 호출 파라메터 객체의 타입과 갯수 다르게

            Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값 은 그대로 사용)

 

 2.1 메서드 오버라이딩(Overridng)  2개이상 클래스

        Overridng : Super class것을 재정의 (메소드 이름, 파라메터 갯수타입, return 값)

               1) 겹치는 소스사용가능

               2) 명시적 형번환 가능 super class 래퍼변수는 sub instance를 사용가능

               3) overridng된 메소는 형변환에서 제외된다.(body 재정의)

 

 2.2 상위 클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조할수 있다

       

상위클래스 레퍼런스 변수는 하위클레스의 인스턴스를 참조방법 예시

                       단. 오버라이딩 된 메서드는 형변환에서 제외가 된다

         ※  앞으로 super class로 레퍼변수를 사용하자

             장점 : 코드가 간결(메소드 하나), 라인수가 많아짐(함수증가), 메소드 이름 변경없음

  2.3 다형성(Polymorphism)

           클래스간의 관계에서는 메서드의 호출로 제한한다

          -> 상위클래스의 레퍼런스 변수로 하위클래스 인스턴스 참조가 가능하다.

          

           ==> 코드의 변화가 없다(동일하다) 

             다형성의 의미이미 사용법은 메서드 오로라이딩

                                            상위클래스의 레퍼런스 변수는 하위 클래스의 인스턴스를 참조 가능(상속으로)

           레퍼런스변수.메서드 했을때 결과가 다르게 나옴(상위클래스로 처리시)

 

        - 메서드 오버라이딩

        - 오버라이딩된 메서드는 형변환 대상에서 제외된다.

        - 상속을 통해 연관된 클래스들을 동일한 방식으로 접근한다.

        

 

  

이클립스 Java 프로젝트에서 외부 라이브러리를 Jar로 만들경우 내부 에 포함시키는 방법

com.dicws.db   : 배포할 프로젝트

외부라이브러리 : db2jcc4.jar, jdbc.jar, mysql-connector-java-5.1.28-bin.jar, ojdbc14.jar, sqlite-jdbc-3.7.2.jar

 

ㅁ Jar로 배포(Runnable JAR File) 

    배포할 프로젝트 선택후 파일(F)->내보내기

 

 

▶ 실행구성(Launch configuration Main) : Main Class 지정

 대상내보내기(Export destination) :  생성할 JAR 파일의 위치와 이름 설정

 Library handling 에서 옵션 설정

   - Extract required libraries into generated JAR    : 필수 라이브러리들을 추출해서 내부로 포함.

   - Package required libraries into generated JAR : 필수 라이브러리들을 전부 패키지로 Jar 내부로 포함

   - Copy required libraries into sub-folder next to the generated JAR : 필수 라이브러리들을 전부 Jar 외부의 하위 경로 로 복사하고 class-path로 참조한다. 필수 라이브러리들은 생성할 JAR파일명_lib에 저장한다.

(사용하지 않는 라이브러리가 포함될 수 있다)

 

 

예) Extract required libraries into generated JAR로 실행Jar배포 하고 다른프로젝트에서 가져왔을때

가져왔을때 참조 라이브러리

원래 프로젝트 패키지 com.dicws.db 외 라이브러리가 내부처럼 Jar안에 들어가 있음

ㅁ 객체지향 프로그래밍

객체지향 프로그래밍(Object-Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 로직을 상태(state)행위(behave)로 이루어진 객체로 만드것

 

   좋은 객체를 만드는 법이다. 이것을 다른 말로는 설계를 잘하는 법이라고 할 수 있다. 좋은 설계는 현실을 잘 반영해야 한다. 

 

ㅁ 부품화

   정신적인 것은 실체가 없고, 무한하고, 유연하다. 이러한 특성은 정신이 가진 장점이면서  소프트웨어의 극치다. 하지만 정신의 이러한 특성은 때로 오해나 모순 같은 문제점을 유발한다. 소프트웨어도 이러한 문제점을 그대로 상속받는다. 이러한 문제점을 극복하기 위한 노력 중의 하나가 부품화라고 할 수 있다

 

ㅁ은닉화 캡슐화

  제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 이를테면 모니터가 어떻게 동작하는지 몰라도 컴퓨터와 모니터를 연결하는 방법만 알면 화면을 표시 할 수 있는 것과 같은 이치다. 즉 내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다. 이러한 컨셉을 정보의 은닉화(Information Hiding), 또는 캡슐화(Encapsulation)라고 부른다 

 

ㅁ 인터페이스 

   컴퓨터와 모니터를 만드는 업체들은 위와 같은 케이블의 규격을 공유한다. 모니터 입장에서는 컴퓨터가, 컴퓨터 입장에서는 모니터가 어떤 식으로 만들어졌는지는 신경쓰지 않는다. 각각의 부품은 미리 정해진 약속에 따라서 신호를 입, 출력하고, 연결점의 모양을 표준에 맞게 만들면 된다. 이러한 연결점을 인터페이스(interface)라고 한다.

   - 인터페이스에 정의된 모든 메소드는 상속받는 클래스에서 전부 오버라이딩해야 한다.

   - 인터페이스로부터 상속 받을 때 implements키워드 사용

 

ㅁ 클래스와 인스턴스

    클래스는 연관되어 있는 변수와 메소드의 집합

    new 키워드를 통하여, 이렇게 만들어진 구체적인 제품을 인스턴스(instance)라고 부른다. 아래의 관계를 기억하자.

   

   맴버(member)는 영어로 구성원이라는 뜻이다. 객체도 구성원이 있는데 아래와 같다.

  • 변수
  • 메소드

  ※ 클래스도 인스턴스도 맴버를 가질수 있지만 인스턴세는 맴버값이 다르다

 

  인스턴스 변수와 클래스 변수는 아래와 같이 부르기도 한다.

  • 인스턴스 변수 -> Non-Static Field
  • 클래스 변수 -> Static Field
더보기

Class         : 객체를 만들어 내기 위한 설계도

Constructor : new  Instance 통하여 초기화담당   ==>초기화시 이름, 나이, 출생지 받는 것

Instance     : 구현된 구체적인 실체(메모리사용)        == 생성자라고 함

ㅁ 상속(Inheritance)

    상속(Inheritance)이란 물려준다는 의미다. 어떤 객체가 있을 때 그 객체의 필드(변수)와 메소드를 다른 객체가 물려 받을 수 있는 기능을 상속

※ 부모 클래스와 자식 클래스의 관계를 상위(super) 클래스와 하위(sub) 클래스라고 표현하기도 한다. 또한 기초 클래스(base class), 유도 클래스(derived class)라고도 부른다

Animal이란 공통성격을 만들어 Cat, Mouse, Duck등 상속 관계

ㅁ 생성자 

     기본생성자, 즉 매개변수가 없으면 start 

 

ㅁ Overriding

   상속은 상위 클래스의 기능을 하위 클래스에게 물려주는 기능

 

ㅁ Overloading

   이름은 같지만 시그니처는 다른 메소드를 중복으로 선언 할 수 있는 방법을 메소드 오버로딩(overloading)이라고 한다.

 

※ Overriding vs Overloding

    riding(올라탄다)을 이용해서 부모 클래스의 메소드의 동작방법을 변경하고

    loading을 이용해서 같은 이름, 다른 매개변수의 메소드들을 여러개 만들 수 있다는 사실을 아는 것이 중요

    ※ 참고로 overriding는 재정의라는 사전적인 의미

 

ㅁ abstract 

    abstract란 한국어로는 추상으로 번역된다. 이에 대한 정의는 뒤에서 내리도록 하고 지금 단계에서는 abstract라는 것이 상속을 강제하는 일종의 규제라고 생각하자. 즉 abstract 클래스나 메소드를 사용하기 위해서는 반드시 상속해서 사용하도록 강제하는 것이 abstract다. 

   - 추상 메소드는 선언만 되어 있고 구현 부분이 없는 메소드로 메서드의 결과형 앞에 abstract를 기재해서 생성

   - 추상 메소드는 반드시 하위 클래스에서 오버라이딩 되어서 구현되어야 한다.

   - 추상 메소드는 일반적인 멤버 변수와 메소드를 가질 수 있습니다.

   - 하지만 객체를 생성하지 못하여 상속을 통해서만 사용되어 집니다.

 

ㅁ polymorphism(다형성)

    다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것

    - overloging 과 다형성

    - 클래스와 다형성

    - 인터페이스와 다형성

 

ㅁ 참조

    - 복제

public class Test {

	public static void runValue() {
		int a = 1;
		int b = a;
		b = 2;
		System.out.println("runValue a " + a);
		System.out.println("runValue b " + b);
	}

	public static void main(String[] args) {
		runValue();
	}

}

   a= 1, b = 2값이다

 

   - 참조

public class Test {

	public static void runReference() {
		A a = new A(1);
		A b = a;
		b.id = 2;
		System.out.println("runReference, " + a.id);
		System.out.println("runReference, " + b.id);
	}

	public static void main(String[] args) {
		runReference();
	}
}

class A{
    public int id;
    A(int id){
        this.id = id;
    }
}

    ※ 만일 b에 담긴 인스턴스의 id 값을 2로 변경했을 뿐인데 a.id의 값도 2가 된 것이다

 

ㅁ제네릭

   제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 말이 어렵다. 아래 그림을 보자.

※ 제네릭으로 올 수 있는 데이터 타입을 특정 클래스의 자식으로 제한할 수 있다

 

ㅁ 컬렉션즈 프레임워크(Collections FrameWork) 

    배열의 불편한 점이 있었는데 그 중의 하나가 한번 정해진 배열의 크기를 변경할 수 없다는 점이다. 이러한 불편함을 컬렉션즈 프래임워크을 해결함

 그럼 이제부터 컬렉션즈 프래임워크가 무엇인가 본격적으로 알아보자. 컬렉션즈 프래임워크라는 것은 다른 말로는 컨테이너라고도 부른다. 즉 값을 담는 그릇이라는 의미이다. 그런데 그 값의 성격에 따라서 컨테이너의 성격이 조금씩 달라진다. 자바에서는 다양한 상황에서 사용할 수 있는 다양한 컨테이너를 제공하는데 이것을 컬렉션즈 프래임워크라고 부른다. ArrayList는 그중의 하나다.

위의 그림은 컬렉션즈 프래임워크의 구성을 보여준다. Collection과 Map이라는 최상위 카테고리가 있고, 그 아래에 다양한 컬렉션들이 존재한다. 그럼 구체적인 컬렉션즈 프래임워크 클래스들을 살펴보자.

 

참고 사이트 : opentutorials.org/course/1223/6088opentutorials.org/course/1223/6446

+ Recent posts