레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Java인 게시물을 표시합니다. 모든 게시물 표시

2014년 3월 11일 화요일

JAVA - 자바 문자수 구하기

           public class Pack06 {
              public static void main(String[] args) {
                 if(args.length < 1) {
                    System.err.print("문자열을 입력해주세요!");
                    System.exit(-1);
                 }
                 int numLines = 1;
                 int numWords = 1;
                 int numChars = 0;
                 String s = args[0];
                 for(int i = 0, len = s.length(); i < len; ++i) {
                    switch (s.charAt(i)) {
                       case '/':
                       ++numLines;
.
                       case ' ':
                       ++numWords;
                       break;
                       default:
                       ++numChars;
                       break;
                    }
                 }
                 System.out.println("행수: " + numLines);
                 System.out.println("단어수: " + numWords);
                 System.out.println("문자수: " + numChars);
              }
           }
           //Pack07.java
           public class Pack07 {
              public static void main(String[] args) {
                 if(args.length % 2 != 0) {
                    System.err.println("학생의 수와 점수의 수가 일치하지 않습니다!");
                    System.exit(-1);
                 }
                 int numStudents = args.length / 2;
                 String[] names = new String[numStudents];
                 int[] grades = new int[numStudents];
                 //이름과 점수를 저장 
                 for(int i = 0; i < numStudents; ++i) {
                    names[i] = args[i * 2];
                    grades[i] = Integer.parseInt(args[i * 2 + 1]);
                 }
                 printNameOrder(names, grades);
                 printScoreOrder(names, grades);

              }

              public static void printNameOrder(String[] names, int[] grades) {
                 String[] tempNames = names.clone();
                 int[] tempGrades = grades.clone();
                 for(int i = 0, len = tempNames.length ; i < len; ++i ){
                    for(int j = i + 1; j < len ; ++j ) {
                       if(tempNames[j].compareTo(tempNames[i]) < 0) {
                          String stemp = tempNames[i];
                          tempNames[i] = tempNames[j];
                          tempNames[j] = stemp;
                          int iTemp = tempGrades[i];
                          tempGrades[i] = tempGrades[j];
                          tempGrades[j] = iTemp;
                       }
                    }
                 }
                 System.out.println("-------이름순-------");
                 for(int i = 0, len = names.length; i < len; ++i) {
                    System.out.println(tempNames[i] + "\t" + tempGrades[i]);
                 }
              }
              public static void printScoreOrder(String[] names, int[] grades) {
                 String[] tempNames = names.clone();
                 int[] tempGrades = grades.clone();
                 for(int i = 0, len = tempNames.length ; i < len; ++i ){
                    for(int j = i + 1; j < len ; ++j ) {
                       if(tempGrades[j] > tempGrades[i]) {
                          String stemp = tempNames[i];
                          tempNames[i] = tempNames[j];
                          tempNames[j] = stemp;
                          int iTemp = tempGrades[i];
                          tempGrades[i] = tempGrades[j];
                          tempGrades[j] = iTemp;
                       }
                    }
                 }
                 System.out.println("-------성적-------");
                 for(int i = 0, len = names.length; i < len; ++i) {
                    System.out.println(tempNames[i] + "\t" + tempGrades[i]);
                 }
              }
           }





컴파일러 vs 인터프리터



프로그래밍이란 중앙처리장치가 어떤 일을 처리하도록 기술하는것을 말하며, 이렇게 하여 작성된 문서를 프로그램이라 한다.
작성된 프로그램은 여러가지 방식으로 해석하여 실행하게 되는데, 크게보면 두가지 방식으로 요약 된다.

1.  프로그램을 한 블럭(예:한 문장)씩 읽어서 바로 실행하는 방식이 있고,
2. 전체 프로그램을 읽어서, 번역을 한 다음 한꺼번에 빠른게 실행하는 방법이 그것 이다.

일반적으로 첫번째 방법을 인터프리터 방식이라하고 두번째 방법을 컴파일러 방식이라 한다.
인터프리터 방식은 한블럭 단위로 읽어 해석한 다음 처리하므로, 그 결과를 즉시즉시 알 수 있고, 컴파일시간이 필요 없다. 그러나 동일한 프로그램이 반복되어도 매번 번역을 해서 실행하기 때문에 프로그램 전체의 실행 시간은 컴파일러 방식보다 느린 단점을 가지고 있다. 대포젹인 것으로 예전에 많이 사용하던 베이직언어가 대표적인 인터프리트 언어이고, 현재 자바스크립트, 비주얼 베이직 스크립트, php등도 일종의 인터프리트 방식으로 동작한다고 할 수 있다.

이에 비하여 컴파일러 방식은 프로그램 전체를 기계어로 바꾼 다음  실행순서대로 재 배치하여 실행 가능한 파일로 변환한다음 실행하는 방식을 말한다. 스크립트 언어에 비하여 컴파일과 컴파일된 오브젝트 코드를 재배치하는 과정인 링크가 필요하기 때문에 인터프리터 방식에 비해서 준비 시간이 많이 필요하나, 변환된 프로그램인 실행행가능 코드를 실행하는데는 인터프리터방식에 비하여 배우 빠른 특징을 가진다.
c, cpp, c# 등이 이에 해당하는 대표적 언어라 할 수 있다.

JAVA - 정규표현식을 이용한 HTML 태그 또는 모든 태그 형식 제거

# HTML 제거

2006/12/04 15:10
HTML 태그는 < 로 시작해서 > 로 끝나고, 종료 태그의 경우는 로 끝난다. 따라서, 다음과 같은 정규 표현식은 HTML 태그를 모두 포함하게 된다.


<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>

자바 1.4부터 String.repalceAll(String regex, String replacemenet) 메소드를 제공하는데, 이 메소드는 문자열에서 regex의 정규 표현식에 일치하는 부분을 replacement로 취환해주는 기능을 제공한다.

특정 문자열에 HTML 태그를 제거하려면 위의 정규 표현식을 다음과 같이 적용하면 된다.

1
2
String text = "......";
String textWithoutTag = text.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>", "");


위 내용 출처 :  http://blog.livephoto.info/index.php?pl=115


# 모든 태그 형식 제거

'<'로 시작, '>'로 끝나는 형식

<[^>]*>


1String str = str.replaceAll("<[^>]*>", " ");

Java - 자기자신을 참조하는 this

## this 키워드
◈ 자기 자신을 직접 참조할 수 있는 참조변수이다.
◈ 클래스 내에서 자신의 멤버들을 직접 참조할 수 있다.
◈ 클래스 내에서 자기 자신을 참조할 수 있는 유일한 키워드이다.

## this 를 이용한 멤버의 접근
◈ this.멤버변수
◈ this.멤버메서드

### this ###
public class SoloThis {
    private int i = 0;
 
    public SoloThis getMySelf() {
        //this 자체를 리턴, this의 형은 클래스의 형
        return this;
    }
    public void print(int i){
        // this 가 없을경우 지역변수 print(int i)를 할당하여 결과 값이 0
        // this 를 명시적으로 넣어주었을때 멤버 변수를 할당하여 1,2,3,4 증가 값이 나옴
        this.i++;
        System.out.println("member i = " + this.i);
    }
    public static void main(String args[]) {
        SoloThis st1 = new SoloThis(); //객체생성
        System.out.println("SoloThis st1:" + st1);
        st1.print(1);
        st1.print(1);
        SoloThis st2 = st1.getMySelf(); //객체 생성
        System.out.println("SoloThis st2:" + st2);
        st2.print(1);
        st2.print(1);
    }
}


### this() ###
# 클래스의 객체를 생성했을 때 자동으로 생성자가 호출.

이렇게 생성자 내에서 또 다른 생성자를 호출하는 것이 가능합니다. 하지만 생성자를 호출할 때는 두 가지 정도의 규칙을 지켜야 합니다.

▣ this를 이용해서 생성자를 호출할 때의 규칙
◈ 반드시 생성자 내에서 다른 생성자를 호출해야 한다.
◈ 생성자에서 this를 이용한 생성자 호출은 어떠한 작업보다도 먼저 선행되어야 한다.
◈ 즉 this를 이용한 생성자 호출 앞에는 어떠한 구문도 사용할 수 없다.

생성자는 마음대로 호출할 수 있는 메서드가 아닙니다. 객체의 메모리가 생성될 때 new와 함께 호출되는 것이 생성자입니다. 예외적인 방법으로 생성자를 호출할 수 있는 방법을 this가 제공하고 있는 것입니다.

▣ this의 세 번째 기능
◈ this를 이용해서 생성자 내에서 다른 생성자를 호출할 수 있다.
◈ 생성자를 재사용할 수 있다.
◈ 생성자에서 다른 생성자를 호출할 때 생성자 호출은 제일 윗부분에 사용해야 한다.


public class CallingThis {
    private String name;
    private int age;
    public CallingThis(){
        this("이름없음");
        //this를 이용해서 CallingThis(String name)생성자 호출
        System.out.println("CallingThis() 생성자 완료");
    }
    public CallingThis(String name) {
        this(name, 12);
        //this를 이용해서 CallingThis(String name, int age) 생성자 호출
        System.out.println("CallingThis(String name) 생성자 완료");
    }
    public CallingThis(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("name:" + this.name + "  number:" + this.age);
        System.out.println("CallingThis(String name, int age) 생성자 완료");
    }
    public static void main(String[] args) {
        CallingThis c = new CallingThis();
    }
}

JAVA - 배열 복사 ArrayCopy , 객체 배열

▣ 기본 데이터 타입을 이용한 배열 클래스의 예
◈ byte[]
◈ int[]
◈ long[]
◈ float[]
◈ double[]
◈ char[]

▣ 클래스를 이용한 배열 클래스의 예
◈ String[]
◈ Image[]

기본 데이터 타입뿐만 아니라 클래스에도 브래킷([])를 붙여서 새로운 배열 데이터 타입을 만들 수 있습니다. 결론적으로 배열 데이터 타입은 브래킷([])이 붙은 새로운 형태의 클래스입니다. 배열 데이터 타입을 아예 배열 클래스라고 부르겠습니다. 배열 클래스는 new를 이용해서 객체를 생성하며, 배열의 개수를 지정하기 위해서 브래킷([]) 안에 첨자를 사용합니다.

--------------------- 배열 복사 ----------------------------------------

public class ArrayTest {
        int arr[] = new int[10];
    int[] source  = new int[]{5, 4, 6, 9, 7, 9};
    int[] target = {100, 200, 300, 400, 500, 600,700};
   
    public void arrayCopy1()
    {
        // System.arraycopy(); 를 이용한 선택 부분 복사
        // source의 2번째(0,1,2번째) 요소부터 4개가 복사
        // target에서는 3번째(0,1,2,3번째) 자리에 복사
            System.arraycopy(source, 2, target, 3, 4);
            for(int i=0; i<target.length; i++) {
                System.out.println("target["+i+"]:" + target[i]);
            }
            System.out.println();
                int[] source  = new int[]{5, 4, 6, 9, 7, 9};
                //clone()을 이용한 메모리 모두 복사
                int[] target = (int[])source.clone(); // 다운 캐스팅    
       for(int i=0; i<target.length; i++){
            System.out.println("target["+i+"] : " + target[i]);
        }
    }

        public static void main(String[] arr)
        {
                ArrayTest at = new ArrayTest();
                at.arrayCopy1();
        }
}


--------------------- 객체 배열 ----------------------------------------

public class ArrayTest {
    private String name;
    private String kind;
 
    public ArrayTest(String name, String kind) {
        this.name = name;
        this.kind = kind;
    }
    public String toString() {
        return this.kind + ":" + this.name;
    }
        public static void main(String[] arr)
        {
        //1. 객체배열의 생성
        ArrayTest[] dog = new ArrayTest[5];
        for(int i=0; i<dog.length; i++)  
        {
            System.out.println("Dog[" + i + "] : " + dog[i]);
        }
     
        //2. 객체배열의 참조변수에 메모리할당
        dog[0] = new ArrayTest("쫑쫑이","불독");
        dog[1] = new ArrayTest("워리","똥개");
        dog[2] = new ArrayTest("개똥이","진도개");
        dog[3] = new ArrayTest("발리","푸들");
        dog[4] = new ArrayTest("투덜이","잡종");      
        for(int i=0; i<dog.length; i++)
        {
                System.out.println("Dog[" + i + "] : " + dog[i]);
        }
        }
}
/*
Dog[0] : null
Dog[1] : null
Dog[2] : null
Dog[3] : null
Dog[4] : null
Dog[0] : 불독:쫑쫑이
Dog[1] : 똥개:워리
Dog[2] : 진도개:개똥이
Dog[3] : 푸들:발리
Dog[4] : 잡종:투덜이
*/